MySQL 的 PHP PDO 参数化查询

标签 php mysql pdo

全部,

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

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

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

<?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");
    }
?>

这行不通。有效的查询是我直接在查询中指定列名而不是使用参数,但我失去了我寻求的灵 active :

<?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 是因为我对 PDO 的热爱!

关于你的issue friend ,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");
}

关于MySQL 的 PHP PDO 参数化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6366661/

相关文章:

javascript - 当尝试在 JS 中单击时更改 V 形方向时,只有 1 个 V 形发生变化。

javascript - 如何获取data-esid属性并POST?

PHP循环遍历记录非常慢

bash - 从 bash 脚本运行最新的 mysqldump

php - 在 mysql 中编写查询时

javascript - 使用php从库中获取行数据

php - 数据库未更新值,空白页

php - CodeIgniter 路由在 Nginx 下不工作

php - 没有这样的文件或目录错误(Laravel/Homestead)

php - MySQLI通过socket连接本地服务器错误