mysqli] No Database selected

Moritz123

Erfahrenes Mitglied
Hallo,

ich experimentiere gerade etwas mit mysqli herum und bin schon direkt über einen merkwürdigen Fehler gestolpert.
Ich habe folgenden Code:
PHP:
$u = 'root';
	$p = '';
	$database = 'test';
	$host = 'localhost';
	
//	//global $db;
	$db = new mysqli($host, $u, $p, $database);
	$db->connect();
	if(mysqli_connect_errno() > 0){
		echo mysqli_error();
		exit;
	}
	if($db->errno){
		echo $db->errno.$db->error;
		exit;
	}
	
	$res = $db->query("SELECT * FROM poll");
	if($db->errno){
		echo $db->errno.$db->error;
	}
Dieser steigt immer nach der Abfrage mit dem Hinweis "No Database selected" aus, obwohl ich ja beim Verbindungsaufbau explizit einen Datenbanknamen ausprobiert habe.
Ich habe das ganze testweise auch mal mit der "normalen" MySQL-Bibliothek gestestet, da hat alles sauber funktioniert.

Seht ihr einen Grund für diese Fehlermeldung in obigem Code?

Vielen Dank,

Moritz
 
Hallo,

weglassen:
PHP:
 $db->connect(); 
    if(mysqli_connect_errno() > 0){ 
        echo mysqli_error(); 
        exit; 
    }

denn du verwendest ja bereits die objektorientierte Variante (Konstruktor stellt Verbindung her):
PHP:
$db = new mysqli($host, $u, $p, $database);

Grüße BN
 
D'oh. Danke dir!

Jetzt hänge ich aber schon am nächsten Problem: Ist es mit mysqli und PreparedStatements nicht möglich das Ergebnis einer Abfrage als Array zurückzuerhalten? Ich habe bisher immer nur Wege gefunden, die ein explizites Binden der Rückgabe an zu benennende Variablen zeigen (Stichwort bind_result()).

Vielen Dank!
 
Mit bind_result() bindest du das Ergebnis nur an bestimmte Variablen. Jetzt musst du diese mit einem oder mehreren Aufrufen von fetch() befüllen lassen.
 
Hallo und vielen Dank für die Antworten.
Also ich will ja eben nicht händisch alle Werte an Variablen binden, da ich das total unpraktisch finde. Ich will vielmehr im Idealfall ein assoziatives Array mit den Werten zurück erhalten.

Ein weiteres Problem: Beim Einfügen wird ja auch ähnlich bind_param verwendet, um das PreparedStatement mit Leben zu füllen. Leider ist auch das in meinen Augen sehr unflexibel, da ich nur einen einzigen bind_param-Aufruf machen kann (bitte korrigiert mich, sollte ich hier falsch liegen):
PHP:
$sql = 'INSERT INTO info (eins, zwei, drei) VALUES (?,?,?)';
$types = array('s','s','s');
$values = array('eins', 'zwei', 'drei');
$insert = $this->db->prepare($sql);
for($i = 0; $i < count($types); $i++){
     $insert->bind_param($types[$i], $values[$i]);
}
führt bei mir zu dieser Fehlermeldung:
Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement

Die Alternative die auf php.net unter http://no2.php.net/manual/en/mysqli-stmt.bind-param.php#89171 vorgeschlagen wird, funktioniert ebenfalls nicht:
PHP:
call_user_func_array(array($insert, 'bind_param'), array_merge (array($insert, implode($types)), $values));
und Fehlermeldung:
Warning: Parameter 3 to mysqli_stmt::bind_param() expected to be a reference, value given

Any ideas?
 
Nein, du musst bind_param() entsprechend deiner Platzhalter aufrufen. Das soll heißen, dass du bei einem Parameter nur einen Aufruf brauchst, bei vier Parametern viermal und bei n Parametern eben n-mal. Außerdem fiel mir ein, dass ich nie bind_result() genutzt habe, sondern mir immer ein Array ausgeben ließ. Die Frage ist nur, wie ich das immer gelöst habe.

PS: Du solltest dir mal PDO ansehen, denn damit kannst du sehr leicht den Datenbanktyp ändern und du hast definitiv eine Möglichkeit, alle Datensätze als Array abzurufen.
 
Zuletzt bearbeitet:
schau mal hier

Grüße BN
Bitte auf mein Posting achten! Es ist auch ohne das Binden möglich ein Array (Tupel) abzufragen. Und ja, PDO ist im Vergleich um Welten besser.

PHP:
$stmt->execute();
        $result = $stmt->get_result();
        while ($row = $result->fetch_array(MYSQLI_NUM))
        {
            foreach ($row as $r)
            {
                print "$r ";
            }
            print "\n";
        }

Grüße BN
 
Zurück