MYSQL中的PHP变量选择使用PDO

时间:2012-10-10 11:54:30

标签: php mysql pdo

  

可能重复:
  Find duplicate records in 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);

...我即将对抗坚实的事情。由于某种原因,查询不会返回结果,我不知道为什么。

2 个答案:

答案 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传递给您的函数,或将其设为全局函数。

启用错误报告功能,以便查看代码中的错误位置。