1

safe_workers, safe_companies and safe_customersさまざまなアカウントの種類を格納するために使用される3 つのテーブルがあります。ログイン時に、3 つのテーブルすべてで LoginEmail 列と LoginPassword 列を検索し、ログイン ページから渡されたログイン フォームに基づいて一致を返すクエリが必要です。

私は MySQL の初心者で、次のことを試しましたが、明らかにエラーが返されます。

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

テーブルを比較したくないだけで一致させたい

4

3 に答える 3

0

特定のユーザーのLoginEmailとLoginPassの値は、3つのテーブルのうちの1つにのみ存在するという質問の詳細に基づいて仮定しています。その場合は、以下のような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';

ただし、これはあらゆる種類の問題を引き起こす可能性があります。

于 2013-03-12T20:37:39.340 に答える
0

あなたの質問をよく理解している場合:

あなたが探しているのは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'] . "'

そうでない場合は、テーブル構造などの詳細情報を提供してください。

于 2013-03-12T20:05:12.390 に答える
0

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 データをエスケープしています。そのマニュアルを見てください。

于 2013-03-12T20:06:06.223 に答える