无法在mysql语句中使用PHP进行方法链接



我是一个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.";
}

它工作并返回"User created"。为什么会这样呢?

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的返回值。你应该启用mysql错误报告。如何在mysql中获得错误信息?

最新更新