簡體   English   中英

PHP:使用一個查詢更新多個表行

[英]PHP: update multiple table rows with one query

有一個PHP腳本來更新表中的所有行。 在我看來,好像不希望傳遞太多數據。 直到大約兩周前,當我開始在提交時收到“連接重置”錯誤時,腳本才沒有出現任何問題。 我玩弄了一下腳本,但找不到加速它的方法。

for ($i = 1; $i <= 360; $i++) {
  $info  = mysql_real_escape_string($_POST[$i]);
  $check = mysql_real_escape_string($_POST[''.$i.'Check']);

  mysql_query("UPDATE $table SET info = '$info', status = '$check' WHERE ID = '$i'")
    or die (mysql_error());
}

我真的不知道是什么導致了錯誤。 長期沒有問題地工作了。 我知道更新很多,但我確定存在較大的腳本。 此外,腳本有時會完美運行。 當它起作用時,該腳本將在2-3秒內執行,這就是為什么我不確定該腳本實際上導致錯誤的原因。

謝謝!

編輯-我玩了,確定問題肯定是我正在運行的查詢數。 如果我將循環剪切為($i - 1; $i <= 5; $i++)則腳本每次都會正確執行,而無需復位。 我將循環回升到360,並且查詢次數越多,腳本超時的機會就越大。 我仍然找不到解決此問題的方法,請幫忙!

如果必須在一系列記錄中輸入相同的值,
然后在BETWEEN startingRecordID AND endingRecordID
可用於通過單個查詢更新多個記錄
(從而減少查詢總數)。

是否為“ ID”建立索引? 如果沒有,請在ID上創建索引並嘗試。

您可以在類似的SELECT查詢上運行EXPLAIN ,以查看發生了什么:

EXPLAIN $table WHERE ID = '1';
EXPLAIN $table WHERE ID = '360';
...

...但是這些查詢非常簡單,我不知道您會看到什么。 我會參考@jmm的建議,並檢查ID是否被索引以及它是什么數據類型。 另外,此表中有幾行? 這個數字最近改變了嗎?

最后,如果相同的查詢以前曾起作用,但現在卻引起麻煩,則還應該考慮外部更改。 服務器最近更改了嗎? 或多或少的RAM? 更改MySQL或PHP配置? 也許這種情況可能是由MySQL內存設置或PHP max執行設置引起的。

我在您的代碼中看到了一些東西,

首先在查詢中,如果$ i的數據類型是整數(如果我將其作為主鍵,則不需要),則不需要在$ i前后加上引號。

在第二個變量中

$ _POST [''。$ i.'Check']

不確定為什么在$ i前面有第一組單引號

在您的查詢中

$表

是正在變化的變量嗎? 您是否在不同的表上執行此查詢?

我會回顯查詢以查看其外觀。

$query = "UPDATE $table SET info = '$info', status = '$check' WHERE ID = '$i'";
echo $query;

多次執行同一查詢時,我總是使用mysqli- MySQL改進的擴展名和准備好的語句。 看起來像這樣。

$conn = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); //creates resource link
//create query
$query = "UPDATE table SET info = '?', status = '?' WHERE ID = ?"
// now create the statement
$stmt = $conn->prepare($query);
// check for an error when creating statement
echo $conn-error;
//now bind variables to the ?
// i for integers, s for strings, d for decimals
$stmt->bind_param('ssi', $info, $check, $i);
// checking for errors every step when testing
echo $stmt->error;

// now run the loop
for ($i = 1; $i <= 360; $i++) {
  $info  = mysql_real_escape_string($_POST[$i]);
  $check = mysql_real_escape_string($_POST[''.$i.'Check']);

  $stmt->execute();
  echo $stmt->error;
}  

這應該更快,因為不必在每個循環中都處理查詢。

暫無
暫無

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

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