【问题标题】:Multiple ways to identify user / mysql, pdo, php多种方式识别用户/mysql、pdo、php
【发布时间】:2014-08-20 11:51:38
【问题描述】:

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

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

我想要的是查询适用于所有 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)。

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

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    除非 users 表很大,或者非常慢,否则最好跳过自动检测并使用一个查询

    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
    

    【讨论】:

    • 哇。这很简单。我怎么从来没有这么容易做到的……我现在觉得很愚蠢。
    【解决方案2】:

    您可以在查询中使用 OR:

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

    【讨论】:

      【解决方案3】:
      SELECT * FROM users
      ...
      WHERE (email = ? OR userid = ? OR username = ?)
      

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多