[PEAR] 2 Fragen zu DB/mysql.php...

theOtherOne

Well-known member
5 November 2006
98
2
Hi,

ich hätte mal 2 Fragen zur Klasse DB/mysql.php : [alle bezogen auf PHP 4.4.4 - falls ihr das zur Beantwortung gebrauchen könnt ;) ]

1. Muss am Ende der Seite das $db->disconnect(); stehen? Was sind mögliche Konsequenzen bzgl. der Datenbankauslastung, wenn man es weg lässt?

2. Wenn ich Querys mit ::prepare / ::execute aufrufe (bzw. per ::query mit zweitem Parameter), sollten die einzusetzenden Variablen trotzdem escaped werden, oder erledigen das die Funktionen selbstständig?

Ich danke euch ;)

Gruß
 
1. Muss am Ende der Seite das $db->disconnect(); stehen? Was sind mögliche Konsequenzen bzgl. der Datenbankauslastung, wenn man es weg lässt?
Nein, es muss nicht am Ende der Ausführung stehen. Wenn nicht, wird die Verbindung nicht bei Beendigung des Scriptes getrennt sondern erst nach einem Timeout. Mögliche Konsequenz sind also zu viele offene Verbindungen zu der Datenbank und falls ein Limit gesetzt und erreicht ist die Ablehnung neuer Verbindungsversuche. Wenn es geht solltest du es also nutzen. ;)

2. Wenn ich Querys mit ::prepare / ::execute aufrufe (bzw. per ::query mit zweitem Parameter), sollten die einzusetzenden Variablen trotzdem escaped werden, oder erledigen das die Funktionen selbstständig?
Ich glaube nicht, zumindest steht nichts darüber in der Dokumentation. Aber da bin ich mir nicht sicher. (Prepare & Execute)

Gruß, Zera
 
1. das kann man weglassen wenn man will... die verbindung wird mit dem ende des scripts automatisch geschlossen. (ausser bei presistenen verbindungen)

2. also wenn die prepared queries wirklich in der datenbank ausgeführt werden und nicht durch php emuliert, brauchst du die daten nicht escapen. da die datenbank weiß wie der query aussieht. wenn das prepare/execute durch php emuliert wird müssen die daten escapte werden, da dass am ende dann ganz normale queries sind. jedoch wird dir dieses escapen mit sicherheit schon von der datenbank klasse abgenommen werden... da du wenn du auf ein datenbanksystem wechseln würdest was prepared queries unterstützt, plötzlich escape sequenzen in der datenbank hättest.
 
Ich danke euch ;) Nach genau so einem Zitat habe ich gesucht, aber im Zweifel war ich nicht vorsichtig genug beim Lesen ;)

@ZeroCCC: Da genau liegt der Knackpunkt ;) Es gibt ja nur eine ::connect()-Funktion, keine ::pconnect, wie mysql_pconnect beispielsweise. Deshalb meine Frage. Ich hab aber eben auch gelesen wie ich persistente Verbindungen herstelle (setOptions ;) ); auch den Part muss ich gestern ausgelassen haben...

Also, zusammenfassend:
- Prepare / Execute übernehmen in der DB-Klasse das Escapen automatisch, es braucht keine weiteren Optionen
- Connect braucht eine Option, um persistente Verbindungen herzustellen; standardmäßig tut es das nicht - wenn man persistente Verbindungen benötigt, sollte man sinnvollerweise das Disconnect am Ende aufstellen, weil sonst bis zum Timeout die Datenbank mit Prozessen vollläuft ;)

Richtig? Dann kann hier gerne zu ;)
Ich danke euch dreien!

Gruß
 
zu deinem 2ten punkt... falsch, wenn du eine persistente verbindung aufbaust willst du ja dass diese bestehen bleibt, also wäre hier ein disconnect quatsch. aber presistente verbindungen sollten eh mit vorsicht genossen werden... da müssen webserver und datenbankserver aufeinader abgestimmt sein, ansonsten erzielt man genau das gegenteil vom gewünschten effekt. (geschwindigkeit)
 
Okay... jetzt muss ich an dieser Stelle zugeben, ich weiß nicht wirklich, welche Vor- und Nachteile persistente Verbindungen gegenüber temporären Verbindungen haben, und wann man sie einsetzen sollte...
Kennt jemand von euch eine gute, lesenswerte Doku dazu, die diese Fälle kommentiert?

Danke schonmal auch hierfür ;)