我是一个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中获得错误信息?