其他人问过这个问题,但我的问题更为具体。
我有这个问题:
$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
如何区分这些非更新?
答案 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 {”部分