【问题标题】:PHP Variables in MYSQL Select using PDO [duplicate]使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]
【发布时间】:2012-09-30 21:15:57
【问题描述】:

可能重复:
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);

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

【问题讨论】:

  • stackoverflow.com/questions/854128 将帮助您在数据库中查找重复项。
  • 让我们确切地知道你在什么时候卡住了。
  • 我通过 post 从表单中获取数据,当我回显 $sql 时,语句看起来很好 SELECT * FROM user WHERE username = 'svensenn' 但我没有结果
  • 我在您的代码中没有发现错误检查,所以我想知道您遇到的具体问题是什么。数据库通常可以正常工作,如果您对结果没有信心,您应该查明查询数据库的问题首先出现的位置。这可能需要首先进行基本调试。请在脚本的开头添加error_reporting(~0); ini_set('display_errors', 1);。此外,您应该 enable error logging 并按照错误日志进行操作。
  • 谢谢你。我已经尝试使用 try/catch 尝试 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ,但不会出错。谢谢你的提示,我不知道该怎么做。

标签: php mysql pdo


【解决方案1】:

好的,你正在使用PDO,很好。但是,您的 sn-p 仍然很容易受到注入攻击:您仍在将原始用户输入传递给查询。此外,如果您只想找到找到的行数,请不要使用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

【讨论】:

  • ...感谢您的详细解释。
  • @SvenFischer:很高兴我能帮上忙。我必须说,这只是解决最“紧急” 的问题(让代码工作)。我遗漏了很多东西(比如为什么应该避免使用SELECT *,为什么不应该获取结果,......为什么 Bobby Tables 会发现你的代码非常有趣......)。只需谷歌这三件事,了解更多;我保证,这很值得你花时间
【解决方案2】:

您在函数中使用了对 $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 传递给您的函数,要么将其设为全局函数。

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

【讨论】:

  • 我有 include ("dbconnect.php");
  • 我应该在函数内部使用它吗?
  • 查看我的答案,将其传递给function uni($pdo, $field, $value) 之类的函数或将其设为global $pdo
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多