这是我的代码:
$stm = $dbh
->prepare("INSERT INTO resend_pass(user_id, token, date_time)
SELECT ?, ?, unix_timestamp()
FROM dual
WHERE NOT EXISTS( SELECT count(*) AS num_week,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))),0) as num_day,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 hour))),0) as num_hour,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 minute))),0) as num_1min
FROM resend_pass
WHERE user_id = ?
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK))
HAVING num_week > 11 OR num_day > 5 OR num_hour > 3 OR num_1min > 0 );");
if($stm->execute(array(10, 'token', 10))){
echo 'inserted';
} else {
echo 'failed';
}
我的脚本始终打印inserted
,即使没有插入行也是如此。为什么?我该如何解决?
注意我已使用this approach知道它是否已成功插入。
答案 0 :(得分:1)
execute
才会返回false
。你的脚本回应插入'因为没有错误。简而言之,您的查询已成功运行。没有插入任何内容,因为没有记录符合SQL WHERE
子句
如果您需要知道是否实际插入了一行,请改为调用rowCount()
函数:
if($stm->execute(...)===false):
//there was an error
elseif($stm->rowCount()<1): // $stm->affected_rows if you use MySQLi
//no row was inserted
else:
//at least one row was inserted
endif
答案 1 :(得分:0)
如何使用函数mysqli_affected_rows()
http://php.net/manual/es/mysqli.affected-rows.php
如果您使用PDO(我认为是您的情况),您可以尝试$stm->rowCount()。
预备语句将通过该方法返回受影响的行数。
答案 2 :(得分:-1)
INSERT ... SELECT
INSERT
返回的所有行时, SELECT
被视为成功;如果SELECT
返回零行,则语句将成功插入零行。
要确定是否已插入行,必须测试受影响的行数;使用PDO,可以通过查询`PDOStatement :: rowCount()方法完成,如下所示:
try {
$stm = $dbh->prepare("INSERT .. SELECT query");
$stm->execute();
if ( $stm->rowCount() > 0 ) {
echo 'inserted';
} else {
throw new Exception('No rows inserted');
}
} catch(Exception $e) {
echo $e;
}