gpt4 book ai didi

php - PHP 中的空 MySQL 查询结果

转载 作者:行者123 更新时间:2023-11-29 06:52:35 27 4
gpt4 key购买 nike

这是有问题的 PHP 函数:

//Get data associated with $criteria from db
function getUserData($criteria, $value) {
//obtain user data from db based on $criteria=$value
global $pdo;
//echo $criteria . " " . $value;
try {
$sql = 'SELECT id, first, last, email, userid FROM users WHERE :criteria= :value';
//var_dump($sql);
$st = $pdo->prepare($sql);
$st->bindValue(':criteria', $criteria);
$st->bindValue(':value', $value);
$st->execute();
}
catch (PDOException $ex) {
$error = "Failed to obtain user data.";
$errorDetails = $ex->getMessage();
include 'error.html.php';
exit();
}
$row = $st->fetch();
//var_dump($row);
if ($row)
{
$userdata = array();
$userdata['id'] = $row['id'];
$userdata['first'] = $row['first'];
$userdata['last'] = $row['last'];
$userdata['email'] = $row['email'];
$userdata['userid'] = $row['userid'];
return $userdata;
}
return FALSE;
}

我使用此函数返回与其中特定列关联的整行数据。

在当前状态下使用时,调用 getUserData("email", "John_Stewart_2013") 时,它返回 false,表示空结果,而相同的查询在 MySQL 中运行良好命令行界面。

另一方面,如果我将查询字符串 $sql 替换为:

$sql = "SELECT id, first, last, email, userid FROM users WHERE $criteria='$value'";

并注释掉 bindValue 调用,在 PHP 中一切都运行良好,并且查询按预期返回。

但问题是,这些函数参数是用户提交的表单数据,这意味着该解决方案容易受到 SQL 注入(inject)攻击。

第一个查询表单有什么问题?

最佳答案

恐怕不能将 bindValue 与列名一起使用。

如果您考虑什么是准备好的语句,这应该会变得更加明显。基本上,当您使用数据库服务器准备一条语句时,它会预先为查询创建一个执行计划,而不是在运行查询时生成它。这不仅使它更快而且更安全,因为它知道它的去向,以及它将使用的数据类型和将要输入的数据类型。

如果列名/表名以任何方式可绑定(bind),它就无法生成此执行计划,从而使整个准备语句的想法有些多余。

最好的方法是使用这样的混合查询:

$sql = "SELECT id, first, last, email, userid FROM users WHERE $criteria = :value";

我希望 $criteria 列无论如何都不是完全来自客户端的自由形式。如果是,您最好将其限制为一组特定的允许选项。一种简单的方法是构建一个允许列的数组,并使用 in_array 检查它是否有效,如下所示:

$allowed_columns = array('email', 'telephone', 'somethingelse');
if (!in_array($criteria, $allowed_columns))
{
$error = "The column name passed was not allowed.";
$errorDetails = $ex->getMessage();
include 'error.html.php';
exit;
}

关于php - PHP 中的空 MySQL 查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com