kostenloser Webspace werbefrei: lima-city


No database selected bei mehrfacher Anfrage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    Guten Tag,
    ich habe folgendes Problem:
    Ich habe eine Datei "queries.php" in dieser stehen alle meine SQL-Anfragen nach diesem Muster drin:
    function getData()
    {
          require_once("mydb.php");
          $db = new MyDb();
    
          $Data = $db->queryObjectArray("SQL ANFRAGE");
          $db->close();
          return $Data;
    }


    Die Klasse MyDb mit den nötigen Funktionen sieht wie folgt aus:
    class MyDb {
      protected $mysqli;
      protected $showerror = TRUE;   // set FALSE if you don't want to see error messages
      protected $showsql   = FALSE;  // set TRUE if you want to see all SQL queries for debugging purposes
      protected $sqlcounter = 0;     // counter for SQL commands
      protected $rowcounter = 0;     // counter for returned SELECT rows
      protected $dbtime     = 0;     // counter for time needed to execute queries
      protected $starttime;
    
      // constructor
      function __construct() {
        require_once('local_password.php');
        $this->mysqli = @new mysqli($mysqlhost, $mysqluser, $mysqlpasswd, $mysqldb);
        // testen, ob Verbindung OK
        if(mysqli_connect_errno()) {
          $this->printerror("Sorry, no connection! (" . mysqli_connect_error() . ")");
          // you might add output for HTML code to close the page
          // here (</body></html> etc.)
          $this->mysqli = FALSE;
          exit();
        }
        $this->starttime = $this->microtime_float();
      }
    function queryObjectArray($sql) {
        $this->sqlcounter++;
        $this->printsql($sql);
        $time1  = $this->microtime_float();
        $result = $this->mysqli->query($sql);
        $time2  = $this->microtime_float();
        $this->dbtime += ($time2 - $time1);
        if($result) {
          if($result->num_rows) {
            while($row = $result->fetch_object())
              $result_array[] = $row;
            $this->rowcounter += sizeof($result_array);
            return $result_array; }
          else
            return FALSE;
        } else {
          $this->printerror($this->mysqli->error);
          return FALSE;
        }
      }
    function close() {
        if($this->mysqli)
          $this->mysqli->close();
          $this->mysqli = FALSE;
      }


    In der "local_password.php" stehen die im Konstruktor verwendeten Variablen ($mysqlhost, $mysqluser, $mysqlpasswd, $mysqldb) definiert drin.

    Anmerkung: heißt im Moment local, weil ich es lokal teste.

    Wenn ich nun auf einer Seite eine solche Query durchführe, funktioniert alles ohne Probleme.

    Ich bräuchte aber auf einer Seite nun mehrere solche queries.
    Die erste Anfrage funktioniert.
    Bei allen weiteren tritt der Fehler "No database selected" auf.

    Alle queries funktionieren, solange sie alleine verwendet werden.

    Wo liegt das Problem?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. malanox schrieb:
    ... Wo liegt das Problem?
    es ist in erster linie nicht ersichtlich, warum du eine klasse deklarierst und sie in einer unflexieblen funktion instantiierst. in der funktion erzeugtes objekt $db wird in dem globalen scope nicht sichtbar sein, daher auch nicht funktionieren. hinzu kommt, dass du $db->close() ausführst. eine datenbankverbindung brauchst nur dann explizite schließen, wenn du persistent zum dbhost konnectest.
    aus den 2 ausschnitten ist es allerding nicht ganz leicht zu ermitteln, was du im restlichen code treibst. weiter ebeschreibung von dir würde hilfreich sein.
  4. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    hemiolos schrieb:
    in der funktion erzeugtes objekt $db wird in dem globalen scope nicht sichtbar sein, daher auch nicht funktionieren.

    Es sollte doch auch nicht global sichtbar sein. Deswegen instanziier ich es ja in jeder Funktion.
    Die Funktionen dienen nur dazu, damit ich mich nicht erst durch die SQL-Anfragen wühlen muss, um zu wissen was das Ergebnis ist.
    Außerdem wollte ich nicht auf jeder Seite im php script meine MyDb-klasse einbinden, sondern nur für die meistens nur eine Funktion.

    Die close()-Funktion habe ich nur dazu geschrieben, um sicherzustellen, dass nur eine Verbindung gleichzeitig zur Datenbank hergestellt wird.

    Erklär bitte genauer was du für code zusätzlich brauchst.

    Ein Aufruf sähe z.B. so aus:
    <?php
    $Data1 = getData();
    $Data2 = getData();
    ?>


    hierbei würde ich einmal die Meldung: "No database selected" erhalten. Eben für den zweiten Aufruf.
  5. malanox schrieb:
    hemiolos schrieb:
    in der funktion erzeugtes objekt $db wird in dem globalen scope nicht sichtbar sein, daher auch nicht funktionieren.

    Es sollte doch auch nicht global sichtbar sein. Deswegen instanziier ich es ja in jeder Funktion.
    Die Funktionen dienen nur dazu, damit ich mich nicht erst durch die SQL-Anfragen wühlen muss, um zu wissen was das Ergebnis ist.
    Außerdem wollte ich nicht auf jeder Seite im php script meine MyDb-klasse einbinden, sondern nur für die meistens nur eine Funktion.

    Die close()-Funktion habe ich nur dazu geschrieben, um sicherzustellen, dass nur eine Verbindung gleichzeitig zur Datenbank hergestellt wird.

    Erklär bitte genauer was du für code zusätzlich brauchst.

    Ein Aufruf sähe z.B. so aus:
    <?php
    $Data1 = getData();
    $Data2 = getData();
    ?>


    hierbei würde ich einmal die Meldung: "No database selected" erhalten. Eben für den zweiten Aufruf.
    ;) ;) nichts für ungut, aber sehr sehr dubios.

    also nach dem ich hoffe dich o. deinen code verstanden zu haben, habe ich es mir erlaubt ihn umzugestalten. so wie es unten steht hat den test auf lima und auf meinem rechner positiv absolviert. auf lima ist es allerding schon etwas gemütlich (weil die pseudodatenbank 'information_schema' gelesen wird! daher etwas geduld bis zur anzeige ;)

    sachen, die aus meiner sicht weg mussten, sind durch '#-hemi: ' auskommentiert. stadt denen - falls nötig - habe ich mir pseudo-dinge hinzugenommen, von denen ich vermute, dass sie di funktionalität deines codes nicht in eine falsche richtung beeinträchtigen.

    <?php
    /**
     *  f16.bBox/test/test.php
     */
    
    error_reporting(E_ALL | E_STRICT);
    
    class MyDb {
      protected $mysqli;
      protected $showerror  = true;  // set FALSE if you don't want to see error messages
      protected $showsql    = false; // set TRUE if you want to see all SQL queries for debugging purposes
      protected $sqlcounter = 0;     // counter for SQL commands
      protected $rowcounter = 0;     // counter for returned SELECT rows
      protected $dbtime     = 0;     // counter for time needed to execute queries
      protected $starttime;
    
      // constructor
      function __construct() {
        #-hemi: require_once('local_password.php');
        $mysqlhost   = 'mysql.lima-city.de;
        $mysqluser   = 'USERxxxxxx';
        $mysqlpasswd = '...';
        #-hemi: $this->mysqli = @new mysqli($mysqlhost, $mysqluser, $mysqlpasswd, $mysqldb);
        $this->mysqli = @new mysqli($mysqlhost, $mysqluser, $mysqlpasswd);
        // testen, ob Verbindung OK
        if(mysqli_connect_errno()) {
          $this->printerror("Sorry, no connection! (" . mysqli_connect_error() . ")");
          // you might add output for HTML code to close the page
          // here (</body></html> etc.)
          $this->mysqli = FALSE;
          exit();
        }
        #-hemi: $this->starttime = $this->microtime_float();
      }
    function queryObjectArray($sql) {
        $this->sqlcounter++;
        $this->printsql($sql);
        #-hemi: $time1  = $this->microtime_float();
        $result = $this->mysqli->query($sql);
        #-hemi: $time2  = $this->microtime_float();
        #-hemi: $this->dbtime += ($time2 - $time1);
        if($result) {
          if($result->num_rows) {
            while($row = $result->fetch_object())
              $result_array[] = $row;
            $this->rowcounter += sizeof($result_array);
            return $result_array;
          } else
            return FALSE;
        } else {
          $this->printerror($this->mysqli->error);
          return FALSE;
        }
      }
    
      function printsql($q) {;}
    
      function printerror($e) {
        exit($e);
      }
    
      function close() {
        if($this->mysqli)
          $this->mysqli->close();
        $this->mysqli = FALSE;
      }
    }
    
    
    
    
    
    /** TEST */
    $Data1 = getData1();
    $Data2 = getData2();
    $Data3 = getData3();
    
    echo '<hr /><pre>'. print_r($Data1, true);
    echo '<hr /><pre>'. print_r($Data2, true);
    exit('<hr /><pre>'. print_r($Data3, true));
    
    
    
    
    
    /** FUNCTIONS */
    function getData1() {
      #require_once("mydb.php");
      $db = new MyDb();
    
      $Data = $db->queryObjectArray("SHOW DATABASES");
      $db->close();
      return $Data;
    }
    function getData2() {
      #require_once("mydb.php");
      $db = new MyDb();
    
      $Data = $db->queryObjectArray("SHOW TABLES FROM information_schema");
      $db->close();
      return $Data;
    }
    function getData3() {
      $db = new MyDb();
    
      $Data = $db->queryObjectArray("SELECT * FROM information_schema.SCHEMATA");
      $db->close();
      return $Data;
    }
    ich glaube aber, ich würde die ganze klasse und rundherum ganz entschieden anders angehen.
  6. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    Danke dir schon mal.
    Ich weiß, dass der Code nicht wirklich sauber ist ^^
    Werde es bei Gelegenheit mal testen.
    Allerdings glaube ich, dass bei dir folgende Zeile fehlt:
    mysqli_select_db($mysqldb);

    Habe des Problem im Moment mit einer Klasse gelöst.

    Ich stell eine Verbindung zur Datenbank im Konstruktor her.
    Danach kann ich beliebige Queries (aus dieser Klasse) aufrufen.
    Und trenne dann die Verbindung am Ende jeder Seite.

    Damit verhindere ich bei mehrfachen Aufruf, die mehreren Instanzen von MyDb und somit mehrere Verbindungen zur DB.
  7. malanox schrieb:
    ... Allerdings glaube ich, dass bei dir folgende Zeile fehlt:
    mysqli_select_db($mysqldb);
    nööö!!

    eine datenbank musst du nicht selektieren/'use'-n! wie solltest du dann von gleich mehreren datenbanken gleichzeitig lesen können???? mal nachdenken ... ;)
  8. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    hemiolos schrieb:
    malanox schrieb:
    ... Allerdings glaube ich, dass bei dir folgende Zeile fehlt:
    mysqli_select_db($mysqldb);
    nööö!!

    eine datenbank musst du nicht selektieren/'use'-n! wie solltest du dann von gleich mehreren datenbanken gleichzeitig lesen können???? mal nachdenken ... ;)


    Meine Fehlermeldung war "No database selected".
    Ich habe auch nur eine DB, auf die ich zugreifen möchte.
    Aber logischerweise auf verschiedene Tabellen ;-)
  9. malanox schrieb:
    ... Meine Fehlermeldung war "No database selected".
    Ich habe auch nur eine DB, auf die ich zugreifen möchte.
    Aber logischerweise auf verschiedene Tabellen ;-)
    wie gesagt. du brauchst nicht zu selektieren. das geht so:
    SELECT ...
    FROM <database>.<table> ...
    (WHERE ... blaa)
    also kurz: vor der tabellenname und ein punkt gebe einfach den datenbanknamen an. (das ist aber geschmackssache.)

    malanox schrieb:
    ... Habe des Problem im Moment mit einer Klasse gelöst.
    eine löbliche tendenz, die bei lima von so n'paar leuten ignoriert wird ;)

    ... Und trenne dann die Verbindung am Ende jeder Seite.
    Damit verhindere ich bei mehrfachen Aufruf, die mehreren Instanzen von MyDb und somit mehrere Verbindungen zur DB.
    und genau das kannst dir sparen. trenne einfach nicht (nachlesen bei de.php.net)
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!