PDO - 检查行是否已更新?

时间:2012-05-23 22:34:17

标签: php mysql 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

如果WHERE number不存在且行未更新,则$q->rowCount()等于0

如何区分这些非更新?

4 个答案:

答案 0 :(得分:8)

在最近的PHP版本中,它由PDO::MYSQL_ATTR_FOUND_ROWS属性控制。 设置为true时,根据doc,效果为:

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

答案 1 :(得分:0)

您可以尝试使用REPLACE,其工作方式与插入类似,但如果该行已存在,则首先将其删除然后插入。这有来自mysql方面的过度工作

答案 2 :(得分:0)

如果存在,会更好地检查吗?我在我的miniclass中使用一个通用函数来管理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;
    }

}

答案 3 :(得分:-1)

添加此内容:

$db = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));

进入databasefunctions.php文件的第一个“ try {”部分