是否有必要在没有用户输入的情况下为select语句使用预准备语句?

时间:2016-03-22 22:11:48

标签: php

在我的申请开始时,我会检查帐户状态。这是我控制的内部检查,因为我在子域上提供应用程序。

我一直在用这个: // 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);
}

3 个答案:

答案 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编写的语句,因为编写这么多代码的复杂性和烦恼很少发生。