有没有办法将1加到列值而不先通过查询检索值?

时间:2018-02-13 20:49:20

标签: php mysql

我正在检查数据库中是否已存在某个值,如果是,我只想更新last_date以及将计数(visit_num)更新为1.我'我不确定是否有更有效的方法来执行此操作,而不是通过运行查询来检索当前数字然后执行++。这就是我目前所拥有的(没有检索列)。

function subscribe($visit_num, $email, $last_visit_date){

$sql = 'SELECT 1 from `visits` WHERE `email` = ? LIMIT 1';
        $stmt = $dbh->prepare($sql);
        $stmt->bindParam(1, $email, PDO::PARAM_INT);
        $stmt->execute();

        if($stmt->fetchColumn()){
            $totalVisits = /*Somehow retrieve the current count*/ + $visit_num;

            $query = "UPDATE `visits` SET
                        `visit_num`=:visit_num,
                        `last_visit_date`=:last_visit_date
                    WHERE
                        `email` = :email";

            // prepare query statement
            $stmt = $dbh->prepare($query);

            // bind values
            $stmt->bindParam(":visit_num", $totalVisits);
            $stmt->bindParam(":last_visit_date", $last_visit_date);
            $stmt->bindParam(":email", $email);
            $res = $stmt->execute();

            if($res){
                $arr = array('message' => 'Added');
                echo json_encode($arr);
            }else{
                $arr = array('message' => "Error");
                echo json_encode($arr);
            }
}

我可以(在此之前)做一个“SELECT COUNT(*) FROM 'visits' WHERE 'email' = '$email'"并添加它,但我不确定这是最好的方法还是有更好的方法。

1 个答案:

答案 0 :(得分:0)

在一个声明中这样做:

UPDATE `visits` SET
   `visit_num`=`visit_num` + 1,
   `last_visit_date`=CURDATE()
WHERE
   `email` = :email";

如果您需要知道应用程序中显示或下游逻辑的访问次数,请运行单独的选择,但这是一个不相关的用例。显然,您可以在此处切换出您需要的内容,例如将CURDATE()更改为此函数的传入参数。

如果表中不存在此电子邮件,并且您要执行UPDATE失败的INSERT,您仍然可以使用INSERT...ON DUPLICATE KEY UPDATE syntax

在一个SQL语句中执行此操作