PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verstaendnisproblem - Eigene Datenbankfunktion



Jorval
14-07-2005, 11:36
Hallo zusammen,

Ich weiss es gibt eine vielzahl von fertigen Klassen und Funktionen zum Zugriff auf Datenbanken. Aber um das entsprechend Nachvollziehen zu können möchte ich diese Erfahrung lieber selber machen :-) also bitte keine "Benutz doch Klasse xyz oder ..." Antworten. Danke

Ich wuerde mir gern eine eigene Funktion schreiben zum Zugriff auf meine mysqldatenbank. Die Verbindung klappt aus der normalen main.php auch herrvorragend nur wenn ich das Gleiche aus meiner Funktion dbquery() aufrufe scheint der Ressourc Identifier fuer den mysql_query aufruf leer zu bleiben und ich verstehe nicht warum. Hoffe jemand von euch kann mir das erklaeren.

hier der code: (die variablen fuer host,user und pass sind schon vorher invluded worden.)

ausschnitt aus main.php:


...
$sql = "SELECT feld2 FROM testdb.testtabelle WHERE feld1=".$_SESSION['feld1'];

echo "Hier der aufruf ueber die funktion:";
$res = dbquery($sql);
echo $res;

echo "<hr>";

echo "Hier der Aufruf ohne Funktion:";
$conn = mysql_connect($dbhost,$dbuser,$dbpass) OR die ('Fehler beim Verbindugsaufbau zur Datenbank!');
$query = mysql_query($sql,$conn);
echo $conn;
echo $query;
...


ausschnitt aus function.php:


function dbquery($sql)
{
$conn = mysql_connect($dbhost,$dbuser,$dbpass) OR die ('Fehler beim Verbindugsaufbau zur Datenbank!');
$query = mysql_query($sql,$conn);
echo $conn;
echo $query;
return $query;
}


Bei dem ersten direkt aus main.php bekomme ich beide Ressource idetifier angezeigt und kann auch wunderbar das ergebnis von Feld 2 korrekt mit einer while schleife auslesen.

Bei der Funktion wird anscheinend $query nichts zugewiesen. ???

Danke im vorraus fuer Eure Hilfe
j:

co_negol
15-07-2005, 09:09
Hola,
übergibst Du Deiner Funktion bitte noch "$dbhost,$dbuser,$dbpass",
sonst kann kein Connect entstehen.

Beispiel:
function dbquery($sql,$dbhost,$dbuser,$dbpass)
{
$conn = mysql_connect($dbhost,$dbuser,$dbpass)
### jetzt wird mit db connectet

grüße
alex

undefined
15-07-2005, 13:49
Oder deine Variablen innerhalb der Funktion Globalisieren.
PS: Wo ist die Datenbank ?


function dbquery($sql)
{
global $dbhost,$dbuser,$dbpass,$database;

if ( ! is_string( $sql ) )
return false;

$c = mysql_connect($dbhost,$dbuser,$dbpass) OR die ('Fehler beim Verbindugsaufbau zur Datenbank!');
$q = mysql_db_query( $database, $sql, $c );
if ( $q )
return $q;

}

Jorval
16-07-2005, 12:05
Hola :-),

erstmal danke das ihr euch meiner annehmt :-)

also zu co_negol:
die variablen sind schon vorher in der main.php included und der erste teil der funktion naemlich der mysql_connect funktioniert auch den statt der fehlermeldung bekomme ich den ressource identifier zurueck und auch auf dem sql server kann ich den connect sehen. hatte das ein bischen ungeschickt formuliert.
der zweite teil mysql_query sollte nun ja auch einen ressource identifier enthalten (sowie bei dem aufruf direkt aus der main.php!) ist aber nicht :-(

zu undefined:
die database uebergeb ich innerhalb des sqlstrings.
aber ich werd am montag mal nen zusaetzlich fehlerabfrage-schleife um den mysql_query bauen. :-) ist ne gute idee :-)

j:

co_negol
18-07-2005, 22:15
Hola Jorval,

mach mal bitte folgendes:

echo "Hier der aufruf ueber die funktion:";
#-->einschub
echo dbquery($sql);
#<--
$res = dbquery($sql);

so und dann sollte eigentlich:
"Fehler beim Verbindugsaufbau zur Datenbank"
da stehen, weil wenn Du dem mysql-connect keine
user-daten (host,user,password) gibts, dann wird die
anfrage gestartet mit sozusagen leeren parametern,
diese wird dann abgewiesen, weil kein host, kein
user und kein passwort kennt Deine db hoffentlich
nicht :)
und bitte die zugangs-variablen nicht global setzen,
einfach nur aus sicherheitsgründen

und die variablen müssen den funktionen übergeben
werden, damit sie Deiner funktion auch wirklich
bekannt sind, mach einfach mal

$foo=4711;

function zeige()
{
echo $foo;
}

die funktion wird Dir nichts ausgeben

grüße alex

Jorval
19-07-2005, 10:04
hi :-) ,

man sollte immer auf die Profis hoeren :-) !!!

ich hab die dbhost,dbuser und dbpass mal in der funktion included und schon gings.

da ich vorher fuer die connection einen Ressource Identifier bekommen habe und nicht die Fehlermeldung das keine Verbindung Hergestellt werden konnte bin ich Faelschlicherweise davon ausgegangen das der connect funktioniert hat und nur der query fehl laeuft. ich versteh zwar noch nicht ganz warum ich keine fehlermeldung und den ressource id bekommen habe aber vielleicht hat ja dafuer auch noch jemand eine erklaerung...

danke euch nochmals.
j:

undefined
19-07-2005, 13:06
Das hängt mit dem Parsen von PHP und der Funktion mysql_query zusammen. MySQL query verlangt nicht unbedingt die Resource Connect, und da liegt das Problem. PHP liest die die Scripte von oben nach unten und rechts nach links. Wenn mysql_query jetzt gelesen wird und die Resource ist aber nicht vorhanden wird PHP den Wert im Globalen Namensraum erwarten und macht weiter. Dann kommt der Parser zum SQL Statement der aber nicht Verabeitet werden kann und bricht ab. Somit wird die Fehler ausagabe verfälscht. Wenn du solche Probleme umgehen willst verwende immer vor der Abfrage eine connect abfrage oder wie in meinem Beispiel immer die Resourcen im Query mit angeben.

Jorval
20-07-2005, 07:30
ok das werde ich beherzigen. aber meine frage war jetzt eigentlich warum es keine fehlermeldung bei dem mysql_connect gibt! statt dessen bekomme ich eine RessourceID zurueckgeliefert! eigentlich sollte das ja bedeuten das der connect zur datenbank erfolgreich war.
aber erst seitdem ich die $dbhost... in der funktion (wie co_negol vorgeschlagen hat!) included habe funktioniert der connect korrekt und die abfrage liefert dann auch ein ergebnis.

etwas klarer formuliert:
Warum bekomme ich einen RessourceID obwohl die Variablen $dbhost,$dbuser und $dbpass nicht in der funktion included sind sondern in der main.php die die funktion aufruft, und warum bekomm ich keine Fehlermeldung ?

j:

co_negol
20-07-2005, 08:13
Hola Jorval,

versteh ich jetzt nicht, kann es vielleicht sein, das Du die einstellung
für fehlermeldungen verändert hast, wenn ich hier (php4) Deine funktion
ausführe, bekomm ich immer die meldung "Warning: mysql_connect():..."
selbst wenn ich diese auskommentiere wird die funktion mit die()-anweisung
beendet. Oder wie rufst Du bzw. wie wird mit der dbquery-funktion gearbeitet??

grüße alex

Jorval
20-07-2005, 10:14
hi,

also eigentlich hab ich das so aufgerufen wie oben beschrieben. in der main.php sind die Variablen (included aus der config.php!) und dann einfach der aufruf $erg = dbquery($sql);

bei mir stirbt die funktion allerdings nicht mit der fehlermeldung!!!

das ganze laeuft auf einem etwas in die Jahre gekommenen SuSE8.2 mit PHP 4.3.1 und Apache 1.3.27

ich denke es liegt dann eher an der version wenn ich spaeter zeit habe teste ich das mal auf einer aktuellen debian mit apache 2 und aktuellem php! :-)

j:

co_negol
20-07-2005, 15:22
Hola,
system hört sich doch gut an, lass mich mal schauen welche
fehlermeldung man unterdrücken kann damit Dein ergebnis
herauskommt, bis später
grüße alex

co_negol
20-07-2005, 16:06
Hola,
mal bitte in Deiner php.ini nachschauen, ob
error_reporting=E_ALL & -E_NOTICE
und
display_errors=on
nicht auskommentiert sind
grüße alex

Jorval
20-07-2005, 16:31
hi,

nein sind beide drin und nicht auskommentiert !!!

hmmm das ist mir immer noch ein raetsel. leider hab ich es heut nicht geschafft das ganze mal auf einer anderen maschine zu testen :-( vielleicht morgen. !!!

da es jetzt funktioniert ist das ganze zwar sekundaer... aber wenn ich nicht weiss warum ich keine fehlermeldung bekomme obwohl ich eine bekommen sollte kann ich nicht ruhig schlafen :-)

falls euch noch etwas dazu einfaellt immer her mit guten ratschlaegen :-)

j:

Jorval
25-07-2005, 08:01
hallo nochmal,

so ich hab das nun mit einer aktuellen debian-inst getestet.
leider ist das ergebnis das gleiche. keine fehlermeldung bei dem connect wenn die dbvariablen nicht in der funktion included sind :-(

da ich jetzt ein bisschen unter zeitdruck stehe muss eine loesung des phaenomens wohl warten.

danke euch aber sehr fuer die hilfe bei der loesung und die muehe bei der untersuchung. :-)

j:

co_negol
26-07-2005, 08:20
Hola Jorval,
kann es vielleicht sein, das Du in Deiner include-datei einen fehler hast, der nicht geprintet
wird (@)???
Mach mal bitte eine neue seite mit nur diesem inhalt:

<?php

function dbquery($sql)
{
global $dbhost,$dbuser,$dbpass,$database;

if ( ! is_string( $sql ) )
return false;

$c = mysql_connect($dbhost,$dbuser,$dbpass) OR die ('Fehler beim Verbindugsaufbau zur Datenbank!');
$q = mysql_db_query( $database, $sql, $c );
if ( $q )
return $q;

}

echo dbquery("select * from table");

?>

nur das, kein include, kein sonstiges,
dann muß eine fehlermeldung kommen.

grüße alex