0

你好我有这个功能:

function mail_exists($email){
    global $db;
    $email = sanitize($email);
    $query = $db->query("SELECT Email FROM table1 WHERE Email= '$email' ");
    $check = $query->num_rows;
    $query2 = $db->query("SELECT Email FROM table2 WHERE Email= '$email' ");
    $check2 = $query->num_rows;
    return ($check > 0 || $check2 > 0) ? true : false;
}

首先,我想知道如何通过仅使用一个查询来缩短它,第二件事是,为什么在使用两个查询时这不起作用?两个表都有不同的结构。在表 1 中,字段电子邮件为否。16 和表 2 是第 6 场。

多谢。

4

3 回答 3

2

首先,您*here在最后几行中犯了一个逻辑错误:$query->num_rows;应该是:$query2->num_rows;然后导致:

function mail_exists($email){
    global $db;
    $email = sanitize($email);
    $query = $db->query("SELECT Email FROM table1 WHERE Email= '$email' ");
    $check = $query->num_rows;
    $query2 = $db->query("SELECT Email FROM table2 WHERE Email= '$email' ");
    $check2 = $query2->num_rows; // *here
    return ($check > 0 || $check2 > 0) ? true : false;
}

其次,如果您要处理两个完全不同的上下文,则应该使用两个不同的查询。不需要时不要加入查询。如果您只是计算行数,您可以轻松做到:

function mail_exists($email){
    global $db;
    $email = sanitize($email);
    $query = $db->query("SELECT COUNT(*) FROM table1 WHERE Email= '$email' ");
    $query2 = $db->query("SELECT COUNT(*) FROM table2 WHERE Email= '$email' ");
    $count1 = $query->fetch_row();
    $count2 = $query2->fetch_row();
    return ($count1[0] || $count2[0]);
}

SQLCOUNT()函数可以为您提供最高效的行数计数方法。

于 2013-03-01T17:47:00.990 回答
0

使用 canUNION ALL返回总计数:

SELECT Email
FROM (
   SELECT Email FROM table1 WHERE Email= '$email'
   UNION ALL
   SELECT Email FROM table2 WHERE Email= '$email') t

或者您可以使用SELECT COUNT(Email)返回计数。

于 2013-03-01T17:39:11.387 回答
0

你可以试试:

SELECT t1.Email from table1 t1 inner join table2 t2 on t2.Email=t1.Email WHERE t1.Email = '$email'

进而:

return $query->num_rows > 0;

我不是 PHP 专家,所以你的里程可能会有所不同。

于 2013-03-01T17:43:03.647 回答