我是一名尝试使用此功能在数据库中查找重复项的新手:
function uni($field, $value) {
$sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
$result = $pdo->query($sql);
$rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
return count($rows);
}
$username = $_POST['username'];
$result = uni("username", $username);
...我即将对抗坚实的事情。由于某种原因,查询不会返回结果,我不知道为什么。
答案 0 :(得分:2)
好的,所以你正在使用PDO
,好的。但是,您的代码片段仍然对注入攻击持开放态度:您仍然将原始用户输入传递给查询。另外,如果您想要的只是找到的行数,并且没有对完整的结果集进行计算来计算它们,请不要使用SELECT *
!
function uni($field,$value)
{
$db = new PDO();//make connection, which you don't seem to do
//or (not so good approach):
//global $db;
//Best approach would be to pass the connection to the function, as an extra argument, though
$stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
if ($stmt->execute(array(':value' => $value)))
{
return $stmt->rowCount();
}
//query failed, throw errors or something
}
阅读docs了解更多示例。
无论如何,您的代码完全应该如下所示:
function uni($field,$value,$db)
{
$stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
if ($stmt->execute(array(':value' => $value)))
{
return $stmt->rowCount();
}
return false;
}
$username = $_POST['username'];
$result = uni('username', $username,$pdo);//<--pass connection
答案 1 :(得分:1)
您正在使用函数内的$pdo
对象的引用,但未定义$pdo
对象。
function uni($field, $value) {
$sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
$result = $pdo->query($sql);
// ^^ undefined object
$rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
return count($rows);
}
将$ pdo传递给您的函数,或将其设为全局函数。
启用错误报告功能,以便查看代码中的错误位置。