2012-03-29 9 views
1

Wie kann ich eine einzige Abfrage mit einem INSERT und SELECT in ihm machen und dann die Ergebnisse der Auswahl lesen? Ich möchte einfügen und dann etwas auswählen, alles muss in einer Abfrage durchgeführt werden ...INSERT und SELECT in Einzelabfrage MySQL

Ich weiß, dass mehrere Befehle in Einzelabfrage akzeptieren ... Aber ich möchte Ergebnisse der Abfrage lesen und ich kann Ergebnisse nicht lesen. Ich tue dies:

$results=mysql_query(" 
INSERT INTO table1 (field1,field2) VALUES('aaa','bbbb') ON DUPLICATE KEY UPDATE `field1` = 'cccc', `field2`='dddddd'; 
SELECT field3 Form Table3 WHERE field3='eeeee'; 
",$connection); 

while ($rows = mysql_fetch_array($results, MYSQL_NUM)) 
echo $rows[0]; 
+3

[Docs] (http://php.net/mysql_query): _ "mysql_query() sendet eine eindeutige Abfrage (mehrere Abfragen werden nicht unterstützt) ..." _ Stattdessen denke ich, dass Sie eine _transaction_ wollen. – Wiseguy

+0

Aus Performance-Sicht werden Sie damit nichts erreichen. Rufen Sie einfach mysql_query zweimal an. Warum "alles in einer Abfrage erledigt werden muss ..."? –

+0

Warum können Sie nicht einfach 2 Abfragen durchführen? So können Sie sogar das Ergebnis des Einsatzes überprüfen? – kappa

Antwort

1

Es ist möglich, mehrere Anweisungen in PHP zu senden, wenn Sie die mysqli Erweiterung verwenden, Das ist eine gute Idee, anstatt der älteren mysql-Erweiterung aus vielen Gründen zu verwenden. Hier ist ein modifiziertes Beispiel aus dem multiple statements Teil der Dokumentation, auf der Grundlage Ihrer Frage:

$mysqli = new mysqli("example.com", "user", "password", "database"); 

$sql .= "INSERT INTO table1 (field1,field2) VALUES('aaa','bbbb') ON DUPLICATE KEY UPDATE `field1` = 'cccc', `field2`='dddddd';"; 
$sql .= "SELECT field3 Form Table3 WHERE field3='eeeee';"; 

$mysqli->multi_query($sql); 

do { 
    if ($res = $mysqli->store_result()) { 
     var_dump($res->fetch_all(MYSQLI_ASSOC)); 
     $res->free(); 
    } 
} while ($mysqli->more_results() && $mysqli->next_result()); 
?> 

Beachten Sie, dass die Dokumentation macht widmen Airtime, um Sicherheitsrisiken mehrerer Aussagen, die jeder Hinweis. Der andere Grund, natürlich, dass es nicht immer eine gute Idee ist, wenn Sie möchten, dass die zweite Aussage von der ersten Aussage betroffen ist.

3

nicht möglich und würde nicht empfehlen, es entweder zu tun, als Kappa weist darauf hin, wenn Sie zwei separate Abfragen durchführen können Sie die Ergebnisse überprüfen usw., die zu bevorzugen ist.

4

alle in einer Abfrage getan werden muss ...

Warum wollen Sie Notwendigkeit alles in eine Abfrage zu tun?

Wie Wiseguy sagte, ich denke, was Sie suchen, heißt eine Transaktion.

Auch könnte es eine gute Idee in Anbetracht der Aktualisierung auf PDO, die Ihnen ein vollständigeres Toolset wie Transaktionen und Abfrage-Parameter geben wird.

Wie auch immer, um Ihre erste Frage zu beantworten, nein ist es nicht möglich.

Aktualisierung: Hier ist ein Beispiel für eine Transaktion in PDO.

try 
{ 
    $pdo->beginTransaction(); 

    $pdo->query(' ... '); 
    $pdo->query(' ... '); 
    $pdo->query(' ... '); 

    $pdo->commit(); 
} 
catch(Exception $e) 
{ 
    $pdo->rollback(); 
    die($e->getCode() . ': ' . $e->getMessage()); 
} 
+1

Wenn Sie eine try-catch verwenden (was ich mag), vergessen Sie nicht, [PDO :: ERRMODE_EXCEPTION] (http://www.php.net/manual/en/pdo.setattribute.php) zu setzen) so dass es Ausnahmen wirft; Ich denke nicht, dass es standardmäßig funktioniert. [Diese Antwort] (http://stackoverflow.com/a/2708247/185544) hat ein fast identisches Beispiel mit mehr Informationen darüber. – Wiseguy

+0

Sie haben Recht mit PDO :: ERRMODE_EXCEPTION, ich habe das vergessen! –

Verwandte Themen