首页 > 解决方案 > 无法使用 PHP 在 MySQLi 准备好的语句中进行方法链接

问题描述

我是 PHP 的初学者。我试图不放入$conn->prepare($sql_stmt)一个变量,而只是应用方法链接。但我得到“执行时出错”。

<?php
    include_once 'dbh.inc.php';

    if(isset($_POST['submit_btn']))
    {
        $fullname = $_POST['name'];
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql_stmt = "INSERT INTO signup (name, username, passwrd) VALUES (?,?,?);";

        //prepare and bind
        $conn->prepare($sql_stmt)->bind_param("sss", $fullname, $username, $password);
        
        //execute
        if($conn->prepare($sql_stmt)->execute())
        {
            echo "User created";
        }
        else
        {
            echo "Error while executing";
        }
        
    }
    else
    {
        echo "Unable to sign up.";
    }

$sql = $conn->prepare($sql_stmt)但是,如果我像下面这样实例化

<?php
    include_once 'dbh.inc.php';

    if(isset($_POST['submit_btn']))
    {
        $fullname = $_POST['name'];
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql_stmt = "INSERT INTO signup (name, username, passwrd) VALUES (?,?,?);";

        //prepare and bind
        $sql = $conn->prepare($sql_stmt);
        $sql->bind_param("sss", $fullname, $username, $password);
        //execute
        if($sql->execute())
        {
            echo "User created";
        }
        else
        {
            echo "Error while executing";
        }
        
    }
    else
    {
        echo "Unable to sign up.";
    }

它工作并返回“用户创建”。为什么呢?

标签: phpmysqli

解决方案


mysqli 无法进行方法链接。的返回值bind_param()是一个布尔值。它不返回self。您必须调用第二个示例中显示的方法:

$sql = $conn->prepare($sql_stmt);
$sql->bind_param("sss", $fullname, $username, $password);
$sql->execute();

事实上,mysqli 并不是很适合在你的应用程序中单独使用。如果您想要更简单的东西,请使用 PDO。如果出于某种奇怪的原因您必须使用 mysqli,那么您需要某种抽象层来阻止您直接处理 mysqli 函数。

从 PHP 8.1 开始,您可以直接在 中传递参数mysqli_stmt::execute(),这样您就可以在一行中进行方法链接:

$sql = $conn->prepare($sql_stmt)->execute([$fullname, $username, $password]);

另外,请停止检查execute. 您应该改为启用 mysqli 错误报告。如何在 MySQLi 中获取错误消息?


推荐阅读