2011-06-16 86 views
1

所有,PHP PDO参数化查询MySQL的

我想写会查一下我的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 "[email protected]", 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

回答

3

+ 1'ed我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"); 
} 
+0

迷人,我我会立即尝试。 – JDelage 2011-06-16 03:24:28

+0

对不起,我的格式不好我现在有重大的键盘问题。 ;) – stefgosselin 2011-06-16 03:27:03

+0

是的,这似乎工作,我想知道他们为什么允许使用一个变量,但不是参数。无论如何,我可以处理它。谢谢。 – JDelage 2011-06-16 03:27:32