是否可以使用(与 PHP)先前在 mysql CLI 中声明的准备语句?

Is it possible to use (with PHP) prepared statements that have been previously declared in the mysql CLI?

在 mysql CLI 中,我准备了如下语句:

PREPARE registrarUser FROM 'INSERT INTO Users (Users_name,Email,pass) values (?,?,?)'

在我的数据库中,准备好的语句必须以这种方式完成,而不是使用像这样的 php 方法::

$conn->prepare("INSERT INTO Users (Users_name,Email,pass) VALUES (?, ?, ?)");

所以我不能使用准备好的语句或绑定参数。

我试过这个查询,它模仿 mysql CLI

中所需的语句
$query = sprintf('
SET @Users_name = "%s";
SET @Email= "%s";
SET @pass = "%s";
EXECUTE registrarUser USING @Users_name, @Email, @pass;',$Users_name,$Email,$pass);

但是returns出现如下语法错误:

Errormessage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @Email= "eds@gmail.com"; SET @pass = "Thinkshap2"; EXECUTE registrar' at line 2

有谁知道有什么办法吗? 非常感谢您;

不可能。

来自MySQL manual

The scope of a prepared statement is the session within which it is created...

  • A prepared statement created in one session is not available to other sessions.

不,这不可能。准备好的语句具有会话范围。每当您在 PHP 中打开一个新连接时,您都会打开一个新的 MySQL 会话。您可以在 PHP 中使用 PREPAREEXECUTE,但这两个操作必须使用相同的会话来完成。

换句话说,使用 PREPARE 创建的语句不会保留在数据库服务器上。它们仅在当前会话的生命周期内存在。

您在 PHP 中出现语法错误的原因是您将多个 SQL 语句连接在一起。出于安全考虑,您不能在 PHP 中默认执行此操作。分别执行每一个。例如,这有效:

$stmt = $mysqli->query("PREPARE registrarUser FROM 'SELECT ?'");
$stmt = $mysqli->query("EXECUTE registrarUser USING 32");

警告。使用 PHP 中的 PREPAREEXECUTE 违背了在 PHP 中使用预处理语句的主要目的。主要优点是您可以将变量与 SQL 语法分开。你不能用 PREPAREEXECUTE 做到这一点。这就是为什么 PDO 和 mysqli 都有准备好的语句。使用 mysqli::prepare()mysqli_stmt::execute()