簡體   English   中英

在同一查詢中選擇並更新

[英]Select and Update in same query

你能在同一個查詢中選擇和更新嗎? 我正在嘗試根據側邊欄的視圖計算視圖以創建頂級博客帖子。

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

不,你做不到,但做兩個查詢沒有錯。

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

此外,如果id是主鍵,則此處不必執行LIMIT 1id是唯一的,因此它始終只有一個與您的條件匹配的結果。

基本上,NO,你不能用同一個查詢SELECTUPDATE 您唯一的選擇是編寫一個STORED PROCEDURE ,這是一種更先進的數據庫交互技術。

正如其他人所觀察到的,您可以通過單獨調用相關函數調用向數據庫發送多個命令。 在單個函數調用中很少(如果有必要)向服務器提交多個命令。

但是,它可以完成(並且在我寫這篇文章的一般性中回答這個問題 - 在你的特定情況下,應該避免)。 請注意,啟用多語句會增加SQL注入攻擊的風險,因此應該很少進行(並且,只有在采取了足夠的替代預防措施來避免或減輕此類攻擊時)。

古老的ext/mysql擴展(你正在使用它,但在PHP v5.5中已被棄用,並且多年來一直強烈建議不要在新代碼中使用它)沒有官方支持多語句。 實際上, 文件明確指出:

描述

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

mysql_query()向與指定link_identifier關聯的服務器上的當前活動數據庫發送唯一查詢(不支持多個查詢)。

但是,此限制僅在驅動程序級別強制執行,並且可以通過設置驅動程序的CLIENT_MULTI_STATEMENTS連接標志(如下所示)(或者通過重新編譯PHP以默認啟用此方式) 來覆蓋 (以未記錄/不支持的方式):

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的現代替代品,本身支持多語句而沒有這樣的hackery。 PDO是一種更通用的數據庫抽象庫, 在某些情況下也可以支持多語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM