簡體   English   中英

在MySQL查詢中使用PHP變量

[英]Using a PHP Variable in a MySQL Query

因此,我有以下要通過PHP腳本執行的MySQL查詢:

for($y=0;$y<$usercount;$y++){
  $findweight = "replace into weight (user_id, column1) 
    select user_id,
    0.4*column1_a+0.6*column1_bon as calc1
    from history_summary where user_id=$y";

  if (mysqli_query($link, $findweight)) {
    echo "success <br>";
  } else {
    echo "Error: " . $sql . "<br>" . mysqli_error($link);
  }
}

但是無論如何,每次我執行腳本都無法正常工作。 每次執行腳本時,都會輸出“成功”文本,這意味着MySQL查詢應該已經成功執行,但是當我檢查數據庫時,似乎什么都沒有改變。 但是,當我直接運行查詢時,如下所示:

replace into weight (user_id, column1) 
select user_id,
0.4*column1_a+0.6*column1_bon as calc1
from history_summary where user_id=1

它工作正常。 我假設問題是變量$ y無法正確傳遞給查詢,但是我不太確定。 我已經嘗試過該網站上發布的其他解決方案,但似乎都沒有用。 如果有人可以幫忙,那就太好了!

我的數據庫部分在哭,因為您實際上應該提交一個查詢而不是多個查詢。 具體來說,如果$ y是一個安全變量,則應具有以下內容:

$ sql =“替換為權重(user_id,column1),從history_summary中選擇user_id,0.4 * column1_a + 0.6 * column1_bon作為calc1,其中user_id <$ y”;

我還有其他問題,例如,如果您確實要REPLACE或要UPDATE但這又是一個問題。

但是,您的問題更多是關於調試,並且似乎命令已成功執行。 嘗試對$ y的許多不同值運行查詢。 也許您遇到過極端情況

問題是關於調試的,所以我會回應,但是我在下面的@mankowitz點上加倍了。

調試

  • 您可以訪問數據庫服務器嗎? 您可以在服務器上觀看查詢日志以確認它已收到您認為代碼正在發送的內容嗎?

  • 嘗試使用println樣式調試的舊備用庫,並在發送之前回顯SQL字符串。 <pre>---幫助確保您能夠查看SQL字符串中可能包含的所有多余字符:

     ... echo "About to send SQL: <pre>--- $findweight ---</pre>\\n" if (mysqli_query($link, $findweight)) { ... 
  • 此代碼是否包裝在腳本結束時未(自動)提交的SQL事務中?

  • 其他也許更簡單的查詢有效嗎? 您是否嘗試過簡單的SELECT 1並回顯結果?

  • 考慮到問題的上下文,更加神秘和不可能:服務器上禁用了fsync嗎? 如果是這樣,則每個mysql_query都不能保證數據庫實際上已將內容寫入磁盤,並且您最終可能看到行已更新。

  • 什么 mysqli_query返回? 除了檢查結果是否為假,該代碼當前忽略結果。 存儲結果並進行內省。

  • mysqli_query一個mysqli_query案例。 十多年前,我遇到了這樣的情況:盡管查詢失敗,但mysql_query (注意缺少i )仍不會返回FALSE。 這是一個奇怪的情況,所連接的用戶無權操作或查看有問題的行,突出顯示了mysql_query的錯誤以及我的連接字符串。

數據庫交互

謹慎對待數據庫查詢,最大程度地減少通信,並盡可能使用批量操作。 結構化的代碼可以通過兩種方式重寫,這兩種方式都只需要對數據庫的一次調用:

  • 使用WHERE-IN構造可以非常精確地確定要處理的行:

     $ids = []; for ( $y = 0; $y < $usercount; ++$y ) $ids[] = $y; $ids = implode(',', $ids); $findweight = "REPLACE INTO weight (user_id, column1) SELECT user_id, 0.4*column1_a + 0.6*column1_bon FROM history_summary WHERE user_id IN ($ids)"; 
  • 或者,由於ID的代碼地址包含在連續范圍內,請按照@mankowitz的建議進行操作,從而完全不需要for for-loop

     $findweight = "REPLACE INTO weight (user_id, column1) SELECT user_id, 0.4*column1_a + 0.6*column1_bon FROM history_summary WHERE user_id BETWEEN 0 AND $usercount"; # alternate form $findweight = "REPLACE INTO weight (user_id, column1) SELECT user_id, 0.4*column1_a + 0.6*column1_bon FROM history_summary WHERE 0 <= user_id AND user_id <= $usercount"; 
  • 如果您絕對必須使用單獨的每行語句,請考慮准備好的語句,因此數據庫僅需要解析和計划一次該語句:

     $findweight = 'REPLACE INTO weight (user_id, column1) SELECT user_id, 0.4*column1_a + 0.6*column1_bon FROM history_summary WHERE user_id = ?'; if ($psth = mysqli_prepare($link, $findweight)) { $y = 0; mysqli_stmt_bind_param($psth, 'i', $y); while ( ++$y < $usercount ) { if ( mysqli_stmt_execute( $psth ) ) { echo "Successful REPLACE operation for user_id = $y<br>\\n"; } else { echo "Error in REPLACE operation for user_id = $y<br>\\n"; break; } } } 

暫無
暫無

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

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