我可以重新定义相同的准备好的语句吗?
Can I redefine the same prepared statement?
我有一个脚本,可以在 5 个表(SELECT
和 JOIN
中的一些)上发送超过 10 个所有 CRUD 类型的查询。最初,我对所有这些都使用了 mysqli_*
函数。现在,为了提高安全性,我正在移植代码以使用 prepared statements.
我以前没有使用 准备好的语句 的经验,我对可以做什么和不能做什么有一些疑问。例如,假设我从 SELECT
查询开始,然后是 UPDATE
,最后是 INSERT
。
我的问题是:
我应该为每个查询重复mysqli_stmt_init
和mysqli_stmt_close
,还是我可以在第一个查询之前启动一次,prepare
为每个查询创建一个语句并使用它,最后关闭在完成所有查询之后?换句话说,方法2可以吗,还是我应该坚持方法1?
方法 1 - 不重复使用
// SELECT
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "SELECT on table 1 and table 2");
...
mysqli_stmt_close($stmt);
// UPDATE
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "UPDATE on table 3");
...
mysqli_stmt_close($stmt);
// INSERT
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "INSERT INTO table 4");
...
mysqli_stmt_close($stmt);
方法 2 - 重用语句
// INIT
$stmt = mysqli_stmt_init($link);
// SELECT
mysqli_stmt_prepare($stmt, "SELECT on table 1 and table 2");
...
// UPDATE
mysqli_stmt_prepare($stmt, "UPDATE on table 3");
...
// INSERT
mysqli_stmt_prepare($stmt, "INSERT INTO table 4");
...
// CLOSE
mysqli_stmt_close($stmt);
是的,方法二可以。
也不需要最终关闭它,因为它会在您的脚本结束时关闭。
不需要stmt_init()
或stmt_close()
,mysqli_prepare() returns stmt对象和PHP处理清理,正确的顺序是mysqli_stmt::prepare
=> mysqli_stmt::bind_param
=> mysqli_stmt::execute
.
$mysqli = new mysqli( "host", "user", "pass", "db" );
$stmt = $mysqli->prepare( "SELECT * FROM table WHERE id = ?" );
$stmt->bind_param( "i", $id );
$id = 5;
$stmt->execute();
您可以使用不同的参数多次执行相同的语句,例如:
$stmt = $mysqli->prepare( "SELECT * FROM table WHERE id = ?" );
$stmt->bind_param( "i", $id );
$id = 5;
$stmt->execute(); // executed: SELECT * FROM table WHERE id = 5
$id = 3;
$stmt->execute(); // executed: SELECT * FROM table WHERE id = 3
但如果有不同的陈述,您必须分别准备每个陈述。
我有一个脚本,可以在 5 个表(SELECT
和 JOIN
中的一些)上发送超过 10 个所有 CRUD 类型的查询。最初,我对所有这些都使用了 mysqli_*
函数。现在,为了提高安全性,我正在移植代码以使用 prepared statements.
我以前没有使用 准备好的语句 的经验,我对可以做什么和不能做什么有一些疑问。例如,假设我从 SELECT
查询开始,然后是 UPDATE
,最后是 INSERT
。
我的问题是:
我应该为每个查询重复mysqli_stmt_init
和mysqli_stmt_close
,还是我可以在第一个查询之前启动一次,prepare
为每个查询创建一个语句并使用它,最后关闭在完成所有查询之后?换句话说,方法2可以吗,还是我应该坚持方法1?
方法 1 - 不重复使用
// SELECT
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "SELECT on table 1 and table 2");
...
mysqli_stmt_close($stmt);
// UPDATE
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "UPDATE on table 3");
...
mysqli_stmt_close($stmt);
// INSERT
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "INSERT INTO table 4");
...
mysqli_stmt_close($stmt);
方法 2 - 重用语句
// INIT
$stmt = mysqli_stmt_init($link);
// SELECT
mysqli_stmt_prepare($stmt, "SELECT on table 1 and table 2");
...
// UPDATE
mysqli_stmt_prepare($stmt, "UPDATE on table 3");
...
// INSERT
mysqli_stmt_prepare($stmt, "INSERT INTO table 4");
...
// CLOSE
mysqli_stmt_close($stmt);
是的,方法二可以。
也不需要最终关闭它,因为它会在您的脚本结束时关闭。
不需要stmt_init()
或stmt_close()
,mysqli_prepare() returns stmt对象和PHP处理清理,正确的顺序是mysqli_stmt::prepare
=> mysqli_stmt::bind_param
=> mysqli_stmt::execute
.
$mysqli = new mysqli( "host", "user", "pass", "db" );
$stmt = $mysqli->prepare( "SELECT * FROM table WHERE id = ?" );
$stmt->bind_param( "i", $id );
$id = 5;
$stmt->execute();
您可以使用不同的参数多次执行相同的语句,例如:
$stmt = $mysqli->prepare( "SELECT * FROM table WHERE id = ?" );
$stmt->bind_param( "i", $id );
$id = 5;
$stmt->execute(); // executed: SELECT * FROM table WHERE id = 5
$id = 3;
$stmt->execute(); // executed: SELECT * FROM table WHERE id = 3
但如果有不同的陈述,您必须分别准备每个陈述。