2014-12-19 4 views
1

Я начал кодировать простой скрипт, который считывает идентификаторы из CSV, а затем устанавливает тот же адрес электронной почты (в БД) для ВСЕХ пользователей из CSV. Достаточно просто ... (с использованием PDO) Чтение данных из CSV в порядке. Это часть обновления, которая дает мне головные боли.Возвращаемое значение MySQL UPDATE

$sSQL = "UPDATE users SET email = '[email protected]' WHERE CUSTOMER_ID = '%s'"; 
foreach ($aUsers as $sCustomerId) { 
    $sQuery = sprintf($sSQL, $sCustomerId); 

    if (!$db->exec($sQuery)) { 
     printf("There was an error updating user %s in database.<br>", $sCustomerId); 
     $aFailed[] = $sCustomerId; 
    } else { 
     printf("User %s successfully updated.<br>", $sCustomerId); 
     $success++; 
    } 
} 

сценарий действительно прост. Проблема в том, что mysql не ОБНОВЛЯЕТ пользователя в БД, если он уже имеет этот адрес электронной почты, поэтому он вернет 0 (0 строк затронуты, что хорошо). То же самое, что mysql возвращает, если во время обновления возникает ошибка. И это то, что меня раздражает. Как я различаю «никакие строки не затронуты» и «ошибка возникла». Я пробовал использовать разные PDO :: ATTR_ERRMODE и ожидал, что, по крайней мере, в случае ошибки он выкинет исключение (какой тип PDO :: ERRMODE_EXCEPTION должен сделать), который я могу, чем поймать, но это не так. Затем я пытаюсь использовать

if ($db->exec($sQuery) === FALSE) 

также не работает. Теперь скрипт работает, но проблема в том, что я не могу отличить «ошибку» от «не затронутых строк».

Это поведение в mysql new или? Потому что я не помню, чтобы иметь такую ​​проблему в прошлом при написании таких простых скриптов для обновления ...

Руководство говорит: «Если вы установите столбец в значение, которое оно имеет в настоящее время, MySQL замечает это и не обновляет его «.

+0

Вы уже пробовали PDOStatement :: rowCount? Он возвращает затронутые строки по запросу. поэтому проверьте, 0 или больше :) – Refilon

+0

После обновления необходимо проверить «$ db-> errorCode()», чтобы узнать, произошла ли ошибка –

ответ

3

Вы можете использовать errorCode() И errorInfo(), чтобы узнать об ошибке.

errorCode() Функция возвращает NULL, если запрос не имеет проблем.

Пример:

$db->exec($sQuery); 
if ($db->errorCode() !== NULL) { 
    // Additional error info from: $db->errorInfo() 
    printf("There was an error updating user %s in database.<br>", $sCustomerId); 
    $aFailed[] = $sCustomerId; 
} else { 
    printf("User %s successfully updated.<br>", $sCustomerId); 
    $success++; 
} 

PHP документация:

http://php.net/manual/en/pdo.errorcode.php

0

Если вы используете PDO, попытайтесь сделать prepare и затем execute, который возвращает true на успех, false при ошибке

$sSQL = "UPDATE users SET email = '[email protected]' WHERE CUSTOMER_ID = :customer_id"; 
$sth = $db->prepare($sSQL); 
if(!$sth->execute(array(':customer_id' => $sCustomerId))) 
{ 
    printf("There was an error updating user %s in database.<br>", $sCustomerId); 
} else { 
    printf("User %s successfully updated.<br>", $sCustomerId); 
} 

Это хорошая оценка для обеспечения безопасности вашего сценария. Execute свяжет params, поэтому нет необходимости бежать или процитировать их.

Смежные вопросы