致命错误:未捕获的错误:调用 bool 上的成员函数 execute() [重复]

Posted

技术标签:

【中文标题】致命错误:未捕获的错误:调用 bool 上的成员函数 execute() [重复]【英文标题】:Fatal error: Uncaught Error: Call to a member function execute() on bool [duplicate] 【发布时间】:2020-02-15 07:08:49 【问题描述】:

我想向我的网站添加注册,但我总是收到以下错误消息:

致命错误:未捕获的错误:调用成员函数 execute() on C:\xampp\htdocs\webseite\user.class.php:74 中的布尔值堆栈跟踪:#0 C:\xampp\htdocs\webseite\register.php(15): user->register() #1 main 在第 74 行的 C:\xampp\htdocs\webseite\user.class.php 中抛出

这是我的注册函数:

public function register()
    $con = new mysqli("localhost", "xxxxx", "password", "xxxxx");
    $error = false;
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email = $_POST['email'];
    $passwort = $_POST['passwort'];
    $passwort2 = $_POST['passwort2'];

    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
        echo 'Bitte eine gültige E-Mail-Adresse eingeben<br>';
        $error = true;
         
    if(strlen($passwort) == 0) 
        echo 'Bitte ein Passwort angeben<br>';
        $error = true;
    
    if($passwort != $passwort2) 
        echo 'Die Passwörter müssen übereinstimmen<br>';
        $error = true;
    

    echo $email;
    if(!$error)  
        $statement = $con->prepare("SELECT * FROM users WHERE email = :email");
        $result = $statement->execute(array('email' => $email));
        $user = $statement->fetch();

        if($user !== false) 
            echo 'Diese E-Mail-Adresse ist bereits vergeben<br>';
            $error = true;
            
    

    if(!$error)     
        $passwort_hash = password_hash($passwort, PASSWORD_DEFAULT);

        $statement = $con->prepare("INSERT INTO users (email, passwort, firstname, lastname) VALUES (:email, :passwort, :firstname, :lastanme)");
        $result = $statement->execute(array('email' => $email, 'passwort' => $passwort_hash));

        if($result)         
            echo 'Du wurdest erfolgreich registriert. <a href="login.php">Zum Login</a>';
         else 
            echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
        
     

【问题讨论】:

$con-&gt;prepare() 由于某种原因失败,因此返回了false;所以你现在正在尝试做false-&gt;execute() ... 【参考方案1】:

mysqli 不支持命名参数,需要问号。

你还需要在执行前绑定参数,你不能发送像PDO这样的值的数组。

所以你需要类似的东西(对于你的第一个 sql 查询):

$statement = $con->prepare("SELECT * FROM users WHERE email = ?");
$statement->bind_param("s", $email);
$result = $statement->execute();

【讨论】:

...而且您还需要 get_result() 在 fetch 之前以及 fetch_assoc() 而不是 fetch()

以上是关于致命错误:未捕获的错误:调用 bool 上的成员函数 execute() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的错误:在 null 上调用成员函数 select()

致命错误:未捕获错误:在null上调用成员函数select()

PHP“致命错误:未捕获错误:调用成员函数prepare()为null”

致命错误:未捕获的错误:在解析数据时调用字符串上的成员函数 find()

PHP:致命错误:未捕获的错误:在布尔值上调用成员函数 execute() [重复]

PHP 致命错误:未捕获的错误:调用字符串中的成员函数 diff()