Post by Thomas MlynarczykPost by Claus ReibensteinVersuch's mal mit PDOStatement::closeCursor().
Hatte ich schon, hat aber nicht geholfen.
Post by Claus ReibensteinPost by Thomas MlynarczykAuch will mir nach wie vor nicht einleuchten,
wieso ein Kommentar ein neues Rowset erzeugen sollte.
Steht doch oben: Weil der Kommentar als zweites Statement angesehen
wird. Hast Du selber hingeschrieben.
Und seit wann haben Kommentare einen Rückgabewert?
Sieht tatsächlich nicht so aus:
mysql> -- foo
mysql>
Muss aber nichts heissen.
Post by Thomas Mlynarczyk<Statement>; -- <Kommentar>
sollte doch wohl genau so behandelt werden wie
<Statement>
Nein, eben nicht.
Post by Thomas MlynarczykUnd selbst wenn ein Kommentar einen Rückgabewert haben sollte: Wenn ich
diesen nicht abfrage und stattdessen eine neue PDO::query mache, dann
sollte doch alles, was vom letzten Aufruf noch "übrig" ist, einfach
verworfen werden, oder?
Oder.
Post by Thomas MlynarczykPost by Claus ReibensteinPost by Thomas Mlynarczyk$pdo->query( "CREATE TABLE ...; CREATE TABLE ..." );
Auch hier hast Du zwei Statements in einer Query. Laut Doku erwartet
PDO::query() aber immer nur _ein_ Statement.
Diese Query (für sich allein) funktionierte bei meinen Tests wunderbar.
Wenn PDO::query also tatsächlich nur _ein_ Statement erwartet,
Da gibt es kein Wenn:
,-<http://php.net/manual/en/pdo.query.php>
|
| PDO::query — Executes an SQL statement, returning a result set as a
| PDOStatement object
| [...]
| PDO::query() executes an SQL statement in a single function call,
| returning the result set (if any) returned by the statement as a
| PDOStatement object.
Post by Thomas Mlynarczykhätte ich
a) entweder eine Fehlermeldung erhalten müssen, oder b) wären nicht
beide Statements brav ausgeführt worden.
Nicht unbedingt. Was MySQL aus mehreren Statements in einer Query macht,
ist PDO::query() egal, da es eben nicht für mehrere Queries in einem Aufruf
ausgelegt ist.
Post by Thomas MlynarczykPost by Claus ReibensteinPost by Thomas Mlynarczyk$pdo->query( "CREATE TABLE ..." ); // Fehlermeldung
Erst hier trat der Fehler auf. Selbst wenn die vorangehende
Multi-Statement-Query als solche illegal gewesen sein sollte (und in
diesem Fall hätte ich, wie gesagt, bereits dort eine Fehlermeldung
erwartet), so sollte doch der nächste Aufruf definitiv nicht darunter
leiden müssen!
Du gehst davon aus, dass alle Abfragen beendet sein müssen, bevor Du einen
weiteren Aufruf von PDO::query() machst, d.h. dass es sich hier in jedem
Fall um synchrone Verarbeitung handelt. Das muss aber nicht so sein, und
offensichtlich ist es hier nicht so.
Post by Thomas MlynarczykZumal es ja laut dem von meinem Namensvetter angeführten
Bug-Report unter Linux dieses Problem nicht zu geben scheint.
Es kann (muss aber nicht) mit dem MySQL-Client zu tun haben:
<http://www.php.net/manual/de/ref.pdo-mysql.php#84688>
(befindet sich nur ein Posting über Deiner Referenz)
Post by Thomas MlynarczykPost by Claus ReibensteinPost by Thomas MlynarczykEs sollte doch eigentlich egal sein, ob ich die drei CREATE-Statements
nun in einen einzigen $pdo->query()-Aufruf pferche oder nicht
Nein, ist es nicht.
In beiden Fällen bekommt der Server drei CREATE-Statements zum Ausführen
über dieselbe Verbindung in derselben Reihenfolge.
Woher willst Du das wissen?
Post by Thomas MlynarczykPost by Claus ReibensteinLies Dir mal die Doku zu PDO::query() durch. Da steht das alles drin.
Bezüglich des hier diskutierten Problems steht da nur
<zitat>
If you do not fetch all of the data in a result set before issuing your
next call to PDO::query(), your call may fail. Call
PDOStatement::closeCursor() to release the database resources associated
with the PDOStatement object before issuing your next call to
PDO::query(). </zitat>
Erstens liefert mir CREATE doch keine Ergebnismenge zurück, [...]
Doch, tut es:
mysql> CREATE DATABASE foo;
Query OK, 1 row affected (0.31 sec)
mysql> USE foo;
Database changed
mysql> CREATE TABLE bar (baz VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)
Post by Thomas Mlynarczyk[...]
Zweitens würde ich erwarten, daß beim zweiten PDO::query()-Aufruf alle
evtl. noch ausstehenden "Überbleibsel" des ersten Aufrufs implizit
entsorgt werden.
Offensichtlich ist das nicht so.
PointedEars