Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Połączenie do dwóch baz
Forum PHP.pl > Forum > Bazy danych > MySQL
Chmarus
Witam serdecznie. Mam pewien problem z połączeniem do dwóch różnych baz w jednym skrypcie. Posiadam dwie bazy mysql: 1sza jest na potrzeby portalu, a druga jest na potrzeby forum. Na portalu chciałbym wyświetlać 5 ostatnich tematów z forum, które pobieram za pomocą mysql_fetch_array właśnie z tej drugiej bazy (forum). Sam skrypt do wyciągania ostatnich tematów działa doskonale.

Problem pojawia się dopiero po zaincludowaniu pliku w skrypcie portalu (portal zbudowany przy uzyciu php/mysql/smarty) w nagłówku wywala coś takiego:
Cytat
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\portal\class\x.db.class.php on line 100


To pewnie przez to, że includuje plik, który także łączy się z kompletnie inną bazą danych.

Oto kod pliku, który includuje:

  1. <?php
  2. $connection = @mysql_connect('localhost', 'user', 'haslo') or die('Brak połączenia z serwerem MySQL.');
  3. $bazaforum = @mysql_select_db('baza', $connection) or die('Błąd wyboru bazy danych.');
  4. $result = mysql_query("SET NAMES utf8");
  5. $q = mysql_query("SELECT ibf_topics.tid, ibf_topics.title, ibf_topics.posts, ibf_topics.starter_name, ibf_topics.topic_firstpost, ibf_forums.name FROM ibf_topics LEFT JOIN ibf_forums ON ibf_topics.forum_id=ibf_forums.id ORDER BY tid DESC LIMIT 5");
  6.  
  7. while($forum = mysql_fetch_assoc($q)) {
  8. echo "<b>[".$forum['name']."]</b> <a href='http://localhost/forum/topic/".$forum['tid']."-temat/#entry".$forum['topic_firstpost']."'>".$forum['title']."</a> Autor: ".$forum['starter_name']."<br>";
  9. }
  10. ?>


Proszę o pomoc i pozdrawiam.
thek
Pytanie najważniejsze... Czy połączenie jest to samo , bo to najważniejsze. To samo połączenie, to znaczy mające tego samego hosta, usera i password.
Jeśli tak, to masz problem z głowy. Wystarczy pomiędzy zapytaniami robić mysql_select_db i zmieniać bazy.

Sytuacja się komplikuje nieco, gdy bazy są na innych hostach lub odwołujesz się do tego samego hosta ale różnymi userami. Należy bowiem wtedy przechowywać dwa identyfikatory połączeń. Robisz więc wtedy 2 lub więcej zmiennych przechowujących identyfikatory połączeń i w zalezności od tego do jakiej bazy robisz zapytanie, taki identyfikator posyłasz jako DRUGI, parametr funkcji mysql_query.
Masz wtedy więc przykładową składnię taką:
  1. $id_polaczenia01 = mysql_connect( $host01, $user01, $passw01);
  2. $id_polaczenia02 = mysql_connect( $host02, $user02, $passw02);
  3. $res01 = mysql_query($sql, $id_polaczenia01);
  4. $res02 = mysql_query($sql, $id_polaczenia02);
Pierwsze zapytanie poleci do 1 bazy, a drugie do drugiej.
Chmarus
Dzięki za szybką odpowiedź. Bazy znajdują się na tym samym serwerze, jednak niestety dane dostępowe są różne i tak już musi pozostać. Zastosowałem się do Twojej rady. Zapytania odpowiedzialne za pobranie ostatnich tematów zostały skierowane do odpowiedniego id połączenia. Jednak całego szkieletu portalu nie ruszałem gdyż jest tam po prostu za dużo różnych połączeń. Na tą chwilę kod wygląda tak:

  1. 1.
  2. <?php
  3. $connection = @mysql_connect('localhost', 'user', 'haslo') or die('Brak połączenia z serwerem MySQL.');
  4. $bazaforum = @mysql_select_db('baza', $connection) or die('Błąd wyboru bazy danych.');
  5. $result = mysql_query("SET NAMES utf8", $connection);
  6. $q = mysql_query("SELECT ibf_topics.tid, ibf_topics.title, ibf_topics.posts, ibf_topics.starter_name, ibf_topics.topic_firstpost, ibf_forums.name FROM ibf_topics LEFT JOIN ibf_forums ON ibf_topics.forum_id=ibf_forums.id ORDER BY tid DESC LIMIT 5", $connection);
  7.  
  8. while($forum = mysql_fetch_assoc($q)) {
  9. echo "<b>[".$forum['name']."]</b> <a href='http://localhost/forum/topic/".$forum['tid']."-temat/#entry".$forum['topic_firstpost']."'>".$forum['title']."</a> Autor: ".$forum['starter_name']."<br>";
  10. }
  11. ?>


I niestety w dalszym ciągu u góry wywala:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\portal\class\x.db.class.php on line 100
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\portal\class\x.db.class.php on line 100

Pomyślałem, że może pomoże zamknięcie tego połączenia zaraz po wyświetleniu tematów w ten sposób:
  1. mysql_close($connection);

Jednak błąd u góry w dalszym ciągu jest widoczny + po wyświetleniu tematów pojawił się nowy:
Cytat
Warning: mysql_close() expects parameter 1 to be resource, null given in C:\wamp\www\portal\tematy.php on line 11


Co zrobić z tym fantem?
thek
To popatrz DO CZEGO, Ci się pluje skrypt. Do tego, że to co jest rzekomo wynikiem zapytania z mysql_query nie jest prawidłowe. Lepiej zerknij sobie co tam jest. I jeśli naprawdę musisz korzystać z 2 baz z różnymi danymi dostępowymi, to niestety ale bez wydzielenia w mysql_query owego drugiego parametru będziesz miał cały czas błedy, bo skrypt nie będzie mógł rozpoznać o jakie spośród dwoch połaczeń Ci chodzi i będzie ZAWSZE bral pod uwagę ostatnie nawiazane, bo tak jest domyślnie ustawione mysql_query. Gdy brak owego identyfikatora to uważa, że trzeba to zrobić w bazie, do której id_połączenia wywołano jako ostatnie. Life is brutal.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.