我可以重新定义同样的预备声明吗?

时间:2015-09-20 14:52:05

标签: php mysqli prepared-statement

我有一个脚本,可以在5个表上发送超过10个所有CRUD类型的查询(SELECTJOIN的{​​{1}}个。最初,我为所有这些使用了mysqli_*函数。现在,为了提高安全性,我将代码移植到使用预处理语句

我之前没有使用预备语句的经验,我对可以做什么和不可以做什么有些怀疑。例如,假设我从SELECT查询开始,然后是UPDATE,最后是INSERT

我的问题是:

我应该为每个查询重复mysqli_stmt_initmysqli_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);

2 个答案:

答案 0 :(得分:1)

不需要stmt_init()stmt_close()mysqli_prepare()返回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

但如果有不同的陈述,您必须单独准备每份陈述。

答案 1 :(得分:0)

是的,方法2没问题。

也没有必要最终关闭它,因为当你的脚本结束时它将被关闭。