是否可以使用(与 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
有谁知道有什么办法吗?
非常感谢您;
不可能。
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 中使用 PREPARE
和 EXECUTE
,但这两个操作必须使用相同的会话来完成。
换句话说,使用 PREPARE
创建的语句不会保留在数据库服务器上。它们仅在当前会话的生命周期内存在。
您在 PHP 中出现语法错误的原因是您将多个 SQL 语句连接在一起。出于安全考虑,您不能在 PHP 中默认执行此操作。分别执行每一个。例如,这有效:
$stmt = $mysqli->query("PREPARE registrarUser FROM 'SELECT ?'");
$stmt = $mysqli->query("EXECUTE registrarUser USING 32");
警告。使用 PHP 中的 PREPARE
和 EXECUTE
违背了在 PHP 中使用预处理语句的主要目的。主要优点是您可以将变量与 SQL 语法分开。你不能用 PREPARE
和 EXECUTE
做到这一点。这就是为什么 PDO 和 mysqli 都有准备好的语句。使用 mysqli::prepare()
和 mysqli_stmt::execute()
在 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
有谁知道有什么办法吗? 非常感谢您;
不可能。
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 中使用 PREPARE
和 EXECUTE
,但这两个操作必须使用相同的会话来完成。
换句话说,使用 PREPARE
创建的语句不会保留在数据库服务器上。它们仅在当前会话的生命周期内存在。
您在 PHP 中出现语法错误的原因是您将多个 SQL 语句连接在一起。出于安全考虑,您不能在 PHP 中默认执行此操作。分别执行每一个。例如,这有效:
$stmt = $mysqli->query("PREPARE registrarUser FROM 'SELECT ?'");
$stmt = $mysqli->query("EXECUTE registrarUser USING 32");
警告。使用 PHP 中的 PREPARE
和 EXECUTE
违背了在 PHP 中使用预处理语句的主要目的。主要优点是您可以将变量与 SQL 语法分开。你不能用 PREPARE
和 EXECUTE
做到这一点。这就是为什么 PDO 和 mysqli 都有准备好的语句。使用 mysqli::prepare()
和 mysqli_stmt::execute()