我想让我的数据库尽可能安全,我学到的一件事就是使用准备好的语句…这就是我正在做的。
我只需要确认一下,以确保执行的顺序是正确的。
下面的内容有意义吗,还是我遗漏了什么?
$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()
的返回值
两个问题:
- 不要用
@
抑制错误 - 永远不要假设db相关操作成功。总是检查错误情况,例如当您调用
->prepare()
时—您的SQL语句可能有语法错误,但您盲目地继续进行,好像一切都很完美。实际的查询执行也是如此——你的查询可能在语法上是100%正确的,但由于外部原因而失败。