使用准备好的语句调用语句方法的正确顺序是什么?


What is the correct order of statement method calls using prepared statements?

我想让我的数据库尽可能安全,我学到的一件事就是使用准备好的语句…这就是我正在做的。

我只需要确认一下,以确保执行的顺序是正确的。

下面的内容有意义吗,还是我遗漏了什么?

$sql = 'SELECT ...';
$conn = @ new mysqli($host, $user, $pwd, $db);
$stmt = $conn->stmt_init(); // initialize a prepared statement
$stmt->prepare($sql);
$stmt->bind_param('i', ...);
$stmt->bind_result(..., ..., ...);
$stmt->execute();
while ($stmt->fetch()) {
    ...
}
$stmt->free_result(); // free the database resources for other queries
$stmt->close(); // close statement
$conn->close(); //close the database connection

我认为您不需要调用stmt_init()——至少,根据mysqli::prepare()

页面上的示例,它似乎没有必要。

您可能还需要检查:

  • 如果与DB的连接已经成功建立——参考mysqli::__construct()页面的示例,使用mysqli::connect_error
  • 如果语句已经成功准备——在使用mysqli::prepare()之前检查它的返回值
  • 如果准备好的语句执行成功,测试mysqli_stmt::execute()
  • 的返回值

两个问题:

  1. 不要用@抑制错误
  2. 永远不要假设db相关操作成功。总是检查错误情况,例如当您调用->prepare()时—您的SQL语句可能有语法错误,但您盲目地继续进行,好像一切都很完美。实际的查询执行也是如此——你的查询可能在语法上是100%正确的,但由于外部原因而失败。