如何执行2x$stmt->;execute()?I';I’我弄错了


How to perform 2x $stmt->execute(); ? I'm getting an error

我收到一个错误(非常明显的错误)

在非对象上调用成员函数bind_param()。。。

我想检查用户在验证他的信息时是否提供了他的信息。如果不是,这是一个成功的回声,但如果是,那么我会得到错误。。。我的php代码:

<?php
    if(isset($_POST['configured'])){
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $username = $_SESSION['username'];
    $stmt = $mysqli->prepare("SELECT gender FROM members WHERE username =  ?");
    $stmt->bind_param('s', $username);
    $stmt->bind_result($gender);
    $stmt->execute();
    while ($stmt->fetch()){
        if(empty($gender)){
            echo "<font color='#DB4D4D'>Verification failed! Please provide your information and try again...</font>";
        } else {
             $_POST['configured'] = 1;
             $sql = "
             UPDATE members
             SET configured = ?
             WHERE username = ?
            ";
            $stmt = $mysqli->prepare($sql);
            $stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']); // This is the error line
            $ok = $stmt->execute();
            if ($ok == TRUE) {
                echo "<p><font color='#00CC00'>Your information has been verified.</font><p>
                      <form action='index.php'> <input type='submit' class='buttondiv' value='Continue to Home Page'>";
            } else {
                echo "Error: " .$stmt->error;
            }
        }
    }
}
?>

问题出在哪里?

BTW:错误行本身并没有错。。肯定还有其他事情在发生…

您需要将session_start()添加到页面顶部。绑定失败,因为没有$_SESSION['username']

mysqli->prepare()返回FALSE,因此$stmt->bind_param()实际上类似于FALSE->bind_paam(),FALSE不是一个对象,而是一个布尔值(不是PHP中的对象),因此错误消息Call to a member function bind_param() on a non-object

由于各种原因,mysqli->prepare()失败总是一种选择
因此总是检查返回值。

$stmt = mysqli_prepare(...);
if ( !$stmt ) {
  trigger_error( __LINE__ . ': '.print_r($mysqli->error_list, true), E_USER_ERROR );
}

与大多数其他mysqli函数/方法相同,bind_param()、execute()。。。始终检查返回值。如果是FALSE或NULL,则表示出现了问题
简而言之:添加错误处理!


让我们稍微压缩一下你的脚本:

$stmt->execute();
while ($stmt->fetch()){
   ...
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']);
    $ok = $stmt->execute();

您在$stmt中有一个(活动)语句,您试图在循环中"覆盖"该语句
a) while ($stmt->fetch())的下一次迭代会做什么
b) mysql不起作用;每个连接只有一个活动语句。

根据我的说法,你应该替换:

$stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']);
$stmt->bind_param('s', $_POST['configured']);
$stmt->bind_param('s', $_SESSION['username']);