这是有问题的 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 CLI 中运行良好。
另一方面,如果我将查询字符串 $sql 替换为:
$sql = "SELECT id, first, last, email, userid FROM users WHERE $criteria='$value'";
并注释掉 bindValue 调用,PHP 中的每一件事都运行良好,并且查询按需要返回。
但问题是,这些函数参数是用户提交的表单数据,这意味着该解决方案容易受到 SQL 注入的攻击。
第一个查询表单有什么问题?