Execution time: Datenbank Timeout?

Hi,

ich habe einen SQL Befehl, welcher immer den Timeout-Fehler ausgibt:

db.php: (Dieser Code Funktioniert einbahnfrei!!)

include("_conf.php"); $con=mysqli_connect($sDB, $bDB, $pDB); mysqli_select_db($con, $dDB); $con->set_charset("utf-8");

$sql-Befehl:

SELECT * FROM `db_menu`,`db_access`,`db_online` WHERE db_menu.Pos ='mMain' AND db_access.accessItem = db_menu.Key AND db_access.accessUser = 'guest-127.0.0.1' AND db_online.onlineItem = db_access.accessKey AND db_online.onlineOn <= '2012-09-11 15:19:08 ' AND (db_online.onlineOf >= '2012-09-11 15:19:08' or db_online.onlineOf = '') ORDER BY db_menu.Sort ASC
Laut der Datenbank braucht diese, für exakt den selben Code:

Dieser Befehl ist in einer abgewandelten Funktion für eine andere Datenbank auch schon in Benutzung und geht wunderbar. Ich habe schon überprüft, ob alle Felder vorhanden sind, bzw. Schreibfehler (Alles korrekt).

In den System Errorlogs (Xampp) sind keine Fehler diesbezüglich vermerkt und in der “access”-Datei (Logfile) zeigt er den Zugriff auch Korrekt an.

Warum gibt er aus dieser Datenbank (wenn ich diese per PHP aufrufen will) einen TIMEOUT aus, obwohl keine offensichtlichen Fehler vorhanden sind.

Danke schon einmal im Vorraus für die Hilfe

PS: mysql close habe ich auch schon getestet aber die Verbindung davor wird auch wieder richtig (automatisch) geschlossen. Daran kann es nicht liegen.

Welche ist denn Zeile 3?

Sorry, vergessen.

db.php:

include("_conf.php"); $con=mysqli_connect($sDB, $bDB, $pDB); mysqli_select_db($con, $dDB); $con->set_charset("utf-8");

In der db.php Datei ist die Zeile 3 folgende:

Die Verbindung tut aber das was sie soll (bei anderen SQL-Befehlen).

Naja, die Fehlermeldung besagt ja, dass der Fehler in der Zeile auftritt.

Das Manual sagt zu der Funktion mysqli_select_db auch folgendes:

[quote]Note:

This function should only be used to change the default database for the connection. You can select the default database with 4th parameter in mysqli_connect().[/quote]

Versuch es doch mal mit mysqli_connect mit der DB als 4. Parameter.

Mfg :wink2:

Guter Tipp (habs komplett übersehen das diese Funktion eigentlich „überflüssig“ ist).

Ich habe es nun geändert. Aber das Problem bleibt noch immer das Selbe (selbe Zeile; selber Fehler „TIMEOUT“)

db.php

include("_conf.php");
$con=mysqli_connect($sDB, $bDB, $pDB, "DatenbankName"); #<-3. Zeile
$con->set_charset("utf-8");

Ich habe es gerade noch einmal überprüft also er kommt auf die Datenbank, aber schaft es nicht (siehe erster Beitrag) den SQL-Befehl umzusetzen. (Alle anderen gehen normal)

EDIT!: Jetzt spinnt er komplett :ps:
jetzt gibt er aus der Fehler ist in Zeile 2 also

include("_conf.php");

gibt „TIMEOUT“ und das ist idiotisch, da hier nur! die Verbindungsdaten aufgelistet werden ?? :ps:
_conf.php:

$sDB="localhost";//server $bDB="XXX";//benutzername $pDB="XXX";//passwort $dDB="XXX";//datenbank
und beim wiederholten laden gibt er wieder aus, das die Zeile 3 den Fehler verursacht. Warum springt der zwischen den Zeilen?

So ich glaub ich habe es gelöst das Problem.

Wenn andere auch das Problem haben… Ich schreib mal die Lösung auf:

Es lag grundsätzlich an dem SQL-Befehl:

SELECT * FROM `db_menu`,`db_access`,`db_online` WHERE db_menu.Pos ='mMain' AND db_access.accessItem = db_menu.Key AND db_access.accessUser = 'guest-127.0.0.1' AND db_online.onlineItem = db_access.accessKey AND db_online.onlineOn <= '2012-09-11 15:19:08 ' AND (db_online.onlineOf >= '2012-09-11 15:19:08' or db_online.onlineOf = '') ORDER BY db_menu.Sort ASC
Hier ist ein Datenbankübergreifender Befehl. Das heißt, es werden mehrere Tabellen angesprochen.
Daher habe ich nun die aller erste Zeile (SELECT * ) ersetzt durch:

Dadurch braucht der einen kleineren speicherraum? und kann dadurch einen schnelleren Durchlauf haben.
Hier holt er sich nur die Spalten der Tabelle “db_menu” und lässt die anderen liegen (Diese kommen nicht zur Ausgabe).

Was ich bisher nicht verstehe. Warum braucht die Abfrage länger als 30 Sekunden um insgesamt (es sind 3 Tabellen mit 2x5 Spalten und 1x 8 Spalten) 18 Spalten in den Speicher zu lesen und dazu die Zeilen auszugeben (Datensatz von insgesamt 8 Zeilen).

Mit der Änderung jetzt liest er nur die kompletten Spalten der einen Tabelle aus. Bloß egal wo ich nach schaue, informiere komme ich nicht drauf, warum er so lange braucht für 10 Spalten mehr aus 2 verschiedenen Tabellen.

Ich wäre sehr glücklich wenn das jemand wüsste.

Aber Mgier danke für die Tipps und den Hinweiß für den connect.