2014-09-10 72 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处理可变数据的能力要好得多)所以基本上,如果你想对数据库进行一次调用,那么我认为有一个折衷 - 你必须写更多(更难读取)代码,并且您将很少控制返回的通过/失败消息。