1

可能重复:
在 MySQL 中查找重复记录

我是一个新手,试图使用此功能在数据库中查找重复项:

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);

......我正要用头撞到坚固的东西。由于某种原因,查询不会返回结果,我不知道为什么。

4

2 回答 2

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
}

阅读文档以获取更多示例。
无论如何,您的代码应该如下所示:

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
于 2012-10-10T12:12:38.780 回答
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 传递给您的函数,要么将其设为全局。

打开错误报告,这样您就可以看到代码中的错误在哪里。

于 2012-10-10T12:03:58.633 回答