Rupo: Zugriff auf 2 Datenbanke

Hallo Gemeinde, Ein sichtlich verzweifelter Rupo bittet nochmals um Hilfe

Zzum Problem:

Es ist an einigen Stellen notwendig,
 Operationen auf einer zweiten Datenbank vorzunehmen, wobei die
Verbindung zur Hauptdatenbank weiter aktiv sein muss.

zu diesem zweck hab ich ein Paar Konstanten definiert: constants.php
<?
 /**
 *
 * Constants.php
 *
 **/
 define("host", "localhost");
 define("user", "root");
 define("pass", "");
 define("name", "shop");

define("host2", "localhost"); // nur zu Testzwecken auf localhost, später extern
 define("user2", "root");
 define("pass2", "");
 define("name2", "extern");

die Verbindung zur Datenbank geschieht über: cms_functions.php
/**
 * functions.php
 *
 * beinhaltet die Grundfunktionen des Session-Mangements insbes. Datenbankverbindung
 *
 */
error_reporting (E_ALL);
ini_set('display_errors', TRUE);

class dbconn
  {
  var $connect=false;

/* dbconn - The Class-Construktor */

function dbconn($host,$user,$pass,$name)
    {
    $this->name=$name;
    $this->connect=mysql_connect($host, $user, $pass) or die(mysql_error());
    mysql_select_db($name, $this->connect) or die(mysql_error());

}

/* liefert Datenbank Query */

function query($query) { return mysql_query($query,$this->connect); }
  }

;
$db1= new dbconn(host,user,pass,name);

Und die datenbank-Funktionen liegen in: db_functions.php
/**
 * dbfunctions.php
 *
 */

error_reporting (E_ALL);
ini_set('display_errors', TRUE);
class functions
    {
    var $connect;
    var $db1;
    var $xtpl;

/* Prozedur, um die Navigationsleiste im Top-Contentbereich zu aus der Datenbank zu generieren*/
    function showkats($tpl)
        {
        global $db1, $xtpl, $lang;

$sql="SELECT * FROM " . tbl_catalog . " where cat_parent_id='0' order by cat_description";
        $result=$db1->query($sql);
        $hlp="0";
        if(isset($_GET['katPath'])) $hlp=$_GET['katPath'];

// notwendig, um das Highlighting im Deadlink-Modus zu steuern
        if (empty($_GET["katPath"])&& isset($_GET['productID']))
            {

$hlp=$this->getKatPath($_GET["productID"]);

$hlp=substr(str_replace("-", "_", $hlp), 3, (strlen($hlp) - 4));
            }

$array =explode("_", $hlp);
        $kat   =$array[0];
        if(!empty($array[1])) $subkat=$array[1];

while ($data=mysql_fetch_array($result))
            {
            $xtpl->assign('id', $data["cat_id"]);

// markiert die momentan gewählte Rubrik
            if ($kat == "" . $data["cat_id"] . "")
                $xtpl->assign('active', 'class="active"');
            else
                $xtpl->assign('active', '');

$xtpl->assign('katname', $lang["" . $data["cat_description"] . ""]);
            $xtpl->parse('' . $tpl . '.list');
            }
        }
}

soweit so gut, funktioniert auch wunderbar.

Wenn ich nun eine zweite Instanz hinzufüge in cms_funktions.php

$db1= new dbconn(host,user,pass,name);
$db2= new dbconn(host2,user2,pass2,name2);

liefern mir die Datenbank funktionen allesamt Fehlermeldung, dass
supplied argument is not a valid result ressource. Für mich ein klares Anzeichen, das die Verbindung zur DB1 nicht mehr aktiv ist.

What's going wrong?

mfG
Timo Trallala

  1. ohne mir den code jetzt ganz genau angeschaut zu haben aber du solltest mit resource Verbindungs-Kennungen arbeiten

    resource mysql_db_query ( string Datenbank, string Anfrage [, resource Verbindungs-Kennung] )

  2. Moin!

    Vielleicht gewinnst Du die Übersicht wieder, wenn Du auf das hier völlig unnötige OO-Gedöns verzichtest.

    Bau die Datenbankverbindung >>einfach<< auf, verwende optimal Dateinamen, die sicher stellen, dass wenn der Server mal falsch konfiguriert wird, die Zugangsdaten zum DBMS nicht gleich sichtbar werden (genau das ist mir mal passiert, als der Provider an der Konfiguration herumspielte und PHP-Dateien ungeparst als Text-Dateien gesendet wurden), beim Apache (Standardkonfiguration) also Dateinamen, die mit '.ht' beginnen:

    Datei .ht_db1_open

    $DB1=mysql_connect('host1', 'user1', 'pass1') or die "Die Verbindung zum Datenbankserver konnte nicht aufgebaut werden.";
    $dummy=mysql_query('use databasename1',$DB1) or die ("Der Datenbankserver verweigert die Benutzung von databasename1.<hr>".mysql_error($DB1));

    Datei .ht_db2_open

    $DB2=mysql_connect('host2', 'user2', 'pass2') or die "Die Verbindung zum Datenbankserver konnte nicht aufgebaut werden.";
    $dummy=mysql_query('use databasename2',$DB2) or die ("Der Datenbankserver verweigert die Benutzung von databasename2.<hr>".mysql_error($DB2));

    Einbinden mit
    include_once '.ht_db1_open';
    include_once '.ht_db2_open';

    Vorteil: Performant und sicher....

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  3. echo $begrüßung;

    [...]

    soweit so gut, funktioniert auch wunderbar.
    Wenn ich nun eine zweite Instanz hinzufüge in cms_funktions.php
    liefern mir die Datenbank funktionen allesamt Fehlermeldung, dass
    supplied argument is not a valid result ressource. Für mich ein klares Anzeichen, das die Verbindung zur DB1 nicht mehr aktiv ist.

    Nein, das ist ein klares Anzeichen, dass das "nur" ein Folgefehler ist. Deine Datenbankabstraktionsklasse sollte auf die Rückgabewerte der mysql_*-Funktionen eingehen - besonders wenn ein false zurückgegeben wird - und dann den aufgetretenen Fehler mit mysql_error() abfragen.
    Die Beispiel-Abfrage im PHP-Handbuch-Kapitel zu MySQL zeigt dir die Stellen, an denen eine solche Auswertung sinnvoll und empfehlenswert ist.

    Ohne die mysql_error()-Ausgabe ist es müßig, zu spekulieren, was die Ursache für das Fehlverhalten ist.

    echo "$verabschiedung $name";