PHP PDO参数化MySQL查询

时间:2011-06-16 02:59:09

标签: php mysql pdo

所有

我正在尝试编写一个函数来检查我的users表中是否已存在用户名或用户电子邮件。这将在用户注册期间用作检查。

我希望能够使用相同的功能来检查是否存在电子邮件或名称。我会通过发送2个字符串变量来使用该函数,$ tableColName表示db表中的列(所以“userName”或“userEmail”,以及$ userIdentifier,表示用户名或用户电子邮件I想要查询。

我写了以下内容(修改为独立):

<?php
    $dbHost="localhost";
    $dbName="project";
    $dbUser="admin";
    $dbPassword="abcd";
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $userIdentifier="apple";  // Or "apple@gmail.com", which is an email
    $tableColName="userName"; // Or "userEmail"
    $sth=$dbh->prepare("SELECT * FROM users WHERE :tableColName = :userIdentifier");
            $sth->bindParam(":tableColName", $tableColName);
            $sth->bindParam(":userIdentifier", $userIdentifier);
            $sth->execute();
    print("PDO::FETCH_ASSOC: ");
    print("Return next row as an array indexed by column name");
    echo "</br>";
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    print_r($result);
    echo "</br>";
    if ($result==null){
        print("FALSE - result is null");
    }else{
        print("TRUE - result isn't null");
    }
?>

这不起作用。什么有效是一个查询,我直接在查询中指定列名而不是使用参数,但我失去了我寻求的灵活性:

<?php
    $dbHost="localhost";
    $dbName="project";
    $dbUser="admin";
    $dbPassword="abcd";
    $dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $userName="apple";
    $sth=$dbh->prepare("SELECT * FROM users WHERE userName = :userIdentifier"); // Cannot be used for userEmail search.
            $sth->bindParam(":userIdentifier", $userName);
            $sth->execute();
    print("PDO::FETCH_ASSOC: ");
    print("Return next row as an array indexed by column name");
    echo "</br>";
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    print_r($result);
    echo "</br>";
    if ($result==null){
        print("FALSE - result is null");
    }else{
        print("TRUE - result isn't null");
    }
?>

我做错了什么?

谢谢,

JDelage

1 个答案:

答案 0 :(得分:3)

+ 1'因为我对PDO的热爱!

对于您的问题朋友,表名和列名不能作为PDO中的参数传递。 Refer to this post for more info

我相信使用好的旧变量(当然是过滤了!)会对你有好处。

 $tableName = "email";
 $sth=$dbh->prepare("SELECT * FROM users WHERE $tableName = :userIdentifier");

        $sth->bindParam(":userIdentifier", $userIdentifier);
        $sth->execute();

未经测试,但它应该给你一个开始。此外,确实要记住过滤$ tableName ,一个(很多)简单的方法,这可以通过一个包含允许的表名的白名单的简单数组来完成,这是一个简单的例子:

$validTables = array('email', 'username');

if(!in_array($tableName, $validTables)){ 
    throw new Exception("Invalid Table Name");
}