Mehrere mySQL Befehle per mysql_query()?

Also würde das Beispiel auf php.net auch nicht funktionieren? Denn dort wird danach ebenfalls eine UPDATE Anweisung gestartet.
Ja und nein.
Einen "Hacker" wird wohl kaum das Rückgabeergebins vom SELECT interessieren..... ihn interessiert nur ob sein Update geklappt hat. ;)
Um an die geupdateten Daten zu kommen, schleust er hinterher halt noch ein SELECT ein.
Dieses kann er auch gelichzeitig mit dem UPDATE machen, so lange das Update zuerst angegeben wird.
mysql_query() kann tatsächlich nur eine einzige Anfrage abarbeiten (inkl. zugehöriger Unterabfragen natürlich). So steht's ja auch im Handbuch (Hervorhebung von mir)
Glaubst Du alles was im Handbuch steht?
Ich habe es getestet.....
UPDATE.....; SELECT.....; (funktioniert anstandslos, es lässt sich aber nicht prüfen ob UPDATE funktioniert hat)
DELETE.....; SELECT.....; (funktioniert anstandslos, es lässt sich aber nicht prüfen ob DELETE funktioniert hat)
SELECT.....; UPDATE.....; (auf den Rückgabewert von SELECT lässt sich nicht zugreifen, UPDATE wird aber trotzdem ausgeführt)
SELECT.....; DELETE.....; (dito)
 
Zuletzt bearbeitet:
Hallo,

Glaubst Du alles was im Handbuch steht?
Ich habe meine Aussage nicht am Handbuch festgemacht. Der Text im Handbuch sollte nur ein weiteres Indiz sein. Mit den mit PHP mitgelieferten, offiziellen MySQL-Erweiterungen ist es nicht möglich, mehrere Anfragen mit einem einzigen [phpf]mysql_query[/phpf]-Aufruf abzuarbeiten (zumindest nicht ohne Tricks, siehe weiter unten). Das hängt direkt mit der C-API von MySQL zusammen, welche von der MySQL-Extension verwendet wird. Da steht's dann auch nochmal in aller Deutlichkeit in der Dokumentation:
http://dev.mysql.com/doc/refman/4.1/en/mysql-query.html hat gesagt.:
17.2.3.49. mysql_query()

int mysql_query(MYSQL *mysql, const char *query)

Description

Executes the SQL query pointed to by the null-terminated string query. Normally, the string must consist of a single SQL statement and you should not add a terminating semicolon (‘;’) or \g to the statement. If multiple-statement execution has been enabled, the string can contain several statements separated by semicolons. See Section 17.2.9, “C API Handling of Multiple Statement Execution”.

http://dev.mysql.com/doc/refman/4.1/en/c-api-multiple-queries.html hat gesagt.:
17.2.9. C API Handling of Multiple Statement Execution

From version 4.1, MySQL supports the execution of multiple statements specified in a single query string. To use this capability with a given connection, you must specify the CLIENT_MULTI_STATEMENTS option in the flags parameter of mysql_real_connect() when opening the connection. You can also set this for an existing connection by calling mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)

Zieht man nun zusätzlich noch den Quellcode der aktuellen Version der MySQL-Erweiterung zu Rate, wird man feststellen, dass weder CLIENT_MULTI_STATEMENTS noch MYSQL_OPTION_MULTI_STATEMENTS_ON darin auftauchen.

Allerdings kann man seit PHP 4.3.0 beim Aufruf von [phpf]mysql_connect[/phpf] die „client flags“ von Hand setzen. Diese werden dann direkt zur C-Funktion mysql_real_connect durchgereicht. Aus dem Quellcode der MySQL-API kann man dann noch rauslesen, dass CLIENT_MULTI_STATEMENTS dem Wert 65536 entspricht. Baut man nun die Verbindung mit einem Aufruf wie bspw. mysql_connect("host", "user", "pass", true, 65536); auf, dann (und nur dann) kann man auch mehrere Statements mit einem einzelnen [phpf]mysql_query[/phpf] abarbeiten lassen. Allerdings konnte ich das nur mit der aktuellen Version von PHP5 verifizieren – PHP4 liefert nachwievor die Meldung, dass ein Syntaxfehler in der SQL-Abfrage vorliege.

Grüße,
Matthias
 
Zuletzt bearbeitet:
@Matthias, wie gesagt, ich habe es (mit erfolg) getestet (MySQL 4.1.11 und PHP 5.0.4).
Bevor wir noch mehr in die Tiefen gehen, lass uns doch darauf einigen dass es u.U. möglich währe aber nicht zwingend möglich sein muss. ;)
Mit anderen Worten, wer sich mit den zur verfügung stehenden Mitteln gegen SQL-Injections schützt, braucht sich i.d.R. auch vor nichts zu fürchten (Ausnahmen wird es natürlich immer geben).
 
Ich habe es mit phpMyAdmin getestet.
Mag sein dass phpMyAdmin die Querys am Semikolon zerlegt..... aber dass können andere Scripte ja auch.
Und ob die Daten nun per POST oder per GET kommen, spielt nur noch eine untergeordnete Rolle.
Es ist also keine Frage dessen wie PHP mit mehreren Querys umgeht, sondern wie das Script damit umgeht.
MySQL kümmert sich auch einen feuchten Kehricht darum wie viele Querys auf mal kommen (kannst Du ja auf der Konsole testen).
 
Hallo,

Ich habe es mit phpMyAdmin getestet.
Mag sein dass phpMyAdmin die Querys am Semikolon zerlegt.....
Genau das macht phpMyAdmin, und deswegen kann man mit diesem Verfahren keine Schlüsse über das Verhalten von [phpf]mysql_query[/phpf] ziehen.

MySQL kümmert sich auch einen feuchten Kehricht darum wie viele Querys auf mal kommen (kannst Du ja auf der Konsole testen).
Die MySQL-Konsole hat aber wiederum nichts mit [phpf]mysql_query[/phpf] zu tun.

Grüße,
Matthias
 
Jo, ich bin auch Matthias seiner Meinung.
Ich hab das auch mal versucht und bin da hängen geblieben.

Ich habs dann halt zusammen gefasst:
PHP:
$sql[] = "SELECT.....;"
$sql[] = "UPATE.....;"
/* es können beliebig viele folgen */

foreach($sql as $query)
{
  mysql_query($query);
}

Aber ich mein wenn du als SQL injection machst, dann gehst du eben 2 mal in die selbe Lücke.

Das erste mal holst du dir eben die Daten raus die du brauchst und das nächste mal änderst du etwas mit UPDATE.
Also ich mein die Lücke schliesst sich doch nicht von allein...
 
Zurück