2015-12-11 2 views
0

У меня возникли проблемы с моим подготовленным заявлением, не работающим над второй итерацией, и мне было интересно, нужно ли мне освобождать его или что-то, что мне не хватает?Подготовленное заявление Mysqli не работает во второй итерации

// $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 

В противном случае, он продолжает добавлять дополнительные заявления на каждой итерации.

+0

Ahhhh три часа на этом. –

+1

Рад, что я мог бы помочь ... ты тоже помог мне ... только превысил 2000 очков репутации! – Sablefoste

+0

Я бы проголосовал за вас, но не хватило репутации: \ –