PREPARE语句返回FALSE但插入成功

2022-08-07 00:00:00 php mysql prepared-statement

我对PHP和MySQL还很陌生,当我运行准备语句向数据库插入一些数据时,它返回FALSE,但我可以在数据库中看到新行,有人知道为什么吗?我很感谢你的帮助。我花了几个小时才弄清楚,但运气不佳。并且它只在INSERT语句中发生。而且它 以下是我的代码

$query = "INSERT INTO BbUsers(u_username,u_passhash,u_emailaddr,u_validate) VALUES(?,?,?,?)";
$refArr = array("ssss", $username, $passhash, $email, $vaildHash); 
$result = cleanQuery($query, $refArr);

if ($result2) {
    sendEmail($email, $hash);
} else {
    echo "OOps   something went wrong plz try again";
 exit;
}

以下是准备语句的函数

  function cleanQuery($prepareState,$Arrs)
{
    global $dbcon;
    $refArr=array();
    $res=$dbcon->prepare($prepareState);
    $ref= new ReflectionClass('mysqli_stmt');
    $method=$ref->getMethod("bind_param"); 
    foreach($Arrs as $key => &$value)
    {$refArr[] = &$value;
    }
    $method->invokeArgs($res,$refArr); 
    $res->execute();
    $result=$res->get_result();
    return $result;
}

我试图从$res和$dbcon获取错误信息,它返回0。 这里的数据库看起来像

CREATE TABLE BbUsers(
u_userid INTEGER PRIMARY KEY AUTO_INCREMENT ,
u_username CHAR(60) UNIQUE   ,
u_passhash CHAR(100) ,
u_emailaddr CHAR(255) UNIQUE ,
u_created TIMESTAMP ,
u_lastlogin TIMESTAMP ,
u_validate CHAR(40),
INDEX (u_username , u_emailaddr)
);

我还遗漏了什么>?


解决方案

参见documentation:

mysqli_stmt::get_result

如果SELECT查询成功,则返回结果集;如果其他DML查询或失败,则返回FALSE。函数的作用是:区分这两种类型的失败。

因此$res->get_result()仅适用于您预期的select

要检查您的预准备语句是否正确执行,可以直接使用execute的返回参数:

mysqli_stmt::Execute

成功时返回True,失败时返回False。

您可能应该使用两个不同的函数,一个用于select-返回结果集的语句(顺便说一句,您必须fetch(),否则进一步的查询将不起作用,请阅读documentation to execute()中的注释),另一个函数用于返回truefalse的其他语句。

显然您必须将if ($result2) {替换为if ($result) {,但我认为这只是一个打字错误。

相关文章