Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用多个mysqli准备语句时出现的问题_Php_Mysql_Mysqli - Fatal编程技术网

Php 使用多个mysqli准备语句时出现的问题

Php 使用多个mysqli准备语句时出现的问题,php,mysql,mysqli,Php,Mysql,Mysqli,我正在尝试使用3条准备好的语句插入和更新数据。出现了两个问题: 1:SELECT COUNT查询检查是否存在限制为1的记录,结果存储在$check中。但是,限制1似乎被忽略了,例如当我有3行与SELECT COUNT中的WHERE条件匹配时,$check返回3而不是1 2:if int$checkexecute;和$stmt_total->execute;实际上没有插入和更新数据库 但是,当我发表评论时: $stmt_check->execute(); $stmt_check->

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

1:SELECT COUNT查询检查是否存在限制为1的记录,结果存储在$check中。但是,限制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? 您可以在您的列上使用和创建唯一的索引:ach_类、user_id,这样您就没事了。