2016-02-29 3 views
0

Я получаю необычное поведение при использовании PHP/PDO и INSERT. Вот некоторые примеры кода:Использование PHP PDO, необычное поведение с исключениями rowCount и catching

foreach ($all_users as $this_user) { 
    try { 
     $stmt = $db->prepare('INSERT INTO fav_colors (name, color, whattime) VALUES (:name, :color, :whattime)'); 
     $stmt->bindValue(':name', $this_user[name]); 
     $stmt->bindValue(':color', $this_user[color]); 
     $stmt->bindValue(':whattime', $this_user[time]); 
     $stmt->execute(); 
     $count = $stmt->rowCount(); 
    } catch(PDOException $e) { catchMySQLerror($e->getMessage()); } 

    if ($count == 1) { 
     echo "Successful write to table"; 
    } elseif ($count == 0) { 
     echo "ERROR writing row to table"; 
    } 

} 

Допустим, у меня есть 10 имен/цвета для вставки и времена формат DATETIME (2016-01-01 12:00:00). У меня есть цикл вокруг этого кода, и после кода я проверяю $ count, чтобы убедиться, что вставка работает нормально.

Вот моя проблема. Одна из 10 вставок, по какой-то причине $ write_time была пустой. mySQL сгенерировал ошибку (не может быть null). Моя пользовательская функция catchMySQLerror записывает ошибку в таблицу и отправляет мне по электронной почте. Это было так, но $ count был еще 1 для этой записи, и, согласно этому, все было в порядке, хотя запись не вставлялась.

Так же моя проблема с try/catch, которую я использую здесь, чтобы поймать исключение? Как я могу добавить что-то, где я могу лучше справиться с ошибкой в ​​коде? Я знаю, что я могу добавить больше строк после строки catchMySQLerror и работать с ошибкой таким образом. Это то, что я сделал. Но я хотел бы обработать ошибку, используя if/else, и с подходом, о котором я только что упомянул, я могу справиться с ошибкой ... нет, если это было успешным.

UPDATE: Я редактировал код, чтобы показать, как я использую $ кол

+1

http://php.net/manual/en/pdo.error-handling.php, если вы не сделали этого. –

+0

, если проблема связана с '$ write_time', не кажется ли вам, что имеет смысл показать, как определяется' $ write_time' .. в любом случае, звучит как одна ошибка, вы должны показать код цикла. –

+0

Как вы определяете '$ write_time' в своем коде? Также обратите внимание, что вам нужно привязать параметры только один раз. После этого вы можете просто изменить свои переменные и выполнить. –

ответ

2

Если ->execute() бросает исключение, $count = $stmt->rowCount(); не выполняется, и, следовательно, $ граф сохраняет значение предыдущей итерации (если был одним).
Если вы полагаетесь на это значение, вы должны (повторно) инициализировать его в начале каждой итерации.

+0

Счет должен быть сброшен каждый раз новым выходом rowCount – phpmysqlguy

+0

Я поддержал его, потому что Хорхели прав. Когда исключение вызывается с помощью -> execute() $ count, сохраняет значение с предыдущей итерации. – VolkerK

+0

@ VolkerK Мне все равно, это все еще вопросы к OP - * ", если это код внутри цикла, поэтому счетчик $ по-прежнему равен 1 во втором цикле, когда происходит ошибка, не так ли? $ count сначала?"* –

0

это то, как это должно быть сделано

foreach ($all_users as $this_user) { 
    try { 
     $stmt = $db->prepare('INSERT INTO fav_colors (name, color, whattime) VALUES (:name, :color, :whattime)'); 
     $stmt->bindValue(':name', $this_user[name]); 
     $stmt->bindValue(':color', $this_user[color]); 
     $stmt->bindValue(':whattime', $this_user[time]); 
     $stmt->execute(); 
    } catch(PDOException $e) { 
     catchMySQLerror($e); 
     echo "ERROR writing row to table"; 
    } 
} 
Смежные вопросы