使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]

Posted

技术标签:

【中文标题】使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]【英文标题】:PHP Variables in MYSQL Select using PDO [duplicate] 【发布时间】: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);

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

【问题讨论】:

***.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); ,但不会出错。谢谢你的提示,我不知道该怎么做。 【参考方案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

以上是关于使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sql pdo php 在变量中的位置

php中的PDO函数库详解

PHP中的PDO函数库

使用 PHP PDO 准备语句和 MySQL 选择字段为空的行

关于更新事务的 PHP PDO 选择的说明

php中的Mysqlnd、PDO和PDO_Mysql扩展有啥区别?