Mysqli 预准备语句失败,在第二次迭代

标签: MySQL PHP
发布时间: 2016/10/23 4:45:27
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有问题与我准备好的语句没有进行第二次迭代和我想知道是否我需要释放它或我的东西不见了?

 // $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 小时到现在。

解决方法 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

否则,它保持在每次迭代中添加额外的语句。

官方微信
官方QQ群
31647020