php - 使用多个 mysqli 准备好的语句时出现问题

标签 php mysql mysqli

我正在尝试使用 3 个准备好的语句插入和更新数据。出现两个问题:

1:SELECT COUNT 查询检查是否存在 LIMIT 1 的记录,并将结果存储在 $check 中。但是,LIMIT 1 似乎被忽略,例如当我有 3 行与 SELECT COUNT 中的 WHERE 条件匹配时,$check 返回 3 而不是 1。

2: if ( (int)$check < 1 ) 语句有效,每当 $check = 0 时,我都会看到 echo 的输出,但是 $stmt_insert->execute();和 $stmt_total->execute();实际上并没有插入和更新数据库。

但是,当我注释掉时:

 $stmt_check->execute();
 $stmt_check->bind_result($check);
 $stmt_check->fetch();

然后 $stmt_insert 和 $stmt_total 工作并且行被插入和更新。我想知道是否有一种方法可以使所有三个语句正常工作,因为我当前的设置似乎发生了某种冲突。感谢您抽出时间。

完整代码如下:

$user_id = 100;
$count = preg_match_all("#<li>(.*?)</li>#is", $html, $matches, PREG_SET_ORDER);

$stmt_check = $mysqli->stmt_init();
$stmt_check->prepare("SELECT COUNT(`user_id`) AS `check` FROM `ua` WHERE `ach_class` = ? AND `user_id` = ? LIMIT 1");
$stmt_check->bind_param('si', $ach_class, $user_id);

$stmt_insert = $mysqli->stmt_init();
$stmt_insert->prepare("INSERT INTO `ua` (`user_id`, `ach_class`, `time_log`) VALUES (?, ?, ?)");
$stmt_insert->bind_param('isi', $user_id, $ach_class, $ach_timestamp);

$stmt_total = $mysqli->stmt_init();
$stmt_total->prepare("UPDATE `ach` SET `total` = `total` +1 WHERE `ach_class` = ? LIMIT 1");
$stmt_total->bind_param('s', $ach_class);

for ($i = 0; $i < $count; $i++) {
    $li_block = $matches[$i][1];
    preg_match('#img/(.*?)_60.png#is', $li_block, $class_matches);
    $ach_class = $class_matches[1];
    $ach_class = substr($ach_class, 11, -11);

    $ach_timestamp = time();

    $stmt_check->execute();
    $stmt_check->bind_result($check);
    $stmt_check->fetch();
    echo $ach_class.' --- Check = '.$check.'<br />';

    if ( (int)$check < 1 ) {
        $stmt_insert->execute();
        echo 'insert<br />';

        $stmt_total->execute();
        echo 'update<br />';
    } else {
        echo 'already present<br />';
    }
}

$stmt_insert->close();
$stmt_check->close();
$stmt_total->close();

最佳答案

  1. LIMIT 有效...它限制返回行数,并且您返回的 1 行仅包含一个字段(仅计数),因此最后的 LIMIT 毫无意义,因为无论如何它都会返回单个结果。另外,为什么你的 UPDATE 命令中有 LIMIT 1 ?
  2. 您可以使用INSERT ON DUPLICATE KEY UPDATE并在您的列上创建唯一索引:ach_class、user_id,这样就可以了。

关于php - 使用多个 mysqli 准备好的语句时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954480/

相关文章:

php - 按月份和货币在 MySQL 中分组

php - 警告:PDO::exec() 期望参数 1 为字符串

mysql - MySql密码中的特殊字符

PHP MySQLi 插入查询错误 - 服务器已经消失

javascript - PHP Javascript 单一表单调用提交到两个表单

php - WordPress REST API OAuth curl 命令

java - "hibernate.hbm2ddl.auto"属性/创建&更新

Mysql - 获得最高和最低 5 个结果

php - MySQLi 多个准备语句

php - mysql建表时使用变量作为表名