【问题标题】:Mysqli PHP Fatal error: Call to a member function bind_param() on a non-objectMysqli PHP 致命错误:在非对象上调用成员函数 bind_param()
【发布时间】:2014-04-01 23:01:39
【问题描述】:

我正在为某人开发仪表板,但我遇到了错误。我正在创建一个注册页面,它的作用是查看用户是否已经在数据库中,如果是,则允许他们完成注册,但是当我提交时,它会创建此错误Fatal error: Call to a member function bind_param() on a non-object on line 8

这是 PHP 代码:

<?php
include"core/config.php";

if(isset($_POST['submit']))
{
  $username = $_POST['username'];
  $email = $_POST['email'];

  $check = $db->prepare("SELECT * FROM users WHERE username = :username");
  $check->bind_param(":username",$username);
  $check->execute();
  echo $check->error;

  $emailCheck = null;
  $usernameCheck = null;
  while($row = $check->fetch())
  {
    $emailCheck = $row['email'];
    $usernameCheck = $row['username'];
  }
  if(!$email == $emailCheck)
  {
    echo 'Email doesn\'t exist!';
  }else{

    if(!$username == $usernameCheck)
    {
      echo 'Username doesn\'t exist!';
    } else
    {
      $query = $db->prepare("SELECT * FROM users WHERE username = :username AND email = :email");
      $query->bind_param(":username", $username);
      $query->bind_param(":email", $email);
      $query->execute();
       $_SESSION['username'] = $username;
      echo 'You have logged in, you will be redirected.';
      echo '<META HTTP-EQUIV="REFRESH" CONTENT="5;URL=page to set password.">';
    }
  }
}
?>

表格代码:

<form class="no-margin" method="post">
                <fieldset>
                    <div class="form-group no-margin">
                        <label for="username" >Username</label>

                        <div class="input-group input-group-lg">
                                <span class="input-group-addon">

                                </span>
                            <input id="username" type="username" name="username" class="form-control input-lg" placeholder="Username">
                        </div>

                    </div>

                    <div class="form-group">
                        <label for="Email" >Email</label>

                        <div class="input-group input-group-lg">
                                <span class="input-group-addon">

                                </span>
                            <input id="email" type="email" name="email" class="form-control input-lg"
                                   placeholder="Email">
                        </div>

                    </div>
                </fieldset>
                <div class="form-actions">
                    <button type="submit" name="submit" class="btn btn-block btn-lg btn-danger">
                        </span>
                        <small>Submit</small>
                    </button>
                    <div class="forgot"><a href="not important">Not a member? Join here!</a></div>
                </div>
            </form>

【问题讨论】:

  • 可以发一下表单代码吗,好像$username可能没有设置
  • 我在第 14 行没有看到 bind_param()。你确定你发布了正确的代码吗?
  • 它可能源于您的$db init 行,因为查询看起来没问题
  • 这是这个代码,对不起$check-&gt;bind_param(":username",$username);
  • @user43268 你没读过Bill's answer吗?

标签: php database mysqli


【解决方案1】:

我假设您使用的是 ext/mysqli,因为 bind_param() 是该扩展的一部分。

Mysqli 不支持命名参数。您必须将位置参数与 ? 占位符一起使用。

Mysqli 的bind_param() 的用法也与您使用它的方式不同。您必须绑定所有参数,第一个参数是“控制”参数。我建议您阅读documentation 中的示例。

PDO 支持命名参数,每次调用可以绑定一个参数到bindParam()

【讨论】:

  • 我认为 OP 没有看到您的答案,甚至不知道如何修复他/她的代码。这是最有可能的答案。另外,OP 声明 in a comment 他/她之前使用过相同的代码,但没有 session_start();hm,我非常怀疑代码“用于”工作。
  • @Fred-ii- 我什么时候说过它有效?我说这段代码和我的唯一不同的是它不包括会话开始,没什么大不了的。是的,我确实看到了这个答案并考虑到了它,它确实有帮助,我正在努力修复它,是的,我不知道如何安静地修复它,因为你说了。
  • In your comment @user43268 或者,我做梦了吗?
  • @Fred-ii- 我从来没有说过它有效......我说唯一的区别是会话开始......
  • 好的。 尽管如此,您使用了错误类型的占位符。 @user43268
【解决方案2】:

总是在 mysqli 连接之前有这一行

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

【讨论】:

  • 好的,我输入了,我得到了这个Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':username' at line 1' in /var/www/html/db/register.php:14 Stack trace: #0 /var/www/html/db/register.php(14): mysqli-&gt;prepare('SELECT * FROM u...') #1 {main} thrown in /var/www/html/db/register.php on line 14
  • 很可能您在运行的真实代码中使用查询而不是准备,而不是您在此处发布的代码
  • 我这里的代码和我用的一样。唯一的区别是这里我没有包括会话开始。
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多