Hallo,
ich habe mir für meine Datenbank-Abfragen eine Klasse gebaut, die automatisch den Verbindungsauf- und abbau regelt,
Sql-Statements ausführt und Datenfelder für HTML aufbereitet. Klappt gut.
Sobald ich allerdings statt eines umfangreichen SELECTs eine Stored Procedure per CALL aufrufe, wird's ungemütlich.
Mit einer SP geht's noch, spätestens bei der zweiten kommen Fehler wie
'Commands out of sync; you can't run this command now' oder
'Warning: Packets out of order. Expected 1 received x'.
Gut, man muss Resultsets freigeben, das verstehe ich noch.
Das muss man beim Verwenden von SELECT-Statements zwar nicht machen, aber auch gut.
Noch komplizierter wird es bei parametrisierten Procedures.
Und leider gibt's dazu nur dürftige Erläuterungen im Netz.
(Ich erwarte jetzt auch nicht mehr, alles in einer allgemeinen Klasse abzuhandeln,
da es gerade mit Parametern deutlich komplexer werden kann.)
Hier eine praktisches Beispiel:
Ich habe eine Tabelle mit Sportvereinen und eine mit Sportarten und dazwischen
eine Kreuztabelle für die Sportarten, die in den einzelnen Vereinen angeboten werden.
(Einige Vereine bieten viele Sportarten an, die meisten nur eine und u.U. sogar keine.)
Ich habe zwei SPs, eine zum Lesen der Vereinsdaten und die zweite zum Lesen der Sportarten anhand der Vereinsnummer.
Ich stelle mir das schematisch etwa so vor:
Offensichtlich kommen die SPs der 2. Ebene sich ins Gehege.
Beim 2. execute() kommt es zu Meldungen 'Packets out of order'
oder die Ergebnisse sind schlicht falsch.
Ich habe hier schon viele Varianten ausprobiert,
z.B. bind_param innerhalb der while-Schleife,
leider alle ohne Erfolg.
Hat jemand ein wirklich funktionierendes Beispiel?
Übrigens läuft's ohne SPs, also mit SELECT-Statements, wunderbar.
Warum nicht mit SPs?
Besten Dank
Klaus
ich habe mir für meine Datenbank-Abfragen eine Klasse gebaut, die automatisch den Verbindungsauf- und abbau regelt,
Sql-Statements ausführt und Datenfelder für HTML aufbereitet. Klappt gut.
Sobald ich allerdings statt eines umfangreichen SELECTs eine Stored Procedure per CALL aufrufe, wird's ungemütlich.
Mit einer SP geht's noch, spätestens bei der zweiten kommen Fehler wie
'Commands out of sync; you can't run this command now' oder
'Warning: Packets out of order. Expected 1 received x'.
Gut, man muss Resultsets freigeben, das verstehe ich noch.
Das muss man beim Verwenden von SELECT-Statements zwar nicht machen, aber auch gut.
Noch komplizierter wird es bei parametrisierten Procedures.
Und leider gibt's dazu nur dürftige Erläuterungen im Netz.
(Ich erwarte jetzt auch nicht mehr, alles in einer allgemeinen Klasse abzuhandeln,
da es gerade mit Parametern deutlich komplexer werden kann.)
Hier eine praktisches Beispiel:
Ich habe eine Tabelle mit Sportvereinen und eine mit Sportarten und dazwischen
eine Kreuztabelle für die Sportarten, die in den einzelnen Vereinen angeboten werden.
(Einige Vereine bieten viele Sportarten an, die meisten nur eine und u.U. sogar keine.)
Ich habe zwei SPs, eine zum Lesen der Vereinsdaten und die zweite zum Lesen der Sportarten anhand der Vereinsnummer.
Ich stelle mir das schematisch etwa so vor:
PHP-Code:
// $conn1 = Verbindung zur MySQL-DB (via mysqli)
// $conn2 = 2. Verbindung - für die 2. SP (geht wohl nicht mit einer Connection)
$stmt1 = $conn1->prepare('CALL lesen_vereinsdaten');
$stmt1->execute();
$result1 = $stmt1->get_result();
$stmt2->$conn2->prepare('CALL lesen_sportarten_im_verein(?)');
$stmt2->bind_param('i', $nr_verein);
while ($data1 = $result1->fetch_row())) {
$nr_verein = $data1[0];
....
$stmt2->execute();
$result2 = $stmt2->get_result();
while ($data2 = $result2->fetch_row()) {
$sportart = $data[0];
...
}
$stmt2->free_result();
}
Beim 2. execute() kommt es zu Meldungen 'Packets out of order'
oder die Ergebnisse sind schlicht falsch.
Ich habe hier schon viele Varianten ausprobiert,
z.B. bind_param innerhalb der while-Schleife,
leider alle ohne Erfolg.
Hat jemand ein wirklich funktionierendes Beispiel?
Übrigens läuft's ohne SPs, also mit SELECT-Statements, wunderbar.
Warum nicht mit SPs?
Besten Dank
Klaus
Kommentar