Problem mit Zugrif auf MySQL
DieKerstin
- php
0 dedlfix
0 dedlfix
0 DieKerstin0 DieKerstin0 dedlfix
Hallo,
ich möchte mit PHP Daten aus einer MySQL DB auslesen. Mein PHP sieht z.Z. wie folgt aus:
/***********************************************************************
* connect to database
*/
$db = @new mysqli('localhost', 'benutzername', 'pw', 'dbName');
if (mysqli_connect_errno())
{
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}else
{
echo "Verbindung aufgebaut.";
}
var_dump($db);
echo "<hr>";
/***********************************************************************/
...
function foo()
{
$sql = "SELECT bar FROM testTable WHERE foo=1";
echo "$sql<hr>";
var_dump($GLOBALS["db"]);
$result = $GLOBALS["db"]->query($sql);
echo "<hr>";
var_dump($result);
echo "<hr>";
}
"connect to database" befindet sich in einer anderen Datei die vor der Datei, in der foo() steht und aufgerufen wird, "included" wird.
Ausgegeben wird bei Aufruf von foo() folgendes:
Verbindung aufgebaut.object(mysqli)#1 (0) { }
--------------------------------------------
SELECT bar FROM testTable WHERE foo=1
--------------------------------------------
object(mysqli)#1 (0) { }
--------------------------------------------
bool(false)
Die SQL Query ist richtig, wenn ich sie mit c&p in phpmysqkadmin kopiere, gibt sie das rictige aus.
Das blöde ist, dass die ganze Sache schon mal funktioniert hat und ich jetzt trotz verzweifelter Suche nicht mehr nachvollziehen kann, was ich "versaut" habe.
Hat jemand eine Tip?
LG Kerstin
Hi!
var_dump($GLOBALS["db"]);
Ich würde das mit einem Singleton lösen statt mit einer globalen Variable.
$result = $GLOBALS["db"]->query($sql);
var_dump($result);
bool(false)
Was sagt $GLOBALS["db"]->error ?
P.S: Das Singleton sähe so aus (Variante ohne OOP):
function dbcon() {
static $instance = null;
if ($instance === null) {
$instance = new mysqli() und alles was dazugehört
}
return $instance;
}
Anwendung:
$db = dbcon(); // einmalig
$db->... // beliebig oft
P.P.S: die() ist in den meisten Fällen keine angemessene Fehlerbehandlung. Fehler treten auch im laufenden Betrieb aus. Die meist ebenfalls damit ausgegebenen Fehlermeldungstexte sind nicht für die Öffentlichkeit bestimmt.
Lo!
Hi!
Anwendung:
$db = dbcon(); // einmalig
Das heißt, aufgrund des Singletons kann man das beliebig oft aufrufen und bekommt immer ein und das selbe Objekt zurück. Es ist nur eher wenig sinnvoll, das für jeden einzelnen Methodenaufruf zu tun sondern beispielsweise nur einmal pro Datenbankabfrage kapselnder Funktion, also 1x pro foo() in deinem Beispiel.
Lo!
Danke!
Das mit dem Singelton ist sicher sinnvoll, werde ich auch versuchen.
Jetzt habe ich die Sache erst einmal in ein test.php isoliert. Die sieht jetzt so aus:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$db = @new mysqli('localhost', '***', '***', '***');
if (mysqli_connect_errno())
{
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}else
{
echo "Verbindung aufgebaut.";
}
echo "<br>";
var_dump($db);
echo "<br>";
$sql = "SELECT bar FROM testTable WHERE foo=1";
echo $sql;
$result = $db->query($sql);
echo "<br>";
var_dump($result);
?>
Ausgegeben wird:
Verbindung aufgebaut.
object(mysqli)#1 (0) { }
SELECT bar FROM testTable WHERE foo=1
bool(false)
Was bedeutet "object(mysqli)#1 (0) { }"?
LG Kerstin
Hallo,
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$db = @new mysqli('localhost', '***', '***', '***');
if (mysqli_connect_errno())
{
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}else
{
echo "Verbindung aufgebaut.";
}
$sql = 'SELECT bar FROM testTable WHERE foo=1';
$result = $db->query($sql);
if (!$result)
{
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
var_dump($db, $result);
?>
gibt folgendes aus:
Verbindung aufgebaut.
Etwas stimmte mit dem Query nicht: Can't find file: './usr?web180?1/testTable.frm' (errno: 13)
Wenn ich 'SELECT bar FROM testTable WHERE foo=1' in phpmysqladmin ausführe, funktioniert es.
Was ist denn "testTable.frm" ?
LG Kerstin
Hi!
Was bedeutet "object(mysqli)#1 (0) { }"?
Das bedeutet in deinem Fall: alles bestens (bis dahin). Es konnte ein mysqli-Objekt angelegt werden, was heißt, dass die Verbindung zum DBMS erst einmal aufgebaut werden konnte und die Anmeldedaten stimmen. Das Kontrollausgabe des mysqli-Objekts zeigt keine Eigenschaften - { } ist leer - aber das ist normal.
Etwas stimmte mit dem Query nicht: Can't find file: './usr?web180?1/testTable.frm' (errno: 13)
Wenn ich 'SELECT bar FROM testTable WHERE foo=1' in phpmysqladmin ausführe, funktioniert es.
Das ist eigenartig. Da der Fehler nicht in meiner Erfahrungssammlung vorkommt, fällt mir dazu nichts weiter ein, außer dass der Systemverwalter mal ein Auge draufwerfen sollte.
Was ist denn "testTable.frm" ?
Das ist eine der Datendateien der Tabelle testTable.
Lo!