所有
我正在尝试编写一个函数来检查我的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
答案 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");
}