0

2 つのテーブルを比較してドロップダウン メニューにデータを入力しようとしています。1 つは上司と従業員番号のリスト、もう 1 つは従業員番号と名前です。各監督者と従業員の番号を取得し、ドロップダウン メニューの従業員名に変換する必要があるため、基本的には

TABLE payroll_employeelist

スーパーバイザー従業員

1234 3456

1234 2239

1234 123

2910 338

2910 3901

TABLE 給与_ユーザー

番号名

3456 ジョン・スミス

2239 メリージェーン

123 ジョー・ブラウン

スーパーバイザは、$usernumber と呼ばれるセッション変数によって識別されます。私がこれまでに持っていて、1つの結果(1つだけ!)を返しているのは次のとおりです:

if ($loademployees == 1){
echo "<option value=\"base\">---- Employee Name ----</option>";

        $query = "SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist WHERE supervisor='$usernumber' LEFT JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number ";

        $result = mysql_query($query);
        while ($row = mysql_fetch_array($result)) {
            echo "<option value=\">" . $row{'name'} . "</option>";
        }
        echo "</select><br>";
        }

誰でもこれを手伝ってもらえますか?JOIN で面白いことをしたような気がします。ドロップダウンの従業員名のリストのように見えるはずです。

アップデート:

私が今持っているものは次のとおりです。

if ($loademployees == 1){
    echo "<option value=\"base\">---- Employee Name ----</option>";

       $query = "SELECT payroll_employeelist.supervisor, payroll_employeelist.employee, payroll_users.number, payroll_users.name 
    FROM payroll_employeelist 
    INNER JOIN payroll_users 
    ON payroll_employeelist.employee = payroll_users.number 
    WHERE supervisor = '$usernumber' ";

    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result)) {
        echo "<option value=\">" . $row['name'] . "</option>";

    }
    echo "</select><br>";
    }

これにより、テスト データ セット内の 3 つのレコードのうちの 1 つ、つまり中央のレコードが 1 つだけ正常に返されます。ちなみに、$usernumber は内部で生成されるため、インジェクションはできません。

最終更新- 解決済み 問題は信じられないかもしれません

echo "</select><br>"; 

while ループの結果をエコーする前にそれをエコーし​​ていたので、オプション リストが空であると考えました。ランダムに出現する 1 人の従業員については説明できませんが、現在は機能しています。

4

6 に答える 6

1

テーブルに依存する列が 2 つあるためpayroll_users、テーブルを 2 回結合する必要があります。payroll_employeelist

SELECT  sup.Name SupervisorName,
        empName EmployeeName
FROM    payroll_employeelist a
        INNER JOIN payroll_users sup
            ON a.Supervisor = sup.number
        INNER JOIN payroll_users emp
            ON a.Employee = emp.Number
WHERE   sup.Supervisor = '$usernumber'

補足として、変数のSQL Injection値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。PreparedStatements

于 2013-04-15T14:09:19.073 に答える
0

これはおそらく、結合条件を WHERE 内に配置したためですが、おそらく外部に配置するつもりでした:

SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name
INNER JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number
FROM payroll_employeelist 
WHERE supervisor='$usernumber' 

また、使用LEFT JOINするとどのユーザーにも所属していない従業員も取得できます。エスケープに関するいくつかのこと:

$query = "SELECT ... WHERE supervisor='$usernumber'  ... ";

$usernumberこれが Web リクエストからのものである場合、SQL インジェクションの影響を受けやすくなります。mysql_real_escape_string()エスケープするか、PDO / mysqli に切り替えて、代わりに準備済みステートメントを使用することを検討してください。

    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result)) {
        echo "<option value=\">" . $row{'name'} . "</option>";
    }

同様にエスケープする必要が$row['name']あり、中括弧も使用しないでください。

        echo "<option value=\">" . 
            htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8') . 
            "</option>";
于 2013-04-15T14:09:49.917 に答える
0

シンタックス に誤りがあります。
チェックしてください

    $query = "SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist WHERE supervisor='$usernumber' LEFT JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number ";

する必要があります

    $query = "SELECT payroll_employeelist.`employee`, payroll_users.`number`, payroll_users.`name` FROM `payroll_employeelist` LEFT JOIN `payroll_users` ON payroll_employeelist.employee` = payroll_users.`number` WHERE `supervisor` = '$usernumber' ";

これについて

WHERE `supervisor` = '$usernumber' "; 

スーパーバイザーはどのテーブルにいますか? payroll_employeelistプレフィックスまたはで修正する必要がありますpayroll_users

ドキュメントはこちら

mysql_また、関数は非推奨であることを覚えておきたいので、新しいプロジェクトに切り替えるmysqliPDO、新しいプロジェクトに切り替えることをお勧めします。

于 2013-04-15T14:10:26.453 に答える
0
SELECT 

tb1.supervisor,
tb1.employee,
tb2.name

FROM

payroll_employeelist AS tb1
INNER JOIN payroll_users AS tb2

ON tb1.employee = tb2.number 

一致しない値なしで完全一致が必要な場合は、LEFT JOIN の代わりに INNER JOIN が必要です。

于 2013-04-15T14:10:52.843 に答える
0

使用する

SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist LEFT JOIN payroll_users ON payroll_employeelist.employee = payroll_users.number WHERE supervisor = '$usernumber' 

代わりは。

于 2013-04-15T14:11:36.333 に答える