0

したがって、既にデータベースにある Units を編集するフォームがあります。ユニットへのサプライヤーを選択できる複数選択ドロップダウンがあります。ユニットに既に割り当てられているサプライヤーがドロップダウンで選択 (強調表示) されるようにする必要があるため、ユーザーは、ユニットに追加する新しいサプライヤーを ctrl キーを押しながらクリックするだけで済みます。

units_suppliers は、ユニット ID とサプライヤ ID のペアを含む、私が設定したジャンクション テーブルで、どのサプライヤがどのユニットに割り当てられているか、またその逆も同様です。

これは私が現在持っているコードですが、機能していません。異なる SQL クエリに基づいて 2 つの異なる配列を作成し、それらが同じサプライヤー名を持っているかどうかを比較しようとしました。同じ場合は、「selected」属性がタグに追加されました。しかし、それは機能していないようです。誰でも私を助けることができますか?

編集:クエリは両方とも正しい結果を生成するように見えるので、ネストされたループに問題があると思いますが、何が問題なのかわかりません。アドバイスをありがとう。

<td><select size=7 multiple="multiple" name="unitsuppliers[]">
<?php
$sql = "SELECT suppliers_id, supplier_name FROM suppliers GROUP BY supplier_name ORDER BY supplier_name";
$result = mysql_query($sql,$connection);

/* THIS PART FINDS OUT IF THE SUPPLIER SHOULD ALREADY BE HIGHLIGHTED IN THE LIST */
$sql2 = "SELECT suppliers.supplier_name 
            FROM suppliers, units_suppliers 
            WHERE units_suppliers.unit_user_id = ";
if(isset($old_details['unit_user_id'])){
    $sql2 .= " {$old_details['unit_user_id']} ";
} elseif(isset($_POST['old_unit_id'])){
    $sql2 .= " {$_POST['old_unit_id']} ";
} else {
    $sql2 .= " 0 ";
}
$sql2 .=    " AND suppliers.suppliers_id = units_suppliers.suppliers_id";

$result2 = mysql_query($sql2,$connection);

while ($row = mysql_fetch_array($result)) {
            echo "<option value=\"{$row['suppliers_id']}\" ";

            while ($in_junc_table = mysql_fetch_array($result2)) {
                foreach ($in_junc_table as $array){
                    if($array['supplier_name'] == $row['supplier_name']){
                        echo " selected ";
                    }
                }
            }
            echo " >"; 
            echo "{$row['supplier_name']}";                         
        }   
?>
4

1 に答える 1

0

関数ファミリは非推奨になったことを思い出してくださいmysql_*。PDO を使用してみてください。

ステートメントを使用しJOINて単一のクエリを実行できるようです。次のコードを試してください。

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>','<USERNAME>','PASSWORD');
$statement = $db->prepare("SELECT s.suppliers_id AS id, s.supplier_name AS name, u.unit_user_id AS user_id FROM suppliers s LEFT JOIN units_suppliers u USING suppliers_id WHERE (u.unit_user_id = :user_id OR u.unit_user_id IS NULL) GROUP BY s.supplier_name ORDER BY s.supplier_name");

if (isset($old_details['unit_user_id'])) {
    $user_id = $old_details['unit_user_id'];
}
else if (isset($_POST['old_unit_id'])) {
    $user_id = $_POST['unit_user_id'];
}
else {
    $user_id = 0;
}

$statement->execute(array(
    ':user_id' => $user_id
));

$supliers = $statement->fetchAll(PDO::FETCH_ASSOC);

foreach ($suppliers as $supplier) { ?>
    <option value="<?php echo intval($supplier['id']) ?>" <?php  echo ($supplier['user_id'] == $user_id ? 'selected="selected"' : '') ?>><?php echo htmlspecialchars($supplier['name']) ?></option>
<?php }

PDO なし:

/**
 * Escape values that will be part of the query
 */
if (isset($old_details['unit_user_id'])) {
    $user_id = intval($old_details['unit_user_id']);
}
else if (isset($_POST['old_unit_id'])) {
    $user_id = intval($_POST['unit_user_id']);
}
else {
    $user_id = 0;
}

$suppliers = array();

$query = "SELECT s.suppliers_id AS id, s.supplier_name AS name, u.unit_user_id AS user_id FROM suppliers s LEFT JOIN units_suppliers u USING suppliers_id WHERE (u.unit_user_id = $user_id OR u.unit_user_id IS NULL) GROUP BY s.supplier_name ORDER BY s.supplier_name";
$result = mysql_query($query,$connection);

if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
        $suppliers []= $row;
    }

    mysql_free_result($result);
}

foreach ($suppliers as $supplier) { ?>
    <option value="<?php echo intval($supplier['id']) ?>" <?php  echo ($supplier['user_id'] == $user_id ? 'selected="selected"' : '') ?>><?php echo htmlspecialchars($supplier['name']) ?></option>
<?php }
于 2013-06-25T18:39:26.407 に答える