2014-09-10 26 views
0

我是相當新的預處理語句和我在一個過渡項目的過程中...預處理語句和更新多個行

最後一塊我不得不轉變是一塊,我要更新多行/記錄。

這似乎爲我工作......不過,我很好奇,不知道我的技術,併發送回某種響應(布爾值或其他方式)的一切是成功還是失敗。思考?註釋?建議?

function timeUpdate($uID, $galArr, $timeStamp) { 
    global $mysqli; //my connection is set elsewhere (bad/good?) 
    $q = "UPDATE someTable SET timeStamp = ? WHERE galleryID = ? AND uniID = ?"; 
    $stmt = $mysqli->prepare($q); 
    $stmt->bind_param("iii", $timeStamp, $gID, $uID); 

    foreach($galArr as $value) { 
     $gID = $value[0]; 
     if(!$stmt->execute()) { 
      throw new Exception($stmt->error, $stmt->errno); 
     } 
    } 
    $stmt->close(); 
} 

在此先感謝。任何鏈接,建議都很感激。

+0

我想你應該問如何使用IN()和預處理語句,因爲使用IN()for galleryID會比那個foreach循環更高效。 – developerwjk 2014-09-10 17:53:53

+0

@developerwjk,很酷。我會看到我能找到並閱讀的內容。 – 2014-09-10 18:59:40

回答

0
  1. 總是建議您將連接作爲功能參數傳遞,而不是使用global。如果你願意,你可以研究這個推理,或者只是相信我的建議 - 將會有幾個StackOverflow頁面專門討論這個問題。

  2. 在絕大多數情況下,一個函數應該return東西。就你而言,我認爲返回一系列成功/失敗結果是有意義的;或者如果您有其他特定需求,則可以返回您喜歡的任何內容。

  3. 你使用準備好的語句和綁定參數的是明智的/正確的。我只想解釋一下,如果您只是編寫foreach(array_column($galArr) as $gID){,則不需要$gID = $value[0];。該聲明足以將變量提供給​​。也就是說,如果您可以準備並將第一列數據從$galArr傳遞到您的自定義功能,那麼您的函數中將有更清晰的代碼位...(foreach($gIDs as $gID){)。

  4. 最重要的是:我不想申報單次使用的變量。根據這一原則,我不會聲明$q並選擇簡單地將字符串寫入prepare()。 (這也沒什麼大不了的 - 如果你喜歡,你可以忽略這個建議)


改進成果跟蹤個性化查詢:

function timeUpdate($mysqli, $uID, $galArr, $timeStamp) { 
    if(!$stmt=$mysqli->prepare('UPDATE someTable SET timeStamp = ? WHERE galleryID = ? AND uniID = ?')){ 
     return $result[]=['syntax'=>'fail','outcome'=>'Prepare Error: '.$mysqli->error]; 
    }elseif(!$stmt->bind_param("iii", $timeStamp, $gID, $uID)){ 
     $result[]=['syntax'=>'fail','outcome'=>'Bind Error: '.$stmt->error]; 
    }else{ 
     foreach(array_column($galArr,0) as $gID) { // if these values are not unique, misinformation will be possible because I am using $gID as $result keys 
      if(!$stmt->execute()) { 
       $result[$gID]=['syntax'=>'fail','outcome'=>'Error: '.$stmt->error]; 
      }else{ 
       $result[$gID]=['syntax'=>'pass','outcome'=>'Affected Rows: '.$stmt->num_rows()]; 
      } 
     } 
    } 
    $stmt->close(); 
    return $result; 
} 

最佳做法將決定你儘可能少地查詢給定的任務。您的任務可能使用WHERE/IN子句將合併爲一個UPDATE查詢。在處理可變數量的佔位符時,不幸的是,mysqli準備好的語句需要一個複雜的過程。 See this post爲什麼可能看起來像。 (PDO處理可變數據的能力要好得多)所以基本上,如果你想對數據庫進行一次調用,那麼我認爲有一個折衷 - 你必須寫更多(更難讀取)代碼,並且您將很少控制返回的通過/失敗消息。