MySQL-Handle ungültig nach include
thecreep
- php
Hallo,
ich habe folgenden code:
include("./mainconfigs.php");
include("./content_load.php");
in der mainconfigs.php öffne ich eine Verbindung zu MySQL und speichere die Ressourcerückgabe in $MYSQL_HANDLE.
In der content_load.php möchte ich nun etwas aus der Datenbank auslesen, allerdings besteht die Ressource-Variable schon nicht mehr nach der ersten Zeile des Codes oben (getestet mit if(!$MYSQL_HANDLE) die("MySQL-Handle ungültig");) Ich weiß nich was ich falsch gemacht hab, ähnlich hatte ich es vor 2 oder 3 Jahren schon gehabt und da hat es funktioniert, kann es sein dass ich vergessen hab in der php.ini etwas zu setzen? Oder liegt mein Fehler woanders?
MfG thecreep
Hi,
include("./mainconfigs.php");
include("./content_load.php");
>
> in der mainconfigs.php öffne ich eine Verbindung zu MySQL und speichere die Ressourcerückgabe in $MYSQL\_HANDLE.
> In der content\_load.php möchte ich nun etwas aus der Datenbank auslesen, allerdings besteht die Ressource-Variable schon nicht mehr nach der ersten Zeile des Codes oben (getestet mit if(!$MYSQL\_HANDLE) die("MySQL-Handle ungültig");)
Und davor?
Was ergibt eine Kontrollausgabe
var\_dump($MYSQL\_HANDLE);
die du zwischen den zwei include-Anweisungen einfügst>
> Oder liegt mein Fehler woanders?
Vermutlich. Aber wenn du lediglich zwei Zeilen zeigst, in denen weiterer PHP-Code aus anderen Dateien, über den wir so gut wie gar nichts wissen, eingebunden wird - dann kann man dir kaum sagen, wo.
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
include("./mainconfigs.php");
var_dump($MYSQL_HANDLE);
include("./content_load.php");
mainconfigs.php:
$MYSQL_SERVER = "127.0.0.1";
$MYSQL_USER = "xxx";
$MYSQL_PASSWORD = "xxx";
$MYSQL_DATABASE = "obstruction";
$MYSQL_HANDLE = mysql_connect($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASSWORD);
if (!$MYSQL_HANDLE )
die("MySQL-Handle ungültig");
mysql_select_db($MYSQL_DATABASE, $MYSQL_HANDLE);
content_load.php:
function GetCounterGeneral()
{
$res = mysql_query("SELECT * FROM `counter`",$MYSQL_HANDLE);
return mysql_num_rows($res);
}
function GetCounterDaily()
{
$res = mysql_query("SELECT * FROM `counter` WHERE `TIMESTAMP` >=".mktime(0,0,0,date("n"),date("j"),date("Y")),$MYSQL_HANDLE);
return mysql_num_rows($res);
}
$SYSTEM_COUNTER_VALUE=GetCounterGeneral().'|'.GetCounterDaily();
var_dum($MYSQL_HANDLE) gibt schon NULL aus, also direkt nach dem include(./mainconfigs.php) zu ende ist, ist $MYSQL_HANDLE null
mfg thecreep
Hi,
include("./mainconfigs.php");
var_dump($MYSQL_HANDLE);
include("./content_load.php");
>
> mainconfigs.php:
> ~~~php
$MYSQL_SERVER = "127.0.0.1";
> $MYSQL_USER = "xxx";
> $MYSQL_PASSWORD = "xxx";
> $MYSQL_DATABASE = "obstruction";
> $MYSQL_HANDLE = mysql_connect($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASSWORD);
> if (!$MYSQL_HANDLE )
> die("MySQL-Handle ungültig");
> mysql_select_db($MYSQL_DATABASE, $MYSQL_HANDLE);
var_dum($MYSQL_HANDLE) gibt schon NULL aus, also direkt nach dem include(./mainconfigs.php) zu ende ist, ist $MYSQL_HANDLE null
Das dürfte aber nicht sein. Wenn lediglich der Verbindungsaufbau fehlgeschlagen wäre, dann müsste der Wert false lauten.
Also müsste entweder der Wert der Variablen noch mal explizit mit NULL überschrieben worden sein - oder die Variable, die du mit var_dump ausgibst, gibt es an dieser Stelle gar nicht. (Sei es lediglich auf Grund eines Vertippers, oder des Scopes.)
Hast du das error_reporting auf E_ALL (und display_errors auf on) stehen?
MfG ChrisB
Das dürfte aber nicht sein. Wenn lediglich der Verbindungsaufbau fehlgeschlagen wäre, dann müsste der Wert false lauten.
Genau das ist ja mein Problem, gibs bei php vllt eine globale Konfiguration, dass wenn die Variable erst in dem inkludierten Script auftaucht, dass die dann auch nur dort drinne gültig ist (so wie lokale Variablen bei Pascal o.ä. Sprachen)?
Wenn es trotz der Warnung funktionieren würde hätte ich kein Problem damit, aber genau dass ist halt nicht der Fall. Zu "Scopes" da weiß ich nicht was das ist, also kann ich dazu auch nix sagen :?
mfg thecreep
Moin!
include("./mainconfigs.php");
var_dump($MYSQL_HANDLE);
include("./content_load.php");
>
> mainconfigs.php:
> ~~~php
$MYSQL_SERVER = "127.0.0.1";
> $MYSQL_USER = "xxx";
> $MYSQL_PASSWORD = "xxx";
> $MYSQL_DATABASE = "obstruction";
> $MYSQL_HANDLE = mysql_connect($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASSWORD);
> if (!$MYSQL_HANDLE )
> die("MySQL-Handle ungültig");
> mysql_select_db($MYSQL_DATABASE, $MYSQL_HANDLE);
content_load.php:
function GetCounterGeneral()
{
$res = mysql_query("SELECT * FROMcounter
",$MYSQL_HANDLE);
return mysql_num_rows($res);
}
function GetCounterDaily()
{
$res = mysql_query("SELECT * FROMcounter
WHERETIMESTAMP
>=".mktime(0,0,0,date("n"),date("j"),date("Y")),$MYSQL_HANDLE);
return mysql_num_rows($res);
}
$SYSTEM_COUNTER_VALUE=GetCounterGeneral().'|'.GetCounterDaily();
Schon mal an den Scope der Variablen gedacht? Das, was du da programmiert hast, hat so, wie du es programmiert hast, noch nie funktioniert. Globale Variablen sind grundsätzlich uncool, so auch $MYSQL\_HANDLE, aber dass man sie in Funktionen nochmal explizit verfügbar machen muss, ist schon seit PHP 3 so.
Das tust du nicht.
Also verhielt sich mysql\_query vermutlich bisher so, als wäre kein zweiter Parameter angegeben gewesen. Dann wird automatisch die letzte von mysql\_connect() geöffnete Verbindung verwendet.
Jetzt aber könnte es sein, dass mysql\_query sich dran stört, dass der zweite Parameter keine ordentliche Ressource ist - ohne den Parameter würde immer noch die letzte von mysql\_connect hergestellte Verbindung genutzt.
> var\_dum($MYSQL\_HANDLE) gibt schon NULL aus, also direkt nach dem include(./mainconfigs.php) zu ende ist, ist $MYSQL\_HANDLE null
Dann schreibst du das Dumpen auch nochmal in die letzte Zeile der mainconfigs.php rein und vergleichst.
- Sven Rautenberg
Also verhielt sich mysql_query vermutlich bisher so, als wäre kein zweiter Parameter angegeben gewesen. Dann wird automatisch die letzte von mysql_connect() geöffnete Verbindung verwendet.
Hmmm so funktioniert es, aber kann ich dass auch irgendwie mit dem $MYSQL_HANDLE lösen? Wenn ja, wie? weil ich möchte auch ab und an auf andere mysql-server zugreifen, geht das?
mfg thecreep
Hi,
Hmmm so funktioniert es, aber kann ich dass auch irgendwie mit dem $MYSQL_HANDLE lösen? Wenn ja, wie? weil ich möchte auch ab und an auf andere mysql-server zugreifen, geht das?
Du kannst es natürlich als Parameter an die Funktion übergeben, in deren Gültigkeitsbereich du es brauchst.
MfG ChrisB
Hi!
Hmmm so funktioniert es, aber kann ich dass auch irgendwie mit dem $MYSQL_HANDLE lösen? Wenn ja, wie?
Mit Hilfe der OOP lassen sich solche Scope-Probleme auf eine Weise lösen, bei der keine globalen Variablen rumliegen und in Funktionen bekanntgegeben werden müssen.
Lo!
Hi!
Also verhielt sich mysql_query vermutlich bisher so, als wäre kein zweiter Parameter angegeben gewesen.
(Im Scope) nicht vorhandene Variablen evaluieren beim Lesen immer zu null. Und ein als null übergebener Parameter wird als nicht existent angesehen, weswegen:
Dann wird automatisch die letzte von mysql_connect() geöffnete Verbindung verwendet.
Jetzt aber könnte es sein, dass mysql_query sich dran stört, dass der zweite Parameter keine ordentliche Ressource ist - ohne den Parameter würde immer noch die letzte von mysql_connect hergestellte Verbindung genutzt.
Nö, denn $MYSQL_HANDLE bleibt ja gemäß seinem Code in diesem Scope uninitialisiert. mysql_query() arbeitet mit einer anderen Verbindung als sich der OP gedacht hat.
Wie so oft, hätte auch in diesem Fall ein auf E_ALL gestelltes error_reporting auf den Fehler hingewiesen.
Lo!
Also ich hab jetzt schon rausgefunden, dass die Datenbankverbindung nur dort besteht wo ich die entsprechende php-Datei (die die Verbindung herstellt) inkludiere...
Hier mal sone kleine "Hierarchie":
redirect.php
|--->mainconfigs.php
| |--> /CONFIGS/mysql.php //Hier wird die Datenbankverbindung hergestellt
|
|--->modules_register.php
| |--> /MODULES/counter.php //Hier führe ich mysql_query aus
...
Ich benutze Xampp zum entwickeln der Seite, kann es sein dass ich vergessen habe etwas zu konfigurieren? Das einzige was ich eingestellt habe ist register_globals auf On
Wenn ich in der counter.php nochmal /CONFIGS/mysql.php inkludiere dann geht alles einwandfrei, aber das muss doch auch irgendwie anders gehen dass ich es nur einmal inkludieren muss oder habe ich einen Denkfehler?
mfg thecreep
Hi,
Hier mal sone kleine "Hierarchie":
Für die interessiert sich der Interpreter, nachdem er die include-Dateien erst mal eingebunden hat, nicht mehr.
Ich benutze Xampp zum entwickeln der Seite, kann es sein dass ich vergessen habe etwas zu konfigurieren?
Ja, wie inwzischen schon mehrfach angesprochen - das error_reporting.
Das einzige was ich eingestellt habe ist register_globals auf On
Warum das, um alles in der Welt? Weisst du nicht, wie schädlich es sein kann? Du solltest deine Scripte so schreiben, dass sie ohne diese Einstellung auf on fehlerfrei arbeiten.
aber das muss doch auch irgendwie anders gehen dass ich es nur einmal inkludieren muss oder habe ich einen Denkfehler?
Offenbar; du scheinst der Struktur im Dateisystem eine Bedeutung beizumessen, die sie in diesem Falle gar nicht hat - und dafür die Bedeutung, die das Wörtchen Scope hat, vollkommen zu ignorieren.
MfG ChrisB
Hi!
Offenbar; du scheinst der Struktur im Dateisystem eine Bedeutung beizumessen, die sie in diesem Falle gar nicht hat - und dafür die Bedeutung, die das Wörtchen Scope hat, vollkommen zu ignorieren.
Genauer gesagt: Variable Scope.
Lo!
Ich habs jetzt so gemacht:
global $MYSQL_HANDLE;
$MYSQL_HANDLE = mysql_connect($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASSWORD);
mysql_select_db($MYSQL_DATABASE);
aber in der counter.php ist es immernoch NULL:
function CounterTotal()
{
global $MYSQL_HANDLE;
$res = mysql_query("SELECT * FROM `counter`", $MYSQL_HANDLE);
return mysql_num_rows($res);
}
$SYSTEM_COUNTER=CounterTotal();
Hier noch die Warnungen die ich bekomme bei error_reporting(E_ALL):
Warning: mysql_query() expects parameter 2 to be resource, null given in C:\Programme\xampp\htdocs\obstruction\MODULES\counter.php on line 6
Warning: mysql_num_rows() expects parameter 1 to be resource, null given in C:\Programme\xampp\htdocs\obstruction\MODULES\counter.php on line 7
Also sind Scopes die Bereiche in denen Variablen gültig sind oder?
cuz thecreep
Hi!
aber in der counter.php ist es immernoch NULL:
Ist es denn davor definitiv vorhanden?
Warning: mysql_query() expects parameter 2 to be resource, null given in C:\Programme\xampp\htdocs\obstruction\MODULES\counter.php on line 6
Warning: mysql_num_rows() expects parameter 1 to be resource, null given in C:\Programme\xampp\htdocs\obstruction\MODULES\counter.php on line 7
Hmm, das widerspricht [meiner Annahme von vorhin](https://forum.selfhtml.org/?t=191165&m=1274603). Da muss ich mir was aus einem anderen Zusammenhang gemerkt haben.
> Also sind Scopes die Bereiche in denen Variablen gültig sind oder?
Ja.
Lo!
Kann es sein, dass das alles nen bischen daran liegt, dass ich in php-Dateien, die ich mit include aufrufe, auch noch includes habe?
Mahlzeit thecreep,
Kann es sein, dass das alles nen bischen daran liegt, dass ich in php-Dateien, die ich mit include aufrufe, auch noch includes habe?
Das kann sein. Deshalb ist es *IMMER* sinnvoll, vollständige Problembeschreibungen mit entsprechend relevantem Quellcode zu formulieren - bei dem man als Frager tunlichst nichts weglassen sollte, was irgendwie eine Rolle spielt bzw. spielen könnte.
Aber manchmal ist es ja auch schön, sich vorzustellen, wie sich ein venezianischer Gondoliere in London fühlt ...
MfG,
EKKi
Hi!
Kann es sein, dass das alles nen bischen daran liegt, dass ich in php-Dateien, die ich mit include aufrufe, auch noch includes habe?
Die Includes sind nicht das Problem. Ein Include wirkt so, als ob der Code an der Stelle in der inkludierenden Datei stünde. Wenn Variablen nicht sichtbar sind, liegt es entweder an Tippfehlern oder am Scope, in dem sie erstellt beziehungsweise abgefragt werden sollen.
Du solltest sämtlichen Hinweisen nachgehen, die hier in den Antworten auftauchen. Sie sind teilweise recht kurz, da sie immer wieder genannt werden müssen. Sie sind hilfreich zur Fehlersuche, haben sich bewehrt, sind aber leider oftmals unbekannt. Wenn du die Hinweise nicht verstehst, dann frag nach, was es damit auf sich hat. Du kommst sonst nicht wirklich weiter und für die Antwortenden ist es motivationssenkend, wenn du sie ignorierst. Es ist also in deinem Interesse, wenn du mit der Problemlösung vorwärtskommen willst.
Das error_reporting auf E_ALL zu stellen, bewirkt, dass Zugriffe auf nicht vorhandene Variablen mit einer Notice gemeldet werden. Notice-Meldungen sind normalerweise deaktiviert. Sie sind aber sehr wichtig beim Entwickeln, weil damit Tippfehler und Scope-Probleme sichtbar werden, bevor du deren Auswirkungen bemerkst.
Lo!