5

同じクエリで選択して更新できますか? ビューをカウントして、サイドバーのビューで上位のブログ投稿を作成しようとしています。

$sql = mysql_query("SELECT * FROM articles WHERE id='$id' LIMIT 1
                    UPDATE pages SET views=views+1 WHERE ID=$id");
4

3 に答える 3

3

基本的に、いいえ、同じクエリではSELECTできません。UPDATE唯一のオプションはSTORED PROCEDURE、データベースとのやり取りのより高度な手法である を作成することです。

于 2013-07-11T01:50:45.127 に答える
2

他の人が観察したように、関連する関数呼び出しを個別に呼び出して、複数のコマンドをデータベースに送信できます。1 回の関数呼び出しで複数のコマンドをサーバーに送信する必要があることは、(あったとしても) めったにありません。

ただし、それは可能です (そして、私がこの投稿を書いているのは、一般的にその質問に答えるためです。あなたの特定のケースでは、それは避けるべきです)。複数ステートメントを有効にすると、SQL インジェクション攻撃のリスクが高まるため、ほとんど実行しないでください (そのような攻撃を回避または軽減するために十分な代替予防策が講じられている場合にのみ)。

古いext/mysql拡張機能 (使用しているが、PHP v5.5 で廃止され、新しいコードでの使用は何年もの間強く推奨されていません) は、複数ステートメントを公式にサポートしていません。実際、ドキュメントには次のように明確に記載されています。

説明

resource mysql_query ( string $query [, resource $link_identifier = NULL ] )

mysql_query()は、指定されたに関連付けられているサーバー上の現在アクティブなデータベースに一意のクエリ (複数のクエリはサポートされていません) を送信しますlink_identifier

ただし、この制限はドライバー レベルでのみ適用され、以下に示すようにドライバーの接続フラグを設定することにより (または、PHP を再コンパイルしてデフォルトで有効にすることにより) (文書化されていない/サポートされていない) 方法でオーバーライドできます。CLIENT_MULTI_STATEMENTS

mysql_connect($host, $user, $pass, false, 65536);
mysql_select_db($db);
mysql_query("
  SELECT * FROM articles WHERE id='$id' LIMIT 1;
  UPDATE pages SET views=views+1 WHERE ID=$id;
");

このアプローチの重大な欠点は、最初のコマンドの結果にしかアクセスできないことです。後続のコマンドが結果を返す (または失敗する) 場合、そのような情報はアプリケーションで利用できなくなります。

の最新の代替品である MySQLi は、そのようなハッキングなしでマルチステートメントext/mysqlをネイティブにサポートします。より一般的なデータベース抽象化ライブラリである PDO も、状況によってはマルチステートメントをサポートできます。

于 2013-07-11T02:27:04.130 に答える