多种方式来识别用户/ mysql,pdo,php

时间:2014-08-20 11:51:38

标签: php mysql sql pdo

我有一个数据库表users。每个用户至少拥有userid。另外两个可选值是emailusername(必须包含字母,因此它永远不会混合到用户ID! - 我知道)。他们都是独一无二的。

我有一种方法可以从users表中获取详细信息(行)。 Param $userIdentifier可以是用户ID,电子邮件或用户名。

我想要的是,该查询适用于所有3种类型(主要是它的用户ID)。

$user->getData(111203432);
$user->getData("myemail@admin.com");
$user->getData("Admin");

if email: *WHERE email=...*
if userid: *WHERE userid=...*
if username: *WHERE username=...*

现在我的查询无效(并且缺少检查用户名)。我尝试过各种各样的东西,这是最新的:

if(is_numeric($userIdentifier)) {
    // also tried if_int
    $sql_getUserByValue = "users.userid";
    $bindType = PDO::PARAM_INT;
} elseif(filter_var($userIdentifier, FILTER_VALIDATE_EMAIL)) {
    $sql_getUserByValue = "users.email";
    $bindType = PDO::PARAM_STR;
} else {
    return false; // user not found
}

global $main_dbconnection;

$query = $main_dbconnection->prepare("SELECT * FROM users 
    ..... some inner joins here because different user types in diff. tables ...
    WHERE $sql_getUserByValue=:userIdentifier");

$query->bindParam(':userIdentifier', $userIdentifier, $bindType);
$query->execute();
// Fetch result if found >>>

也没有给出任何错误。找到0行(方法返回false)。

我有什么想法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

除非用户表格很大或非常慢,否则最好跳过自动检测并对所有人使用单一查询

SELECT * FROM USERS WHERE users.userid = x
UNION
SELECT * FROM USERS WHERE users.email= x
UNION
SELECT * FROM USERS WHERE users.username = x

或者在一个查询中,但可能更慢(取决于您的索引)

SELECT * FROM USERS WHERE users.userid = x
OR
users.email= x
OR
users.username = x

答案 1 :(得分:1)

您可以在查询中使用OR:

SELECT * FROM users ... WHERE email=... OR userid=... OR username=...

答案 2 :(得分:1)

SELECT * FROM users
...
WHERE (email = ? OR userid = ? OR username = ?)