2012-03-29 15 views
1

どのように私はINSERTの両方を1つのクエリを実行し、それに選択し、選択の結果を読み取ることができますか? 私はそれが単一のクエリで複数のコマンドを受け入れる知っINSERTおよび単一のクエリのMySQLでSELECT

...挿入、その後、すべて1つのクエリで行われなければならないものを選択したい...しかし、私は、クエリの結果を読みたいと私は結果を読み取ることができません。

$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

[ドキュメント](http://php.net/mysql_query):_ "するmysql_query()独自のクエリを送信します(複数のクエリがサポートされていません)..." _代わりに、私はあなたが_transaction_を希望していると思います。 – Wiseguy

+0

パフォーマンスの観点からは、これで何も達成できません。 mysql_queryを2回呼び出すだけです。なぜ「すべてが1つのクエリーで行われなければならないのですか?」 –

+0

2つのクエリを単純に実行できないのはなぜですか?挿入の結果を確認することさえできますか? – kappa

答えて

1

あなたがmysqli拡張子を使用している場合、PHPで複数のステートメントを送信することが可能です、これは、古いmysql拡張の代わりに、多くの理由で使用することをお勧めします。ここにあなたの質問に基づいて、ドキュメントのmultiple statementsセクションから変形例である:ドキュメントは誰もが指摘された複数のステートメントのセキュリティリスクに放送時間を捧げてい

$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()); 
?> 

ていることに注意してください。もちろん、もう一つの理由は、第二のステートメントが最初のステートメントの影響を受けるようにすることが常に望ましいことではないということです。

3

ない可能性、およびカッパが指摘するように、あなたが2つの別々のクエリを実行する場合は、望ましい結果などをチェックすることができるでしょう、どちらかそれをやってお勧めwouldntの:私はこれをやっています。

4

すべて1つのクエリで行わなければなりません...

なぜあなたクエリですべてを行う必要?同様Wiseguyが言っ

は、私はあなたが取引と呼ばれて探しているものだと思います。

また、それはあなたのトランザクションやクエリパラメータなどのより完全なツールセットを提供しますPDOへの更新を考慮すると良いアイデア、かもしれません。

はとにかく、あなたの最初の質問に答えるために、いいえ、それは不可能です。

アップデート:ここではPDOでのトランザクションの一例です。

try 
{ 
    $pdo->beginTransaction(); 

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

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

私が好きなtry-catchを使うなら、[PDO :: ERRMODE_EXCEPTION](http://www.php.net/manual/en/pdo.setattribute.php)を設定することを忘れないでください。 )それは例外をスローするように;私はそれがデフォルトではないと思う。 [この回答](http://stackoverflow.com/a/2708247/185544)には、それに関するより多くの情報とほぼ同じ例があります。 – Wiseguy

+0

PDO :: ERRMODE_EXCEPTIONについてあなたは正しいです、私はそれについて忘れました! –

関連する問題