2015-02-24 34 views
0

問題準備語句失敗的時候,我改變數據庫

所以今天早上我碰到了奇怪的東西時,我正在更新我的數據庫。我在我的數據庫中執行了排序規則更改,將其從latin1更改爲uft8。但是,我的查詢突然在我的桌子上失敗。經過一些調試,(甚至重建表的原始設置,但沒有這樣的效果),並收到500內部錯誤,我意識到它必須與prepared statement,所以我撕掉它,並用一個常規mysqli_query取代它,它令人驚訝地工作。所以現在我想知道,我準備好的聲明是否一直是錯誤的,或者是因爲數據庫發生了變化而失敗。

設置

這是當前表設置。我改回了拉丁(和它的InnoDB的),但它並沒有給我的結果後,我想,當我改變了一切回到原來的設置(這是它的現在)

database setup

代碼

原代碼是這樣的,它

require_once '../db/dbControl.php'; 

    $id = mysqli_real_escape_string($con,$_GET["id"]); 
    $sql = "SELECT * 
      FROM project 
      WHERE project.ProjectId = ? ";  
    $stmt1 = mysqli_prepare($con, $sql); 
    mysqli_stmt_bind_param($stmt1,'i',$id); 
    mysqli_stmt_execute($stmt1); 
    mysqli_stmt_bind_result($stmt1,$ProjectId,$ProjectTitel,$ProjectOmschrijving, $ProjectOmschrijving,$ProjectDatum,$ProjectClient,$ProjectUrl); 
    while (mysqli_stmt_fetch($stmt1)){ 

    the code itself of the page 

    } 

所以現在我只是使用普通的mysqli_query,以使其正常工作的工作,直到變化

require_once '../db/dbControl.php'; 

id = mysqli_real_escape_string($con,$_GET["id"]); 
$sql = "SELECT * 
     FROM project 
     WHERE project.ProjectId = '". $id ."'"; 
$result = mysqli_query($con,$sql); 
while($rows=mysqli_fetch_array($result)){ 
    $ProjectId = $rows['ProjectId']; 
    $ProjectTitel = $rows['ProjectTitel']; 
    $ProjectExpertise = $rows['ProjectExpertise']; 
    $ProjectOmschrijving = $rows['ProjectOmschrijving']; 
    $ProjectDatum = $rows['ProjectDatum']; 
    $ProjectClient = $rows['ProjectClient']; 
    $ProjectUrl = $rows['ProjectUrl']; 

    the code itself of the page 

    } 

我糊塗一點點(也許我忽略了一些東西在這裏因爲要專注於代碼一點點),但它只是發生在項目表。我對照涉及讀數的代碼對其進行了檢查,並且他們在準備好的語句中都可以正常工作。

希望有人能發現什麼,我不能

+2

閱讀日誌,當你得到500錯誤。如果不知道錯誤,沒有人能告訴你什麼是錯的。 – 2015-02-24 14:01:03

+0

查詢失敗後,嘗試回顯'mysqli_error()'。 – ToBe 2015-02-24 14:03:14

+2

這是一個很長的過程,但我認爲這是原因:mysqli準備聲明並且MySQL緩存該聲明並返回句柄。接下來發生的事情是,你重新創建表和MySQL **丟失了它的句柄,這導致整個事物引用沒有表。這也是爲什麼常規查詢正在工作並且聲明不是。從技術上講,你應該重新連接你的代碼(檢查你是否使用了持久連接)並告訴MySQL刪除緩存並在表被修改後重新準備語句。 – 2015-02-24 14:04:55

回答

0

不會能告訴你發生了什麼,但這裏有兩個想法的。

準備好的語句執行包括兩個階段:prepare和 execute。在準備階段,將聲明模板發送到數據庫服務器 。服務器執行語法檢查並初始化服務器內部資源供以後使用。

準備好的語句可以重複執行。在每次執行 時,綁定變量的當前值將被評估併發送到 服務器。該語句不再被解析。聲明模板 未再次傳輸到服務器。

也許這就是發生了什麼事情,可能是因爲準備好的語句在更改爲utf8後從未重置。

每個準備好的語句佔用服務器資源。使用後應立即關閉聲明。如果沒有明確地完成,當語句句柄被PHP釋放時,該語句將被關閉。

使用準備好的語句並不總是執行語句的最有效的方式 。準備好的語句只執行一次導致 更多的客戶端服務器往返比非準備語句。這是 爲什麼SELECT不作爲上面的預處理語句運行。

服務器內存是否已滿?

Tekst來自: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

+0

我可以告訴你內存不足,因爲除了那些涉及此表的內容以及僅在某些點上的內容外,其他所有查詢都能正常工作。例如,我可以改變這個表中的變量的編輯頁面也不起作用,但是我預先讀取它們的頁面確實是這樣。它的bizare。 – Dorvalla 2015-02-24 14:29:35

+0

請參閱N.B.的評論。 – 2015-02-24 14:47:16