Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP检查MYSQL查询是插入还是更新_Php_Mysql - Fatal编程技术网

PHP检查MYSQL查询是插入还是更新

PHP检查MYSQL查询是插入还是更新,php,mysql,Php,Mysql,我有一个简单的MYSQL查询: INSERT INTO table (col1,col2) VALUES ('1','2') ON DUPLICATE KEY UPDATE col1 = '1', col2 = '2' 我使用PHPPDO语句来查询数据库。有没有办法知道执行的查询是生成新插入的行还是更新了现有行?一种方法是在执行查询之前获取行数,然后在执行查询之后获取行数,如果行数不相等,则表示插入了新行;如果行数相等,则表示更新了行 $sql = "SHOW TABLE STATUS LI

我有一个简单的MYSQL查询:

INSERT INTO table (col1,col2) VALUES ('1','2') 
ON DUPLICATE KEY UPDATE col1 = '1', col2 = '2'

我使用PHPPDO语句来查询数据库。有没有办法知道执行的查询是生成新插入的行还是更新了现有行?

一种方法是在执行查询之前获取行数,然后在执行查询之后获取行数,如果行数不相等,则表示插入了新行;如果行数相等,则表示更新了行

$sql = "SHOW TABLE STATUS LIKE 'TABLE_NAME'";
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
$row = $stmt->fetch();
$number_of_rows_before = $row['Rows'];
// Do your query here, afterwards
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
$row = $stmt->fetch();
$number_of_rows_after = $row['Rows'];
// If condition
if($number_of_rows_before == $number_of_rows_after) // Update was executed
else // a new row was inserted. 

也许你可以将答案直接放入查询中,如:

在表中插入(col1、col2、colu类型)值('1'、'2'、'inserted') 在重复键更新col1='1',col2='2',col_type='updated'

仅使用mysqli_受影响的行,它返回受上次插入、更新、替换或删除查询影响的行数

来自PHP文档:

在“INSERT…ON DUPLICATE KEY UPDATE”查询的情况下,如果执行了INSERT,则返回值为1,如果更新了现有行,则返回值为2

从Mysql手册:

“在重复密钥更新时,如果 该行将作为新行插入,如果更新现有行,则为2。“

见:


这是最可靠的方法。

可能重复Get last insert id的可能重复。在更新的情况下,与使用mysql\u Infected\u Row相比,它的效率非常低。这不适用于
PHP PDO语句
(OP正在使用的语句)。等价项只返回一个计数。