2013-01-18 31 views
0

我正在準備的語句PHPMySQLi輕微問題。我的代碼需要POST數據,準備一個語句,然後將POST數據綁定到查詢。在這之後,它執行,似乎沒有錯誤,但由於沒有發生數據庫更改,因此聲明顯然無法正確執行。

我的問題的簡要概述:

  1. 我使用的MySQLi和預準備語句。
  2. 我已經更新了一些以前的PHP/MySQLi代碼,這些代碼並未使用預準備語句。
  3. 自更新以來,出現了問題$query->execute()

代碼:

if($query = $this->mysqli->prepare("UPDATE article SET copy = ?, title = ?, alias = ?, description = ?, category = ?, category_id = ?, author = ?, permission = ?, mode = ?, comments = ?, revised = ?, frequency = ?, priority = ? WHERE id = ?")) 
{ 
    if 
    (
     $query->bind_param 
     (
      "sssssdsssssssd", 
      $_POST['edit_article'], 
      $_POST['edit_title'], 
      $_POST['edit_alias'], 
      $_POST['edit_description'], 
      $_POST['edit_category'], 
      $result['id'], 
      $_POST['edit_author'], 
      $_POST['edit_permission'], 
      $_POST['edit_mode'], 
      $_POST['edit_comments'], 
      $date_time, 
      $_POST['edit_frequency'], 
      $_POST['edit_priority'], 
      $id 
     ) 
    ) 
    {     
     if($query->execute()) 
     { 
      echo $this->mysqli->error; // does nothing. 

      // These statements print to the screen successfully with the correct values. 
      echo $_POST['edit_frequency'] . "<br />"; 
      echo $_POST['edit_priority'] . "<br />"; 
      //$_SESSION['article_edited'] = true; 
      // die; 
      //exit(header("Location: " . __MANAGER__ . $_POST['edit_alias'])); 
     } 
     else 
     { 
      $_SESSION['article_edited'] = false; 

      exit(header("Location: " . __MANAGER__ . $_POST['edit_alias'])); 
     } 
    } 
} 
else 
{ 
    $_SESSION['article_edited'] = false; 

    exit(header("Location: " . __MANAGER__ . $_POST['edit_alias'])); 
} 

可能有人或許可以解釋一個更好的方法來調試代碼?這對我來說沒有任何意義,因爲我檢查​​函數是否與if($query->execute())一起工作,並且它是成功的。當然,假設問題不在於執行功能,而是在其他地方。這個問題不能是POST數據,因爲它證實了以下幾點:

if 
(
    $_POST['foo'] && isset($_POST['foo']) && 
    $_POST['bar'] && isset($_POST['bar']) 
) 
{ 
    // Statements. 
} 

我很無言。

EDIT

我想指出我回聲2 particluar POST的值瓦爾因爲這些是更新所述代碼時,我加入的那些。它從此停止工作。另請注意,我已使用print_r($_POST),並且所有POST變量都已設置幷包含值。

回答

1

問題已解決。

錯誤是,正如所料,不是由故障或錯誤的邏輯,而是一個未改變的變量$id,應該已被轉換爲$_POST['id']。對於未來的讀者來說,值得注意的是阿米特阿格拉瓦爾的答覆實際上是一個重要的答案。

請注意,SQL語句沒有出錯,只是發生了這樣的情況,因爲未設置或初始化變量$id,沒有行受到影響。因此,適當的行動當然會沿着線的東西:

if($query->execute()) 
{ 
    if($this->mysqli->affected_rows == 0) 
    { 
     // Appropriate action (such as raising an error), e.g., 
     die("No rows were affected"); 
    } 
    else 
    { 
     // Appropriate action. 
    } 
} 
else 
{ 
    die("Query could not be executed."); 
} 
1

如果在SQL級別沒有錯誤,您的更新將返回成功。請注意,找不到要更新的候選行不是SQL錯誤。這是一個邏輯錯誤/預期條件。如果未能找到要更新的行是您的代碼的錯誤條件,那麼您將需要修改錯誤檢查以包含對此的檢查。

if($query->execute()) 
{ 
    if($mysqli->affected_rows == 0) 
     // some logical error 
+0

當然'affected_rows'總是會返回0,但我的問題是更側重於_why_沒有行受到影響,當我可以我的代碼或數據庫結構看不到任何錯誤。我的觀點:所有行都存在,所有變量都包含值,但MySQL不會更新任何記錄。我怎樣才能更好地診斷這一點? – George88