Zwei MySQL-Anweisungen hintereinander
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anfrage
anweisung
backen
code
datenbank
enden
funktion
hinweis
http
manual
nutz
point
semikolon
set
starten
statement
tabelle
update
url
-
Moin!
So, ich habe mal wieder ein Problem^^ Bin auf dem Gebiet MySQL nicht so bewandert (ich kann immerhin Select, Insert into und Update, das können andere nicht von sich behaupten :D) und habe mal eine Frage: Kann ich mehrere Anweisungen in einer Abfrage durchführen?
Es handelt sich genau gesagt um zwei UPDATE-Befehle, die sich allerdings jeweils auf ne andere ID beziehen:
ID - points
1 - 63453
2 - 8343
3 - 222
4 - 9454
sql("UPDATE tabelle SET points=points+1 WHERE ID='1'");
sql("UPDATE tabelle SET points=points-1 WHERE ID='3'");
Diese beiden würde ich gerne in eine Abfrage packen, um eine Datenbank-Connection zu sparen ;)
Aber wie?
Danke schonmal :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Kann ich mehrere Anweisungen in einer Abfrage durchführen?
...einfach nacheinander schreiben in eine Abfrage durch Semikolon getrennt.
Beispiel:
$sql = "Update xyz SET x = 5 WHERE y=3;Update xyz SET x=2 WHERE y=6;" $res = mysql_query($sql); ... // achso und da du evtl. eine Funktion sql() hast, halt dort einfach beide zusammen in einem String übergeben ;-)
Grüßle
Beitrag geändert: 2.9.2008 9:06:37 von scout -
Tja hm... scheint leider nicht zu funktionieren :(
sql("UPDATE tabelle SET points=points+1 WHERE ID='3'; UPDATE tabelle SET points=points-1 WHERE ID='5';");
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; UPDATE tabelle SET points=points-1 WHERE ID='5'' at line 1
-
Hmm komisch. Dann wird wohl deine SQL-Funktion das vorher abfangen, aber MySQL ansich unterstützt das
Ok 2. Variante (je nach MySQL Version wird es unterstützt oder nicht):
Die Benutzung von Transaktionen.
Dazu vor allen Statements ein einzelnes "Begin" hinschicken und danach ein "commit" bzw. ein "rollback" falls ein Fehler auftritt. siehe http://dev.mysql.com/doc/refman/5.1/de/commit.html
Beispiel:
sql("begin"); sql("update ...."); sql("update ...."); sql("commit");
Grüßle -
Hm... also die sql-function sieht so aus:
function sql($query) { // Verbindung zur Datenbank herstellen und Datenbank auswählen $link = @mysql_connect($this->Server, $this->User, $this->Pass); @mysql_select_db($this->DBank, $link); // Anweisung an die DB senden $result = @mysql_query($query, $link); return $result; }
Genau so rufe ich sie auch auf... siehst du nen Fehler? -
Der User sucht nach wie vor nach einer Lösung für das Problem!
Mit freundlichen Grüßen
Der Push-Mod! -
Erstmal. Erstelle am anfang eine Datenbankverbindung und nutze sie konsequent. Es hat keinen Sinn jedes mal eine neue zu starten.
Zweitens. mysql_ ist veraltet. Nutze PDO oder mysqli (ich empfehle ersteres). Damit bekommst du die Möglichkeit zu prepared Statements und Transactions.
Drittens. Wenn du dann PDO / mysqli nutzt, dann solltest du wie scout sagte unbedingt transactions nutzen (muss man nicht manuell machen, zumindest PDO hat dafür Methoden), da das eine Update ohne das andere sinnlos ist. Ob man hier ein prepared Statement wirklich sinnvoll nutzen kann, wage ich zu bezweifeln. -
fatfreddy schrieb:
Moin,
laß das letzte Semikolon in der Query weg.
sql("UPDATE tabelle SET points=points+1 WHERE ID='3'; UPDATE tabelle SET points=points-1 WHERE ID='5'");
Die Funtkionsreferenz zu mysql_query sagt:
Hinweis: Die Anfrage sollte nicht mit einem Semikolon enden.
Quelle: php.net
FF
Nein, das macht keinen Unterschied.
nikic schrieb: Erstmal. Erstelle am anfang eine Datenbankverbindung und nutze sie konsequent. Es hat keinen Sinn jedes mal eine neue zu starten.
Jup, du hast recht, das hab ich auch schon geändert, der Thread ist ja schon älter ;)
Zweitens. mysql_ ist veraltet. Nutze PDO oder mysqli (ich empfehle ersteres). Damit bekommst du die Möglichkeit zu prepared Statements und Transactions.
Drittens. Wenn du dann PDO / mysqli nutzt, dann solltest du wie scout sagte unbedingt transactions nutzen (muss man nicht manuell machen, zumindest PDO hat dafür Methoden), da das eine Update ohne das andere sinnlos ist. Ob man hier ein prepared Statement wirklich sinnvoll nutzen kann, wage ich zu bezweifeln.
Hmm, okay ich wusste nicht, dass es so veraltet ist, nutze das schon länger und naja "Never change a running system"... aber werde ich jetzt mal machen :)
Ist PDO wirklich so einfach oder muss ich noch was beachten?
<?php /* Begin a transaction, turning off autocommit */ $dbh->beginTransaction(); /* Change the database schema and data */ $sth = $dbh->exec("DROP TABLE fruit"); $sth = $dbh->exec("UPDATE dessert SET name = 'hamburger'"); /* Recognize mistake and roll back changes */ $dbh->rollBack(); /* Database connection is now back in autocommit mode */ ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage