在我的申请开始时,我会检查帐户状态。这是我控制的内部检查,因为我在子域上提供应用程序。
我一直在用这个:
// Retrieve account status for application
$query = "SELECT `client_account_status` FROM `version_control` WHERE id = '1' ";
然而,当我适应准备好的陈述时,我很好奇,如果没有用户输入来检查这是否绝对必要?
$stmt = mysqli_stmt_init($link);
if (mysqli_stmt_prepare($stmt, 'SELECT client_account_status FROM version_control WHERE id = 1')) {
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $client_account_status);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
答案 0 :(得分:3)
必要,不。推荐,是的。但是,当前编写查询的方式不会从准备好的语句中获益。相反它应该是:
mysqli_stmt_prepare($stmt,
'SELECT client_account_status FROM version_control WHERE id = ?'));
mysqli_stmt_bind_param($stmt, 'i', 1);
mysqli_stmt_execute($stmt);
您的初始版本的问题是,mysql无法知道您的查询的哪个部分是参数,哪个部分是SQL语句。参数化查询的要点是明确地将语句与参数分开。
有关阻止SQL注入的详细信息,请参阅How can I prevent SQL injection in PHP?。
答案 1 :(得分:2)
不,没有用户输入时没有必要。尽管有输入,但即使它不是用户输入,有时仍然可以使用预准备语句。这是因为如果每次使用不同的数据运行很多次,准备一个语句就可以更有效地执行它。
答案 2 :(得分:1)
这个问题会有很多意见,我会把我的意见添加到列表中......
我个人总是选择PDO或Doctrine的DBAL库。
使用类似DBAL类的查询将如此发生:
$result = $db->fetchColumn('SELECT client_account_status FROM version_control WHERE id = :id', [
'id' => $id
]);
在PDO中它可以如此简单:
$pdo->prepare('SELECT client_account_status FROM version_control WHERE id = :id');
$result = $pdo->execute(array(':id' => $id));
它总是易于阅读,并且每次您想要对数据库执行某些操作时,并不要求您编写5行代码。
你可以同时拥有安全性和效率,并且看起来你如何问你的问题,你只想避免使用mysqli编写的语句,因为编写这么多代码的复杂性和烦恼很少发生。