MySQLI - 复制,多个用户的INSERT或UPDATE

时间:2014-06-24 09:46:04

标签: php mysql sql mysqli

目前我使用以下查询更新我的表。

$query = "UPDATE `my_table` SET `views` = `views` + 1 
          WHERE `user_id` IN (".$users.")";

这会将表格中的所有用户更新为各自的观看列值+1。

如果这是新的一天,我需要插入一个新行。为此,我发现(通过堆栈溢出)ON DUPLICATE KEY UPDATE函数。这是完美的工作,但我不完全确定如何在单个查询中为多个用户执行此操作(如上面的查询)。

我到目前为止的当前查询如下,但仅限于单个用户

$query = "INSERT INTO `my_table` (`user_id`, `day`, `listing`) 
          VALUES (12, 2, 1)
          ON DUPLICATE KEY UPDATE `views`=`views`+1";

我不希望将此查询放在php foreach循环中,因为它会在给定行数(40 - 100)的情况下执行缓慢

1 个答案:

答案 0 :(得分:0)

您可以使用mysql事务执行多个查询:http://www.php.net//manual/en/pdo.transactions.php

function ExecuteTransaction($sqlStmts,$params){
try{
    $conn = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    $conn->beginTransaction();

    $n = count($sqlStmts);
    for($i=0; $i<$n; $i++){
        $stmt = $conn->prepare($rawStmts[$i]);
        $stmt->execute($params[$i]);
    }
    $conn->commit();
}
catch(PDOException $ex){
    $conn->rollBack();
    return FALSE;
}
catch(Exception $ex){
    $conn->rollBack();
    return FALSE;
}
return TRUE;}

$ sqlStmts中的每个条目,即$ sqlStmts [$ i]是一个预准备语句,每个$ params ie,$ params [$ i]是预准备语句的参数数组$ sqlStmts [$ i]

但如果您只是想一次执行它们,您应该执行类似

的操作
$query = "INSERT INTO `my_table` (`user_id`, `day`, `listing`)
          VALUES (12,2,1),(13,3,2),(14,4,3)
          ON DUPLICATE KEY UPDATE `views`=`views`+1";