[英]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 1
, id
是唯一的,因此它始終只有一個與您的條件匹配的結果。
基本上,NO,你不能用同一個查詢SELECT
和UPDATE
。 您唯一的選擇是編寫一個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.