可以';t在同一个PHP文件中执行第二个MYSQLI查询


Can't execute second MYSQLI query in same PHP file

这是我的代码

$stmt = $mysqli->prepare("SELECT * FROM `accountsToDo` WHERE `OKrname` = ?");
    $stmt->bind_param("s", $OKCUsername);
    /* execute prepared statement */
    $stmt->execute();
if ($stmt->affected_rows > 0){
    echo "Exists";
} else {
    $stmt = $mysqli->prepare("INSERT INTO `accountsToDo`(`percentageOfMessages`, `RemoveDeletedAccounts`, `RemoveNoReply`, `RemoveNoResponse`, `minMatchPercent`, `minDistance`, `maxDistance`, `blacklistUsernames`, `userEmail`, `OKrname`, `OKword`) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
    $stmt->bind_param("iiiiiiissss", $percentageOfMessages, $RemoveDeletedAccounts, $RemoveNoReply, $RemoveNoResponse, $minMatchPercent, $minDistance, $maxDistance, $blacklistUsernames, $userEmail, $OKrname, $OKword);
    $stmt->execute();
}

/* close statement and connection */
$stmt->close();
/* close connection */
$mysqli->close();

但现在我得到了错误,

在第147行的布尔值上调用成员函数bind_param()。

147行为

$stmt->bind_param("iiiiiiissss", $percentageOfMessages, $RemoveDeletedAccounts, $RemoveNoReply, $RemoveNoResponse, $minMatchPercent, $minDistance, $maxDistance, $blacklistUsernames, $userEmail, $OKrname, $OKword);

如果您所要做的只是插入到todo表中,如果主表没有匹配的行,则不需要两条语句。

INSERT INTO `accountsToDo` 
        (`percentageOfMessages`, `RemoveDeletedAccounts`, 
          `RemoveNoReply`, `RemoveNoResponse`, `minMatchPercent`, 
          `minDistance`, `maxDistance`, `blacklistUsernames`, 
          `userEmail`, `OKrname`, `OKword`) 
VALUES (?,?,?,?,?,?,?,?,?,?,?)
WHERE NOT EXISTS (SELECT 1 FROM `accountsToDo` WHERE `OKrname` = ?);

绑定你的params,你就可以保存对数据库的调用。这样做的优点是"SELECT 1"充当切割运算符,因此只有在找到第一个TRUE之前才会对其进行评估。

$mysqli->prepare 中的表名和字段列表之间缺少一个空格

试试这个:

$stmt = $mysqli->prepare("INSERT INTO `accountsToDo` 
                        (`percentageOfMessages`,`RemoveDeletedAccounts`, 
                         `RemoveNoReply`, `RemoveNoResponse`, 
                         `minMatchPercent`, `minDistance`, 
                         `maxDistance`, `blacklistUsernames`, 
                         `userEmail`, `OKrname`, `OKword`) 
                         VALUES (?,?,?,?,?,?,?,?,?,?,?)");

根据手册,如果语句导致错误,$mysqli->prepare将返回FALSE

更新

看起来您的$mysqli->prepare需要11个变量,而您正试图绑定12个

问题是我没有$stmt->store_result();在第一个$stmt->execute(); 之上