2012-05-23 4 views
3

Другие люди задали этот вопрос, но мой немного более конкретный.PDO - проверить, обновлена ​​ли строка?

У меня есть этот запрос:

$sql = "UPDATE table SET option=? WHERE number=?"; 
$q = $conn->prepare($sql); 
$q->execute(array($option, $number)); 
$q->setFetchMode(PDO::FETCH_BOTH); 

echo $q->rowCount(); 

Если WHERE number уже существует и SET option такое же, $q->rowCount() равна 0

Если ГДЕ number оленья кожа существовать и строка не обновляется, $q->rowCount() равно 0

Как я могу различать эти не-обновления?

+0

Зачем вам нужно различать их? – zerkms

+0

Потому что, если строка не существует, то я хотел бы вставить ее во второй запрос. – supercoolville

+0

, чтобы создать его с известным значением 'id'? – zerkms

ответ

8

В последних версиях PHP он управляется атрибутом PDO::MYSQL_ATTR_FOUND_ROWS. При установке в true, в соответствии с doc, эффект:

Return the number of found (matched) rows, not the number of changed rows. 
+0

Но это нужно сделать при подключении DB, правильно? Таким образом, вы по-прежнему не можете различать их в одно и то же время, по крайней мере, используя этот метод. Было бы здорово, если бы вы могли: '$ q-> exe(); $ Q-> rowsChanged(); $ q-> rowsFound(); 'Но это просто не так просто. – Jonathon

+0

Обязательно посетите http://stackoverflow.com/questions/17501997/can-pdo-rowcount-after-update-query-show-difference-between-no-changes-made – maartenmachiels

0

Вы можете попробовать использовать REPLACE, который работает как вставка, но если строка уже существует, ее сначала удаляют, а затем вставляют. Это связано с перегрузкой с mysql стороны

+1

с 'REPLACE' вы потеряете все остальные значения столбцов – zerkms

+0

, вы можете указать значения в' REPLACE', чтобы сохранить значения, вам нужно использовать их в инструкции 'INSERT' в любом случае –

+0

, какие значения? Как вы знаете существующие в настоящее время? – zerkms

0

Будет лучше проверить перед тем, существует ли? Я использую общую функцию для этого в своем мини-классе для управления PDO, но я не знаю, является ли это лучшим решением, потому что сделать один запрос больше ...

function checkExistsInDatabase($id, $table, $where = null){ 

    // Connect 
    $Database = Database::connect(); 

    // Query 
    $sql = "SELECT id 
      FROM $table 
      WHERE id = :id $where 
      LIMIT 1"; 
    $params = array(
       ':id' => array(
        'value' => $id, 
        'type' => 'int' 
       ) 
      ); 
    $q = $Database->query($sql, $params); 

    // Ha encontrado algo? 
    $resultados = $Database->fetchArray($q); 
    if(count($resultados) === 1){ 
     return true; 
    }else{ 
     return false; 
    } 

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