【问题标题】:Mysqli Prepared Statement Fails On Second IterationMysqli 准备好的语句在第二次迭代中失败
【发布时间】:2015-12-11 22:09:49
【问题描述】:

我的准备好的语句无法在第二次迭代中运行时遇到问题,我想知道是否需要释放它或我缺少的东西?

 // $sheetData an array created from an Excel Sheet
for($i=0; $i <= count($sheetData); $i++) {
     $sql;
     $sql .= "INSERT INTO equipment";
     $sql .= "(tag,date)";
     $sql .= "VALUES(?,?)";
     $sql .= "ON DUPLICATE KEY UPDATE number=VALUES(tag), date=VALUES(date)";

     if($stmt = $db->prepare($sql)) {
          if(Utility::filterNull($sheetData[$i][$idxOfTag]),Utility::convertDT($sheetData[$i][$idxOfDate]) != "1969-12-31 23:59:59") {
                $stmt->bind_param("ss",$sheetData[$i][$idxOfTag],$sheetData[$i][$idxOfDate]);
                $stmt->execute();
          }
      } else {
            DebugLog($debugFileName,"Prepared Statement is false. Error: " . $stmt->error);
            DebugLog($debugFileName,"i = " . $i);
      }
} // i loop

它仅在第二次迭代时返回错误。

DebugLog($debugFileName,$db->error);
= 
You have an error in your SQL syntax; 
check the manual that corresponds to your 
MySQL server version for the right syntax 
to use near 'INSERT INTO equipment (tag,date' at line 1

所以基本上在我的数据库中,它将添加电子表格的第一行,仅此而已。

这不是语法错误,因为第一次迭代有效。

有什么想法吗?

到现在为止,至少已经坚持了 2-3 个小时。

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    $sql 定义移到for 语句之外:

     $sql ='';
     $sql .= "INSERT INTO equipment";
     $sql .= "(tag,date)";
     $sql .= "VALUES(?,?)";
     $sql .= "ON DUPLICATE KEY UPDATE number=VALUES(tag), date=VALUES(date)";
    for($i=0; $i <= count($sheetData); $i++) {
    // removed from here
    
     if($stmt = $db->prepare($sql)) {
          if(Utility::filterNull($sheetData[$i][$idxOfTag]),Utility::convertDT($sheetData[$i][$idxOfDate]) != "1969-12-31 23:59:59") {
                $stmt->bind_param("ss",$sheetData[$i][$idxOfTag],$sheetData[$i][$idxOfDate]);
                $stmt->execute();
          }
      } else {
            DebugLog($debugFileName,"Prepared Statement is false. Error: " . $stmt->error);
            DebugLog($debugFileName,"i = " . $i);
      }
    
    } // i loop
    

    否则,它会在每次迭代中不断添加额外的语句。

    【讨论】:

    • 啊啊啊就这样三个小时。
    • 很高兴我能帮上忙...你也帮了我...刚刚超过 2000 个代表点!
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多