我如何知道insert .. select是否确实插入了任何行?

时间:2016-07-13 02:48:08

标签: php mysql pdo sql-insert

这是我的代码:

$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知道它是否已成功插入。

3 个答案:

答案 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

Documentation here.

答案 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;
}