如何执行2x $ stmt-> execute(); ?我收到了错误

时间:2015-04-02 21:17:25

标签: php

我收到错误(明显的错误)

  

在非对象上调用成员函数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:错误行本身并不正确..还有其他事情要发生......

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

mysqli-&gt; 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中有一个(有效)语句,您尝试&#34;覆盖&#34;在循环内。
a)while ($stmt->fetch())的下一次迭代会做什么? b)不能与mysql一起使用;每个连接只有一个活动语句。

答案 2 :(得分:-1)

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

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