是否需要在没有用户输入的情况下对选择语句使用预准备语句


Is it necessary to use a prepared statement for a select statement without user input?

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

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

必要,否。 推荐,是的。 但是,查询当前编写的方式不会从预准备语句中获得任何好处。 相反,它应该是:

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语句。 参数化查询的要点是将语句与参数明确分开。

请参阅如何在 PHP 中防止 SQL 注入?以获取有关防止 SQL 注入的更多信息。

不,当没有用户输入时,不需要。但是,当有输入时,有时使用预准备语句仍然很有用,即使它不是用户输入。这是因为准备语句可以更有效地执行,如果每次使用不同的数据运行多次。

这个问题会有很多意见,我会把我的添加到列表中......

我个人总是使用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准备的语句,因为编写如此多的代码而很少发生的复杂性和烦恼。

相关文章: