【问题标题】:MYSQL Lookup Email in 3 Tables from PHP variableMYSQL 在 PHP 变量的 3 个表中查找电子邮件
【发布时间】:2013-02-28 12:38:00
【问题描述】:

我有三个表safe_workers, safe_companies and safe_customers,用于存储不同的帐户类型。登录后,我需要一个查询来查找所有三个表中的 LoginEmail 和 LoginPassword 列,并根据登录页面传递的登录表单返回匹配项。

我是 MySQL 的初学者并尝试了以下方法,但显然它返回了错误。

select safe_companies.LoginEmail,ID 
from safe_companies,safe_customers 
WHERE LoginEmail='.$_POST[InEmail].' AND LoginPass= '.$_POST[InPass].'

我不想比较表只是想匹配

【问题讨论】:

  • 我们需要知道你的表的连接条件是什么。之后这是一个非常简单的查询。

标签: php mysql forms login


【解决方案1】:

如果我能很好地理解您的问题:

你要找的是http://dev.mysql.com/doc/refman/5.0/en/join.html

如果两个表都有一个名为 LoginEmail 的列。

SELECT
    sco.LoginEmail
FROM
   safe_companies AS sco
INNER JOIN
    safe_customers AS scu ON (sco.LoginEmail = scu.LoginEmail)
WHERE
    sco.LoginEmail = '" . $_POST['InEmail'] . "' AND
    scu.LoginPass = '" . $_POST['InPass'] . "'

如果没有,请提供更多信息,例如表结构。

【讨论】:

    【解决方案2】:

    您可以使用UNION 语句来完成此操作。试试这个:

    $dbh = new PDO('...');
    
    $where = 'WHERE LoginEmail = :email AND LoginPass = :pass';
    $query = [];
    foreach (['safe_workers', 'safe_companies', 'safe_customers'] as $table) {
        $query[] = "(SELECT LoginEmail, ID FROM {$table} {$where})";
    }
    
    /*
     * This will become something like this:
     * (SELECT LoginEmail, ID FROM safe_workers WHERE LoginEmail = :email AND LoginPass = :pass)
     * UNION
     * (SELECT LoginEmail, ID FROM safe_companies WHERE LoginEmail = :email AND LoginPass = :pass)
     * UNION
     * (SELECT LoginEmail, ID FROM safe_customers WHERE LoginEmail = :email AND LoginPass = :pass)
     */
    $stmt = $dbh->prepare(implode(' UNION ', $query));
    
    $stmt->bindParam(':email', $_POST['inEmail']);
    $stmt->bindParam(':pass', $_POST['inPass']);
    if ($stmt->execute()) {
        var_dump($stmt->fetch(PDO::FETCH_ASSOC));
    }
    

    注意:我正在使用 PDO 来准备语句并转义 POST 数据。看看它的manual

    【讨论】:

    • 谢谢 vcampitelli!该解决方案有效!我还不了解 JOIN,但这是我接下来要研究的内容。
    【解决方案3】:

    我根据您的问题详细信息做出一个假设,即特定用户的 LoginEmail 和 LoginPass 值将仅存在于三个表之一中。如果是这种情况,您可以使用如下所示的 UNION。

    SELECT a.LoginEmail, a.ID
    FROM (
        SELECT LoginEmail, ID FROM safe_workers
        UNION
        SELECT LoginEmail, ID FROM safe_companies
        UNION
        SELECT LoginEmail, ID FROM safe_customers
    ) AS a
    WHERE a.LoginEmail = 'InEmail' AND a.LoginPass= 'InPass';
    

    但是,这可能会导致各种不良情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2020-12-10
      • 2012-08-13
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多