【问题标题】:loop prepare statements, what needs to be repeated?循环准备语句,需要重复什么?
【发布时间】:2012-09-11 21:05:25
【问题描述】:

我正在使用语句来防止 sql 注入...我的问题是循环多个查询时我需要重复什么?

如果您查看第二个查询,我不确定准备语句是否需要在 foreach 循环中

这个摘要代码有问题吗?

打开数据库连接

// connect to database   
$conn = connect('r');

启动第一个查询

$sql = "SELECT ... FROM ... WHERE xxx = ?";

$stmt = $conn->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('i', $albumid);
$stmt->bind_result(..., ...);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;

if ($num_rows  > 0) {
   loop results...
}

$stmt->free_result();

第二次重复查询:

$sql = "SELECT ... FROM ... WHERE xxx = ?";

$stmt = $conn->stmt_init();
$stmt->prepare($sql); ///??????? inside or outside foreach loop ?????

foreach (... as $key => ...) {
    $stmt->bind_param('i', $key);
    $stmt->bind_result(...);
    $stmt->execute();
    $stmt->store_result();
    $num_rows = $stmt->num_rows;

    if ($num_rows  > 0) {
       loop results...
    }

   $stmt->free_result();
}

关闭数据库

// close database
$conn->close();

【问题讨论】:

  • prepare 和 bind_* 可以而且应该在循环之外。
  • 好的,谢谢。我猜'$stmt = $conn->stmt_init();'不需要调用两次,对吗?我不需要两次初始化语句?

标签: php prepared-statement


【解决方案1】:

您不必多次准备查询。只需绑定参数并多次执行即可。

来自 PHP 手册:

对于一个需要多次发出的查询,你会意识到 如果您使用 PDOStatement 对象准备更好的性能 PDO::prepare() 并发出带有多次调用的语句 PDOStatement::execute()。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2018-09-26
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2012-04-04
    • 2015-08-27
    相关资源
    最近更新 更多