【问题标题】:PHP Fatal error: Call to a member function bind_param() on a non-object (PHP-MySQL PreparedStatement)PHP 致命错误:调用非对象上的成员函数 bind_param() (PHP-MySQL PreparedStatement)
【发布时间】:2015-03-09 12:07:22
【问题描述】:

我知道这已经被问过好几次了,但我向你保证我尝试了每一个建议,但这对我没有帮助。 (我猜是因为这个错误是由多种因素造成的)。

这是我的代码:

$stmt = $conn->prepare("INSERT INTO User (Username, Password, Email, Race) VALUES (?, ?, ?, ?)");
        $stmt->bind_param("ssss", $Username, $Password, $Email, $Race);

    if($stmt->execute())
    {
        $stmt = $conn->prepare("SELECT Id FROM User WHERE Username=?");
    if ($stmt === FALSE)
    {
        echo ($this->conn->error);
    }
        $stmt->bind_param("s", $Username);
        if($stmt -> execute())
        {
            $stmt -> bind_result($idd);
            $stmt -> fetch();
            echo $idd;
            $acre=1000;
            $alertlevel=0;
            $offperc=0;
            $deffperc=0;
            $userlevel=1;
            $upgradeavail=0;

            $stmt = $conn->prepare("INSERT INTO Info (idd, acre, alertlevel, offperc, deffperc, userlevel, upgradeavail) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $stmt->bind_param("iiiiiii", $idd, $acre, $alertlevel, $offperc, $deffperc, $userlevel, $upgradeavail);

            if($stmt -> execute())
            {
                echo "";
            }
            else
            {
                echo "false";
            }
        }
        else
        {
            echo "false";
        }
    }
    else
    {
        echo "false";
    }

那是我的 SQL 表:

表用户:Id*(int and primary)* 用户名*(varchar)* 密码*(varchar)* 邮箱*(varchar)* 年龄*(int)*

表信息:IdPrimary*(int and primary)* idd*(int)* acre*(int)* alertlevel*(int)* offperc*(int)* defperc*(int)* userlevel*(int)* 升级可用*(int)*

给我的错误位于第 57 行,即:

$stmt->bind_param("iiiiiii", $idd, $acre, $alertlevel, $offperc, $deffperc, $userlevel, $upgradeavail);

我用它来确保选择准备工作正常。

if ($stmt === FALSE)
{
    echo ($this->conn->error);
}

这表明它确实能够从表 User 中获取 Id

  echo $idd; 

很抱歉这篇文章很长,但我想给你所有可能的细节:) 感谢您的帮助!

【问题讨论】:

  • 在调用bind_param之前写var_dump($stmt)并告诉我们结果
  • 得到的回复是:bool(false)
  • 这意味着数据库未能初始化准备好的语句。使用您的最后一个错误消息函数来查看它的内容。

标签: php mysql sql-server


【解决方案1】:

我注意到您的标记中有空格。我不确定这是否允许。我自己从来没有做过,所以我不能肯定地说。

你在哪里有if($stmt -> execute()) 也许你可以尝试关闭空间,?

if($stmt->execute())

【讨论】:

  • 嗯,这似乎很难追踪。在绑定中,你确定每个被绑定的变量确实是一个整数吗?
  • 另外,你有几个地方的代码正在回显“假”这个词,所以我可能会稍微改变每个实例,看看这个词是从哪里回显的
  • 我更改了“false”回显,但由于以下原因它仍然返回 bool(false): $stmt = $conn->prepare("INSERT INTO Info (idd, acre, alertlevel, offperc, deffperc , userlevel, upgradeavail) VALUES (?, ?, ?, ?, ?, ?, ?)");回声(var_dump($stmt)); $stmt->bind_param("iiiiiii", $idd, $acre, $alertlevel, $offperc, $deffperc, $userlevel, $upgradeavail);
【解决方案2】:

原来你不能使用相同的 $stmt 来插入到两个不同的表中。所以我所做的是创建一个名为 $connn 的新 $conn 并且它起作用了。 为什么不能插入到两个不同的表中,这超出了我的理解!希望有人对此有所了解。

【讨论】:

  • 很高兴你能成功。我不知道你必须为你的目的创建一个新的 conn。如果时间允许,我还会尝试使用 PHP PDO 执行您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2014-02-03
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2015-11-05
  • 2014-06-19
相关资源
最近更新 更多