1

<select>データベースの配列を使用するために要素に動的にデータを入力するために使用している関数を変更しようとしています。元の関数は、ハードコードされた配列を使用して要素にデータを入力し、db値に一致するオプションを事前に選択しました。

改訂された関数は要素を作成しますが、dbから最初の値を追加するだけです。<select>要素に追加する必要のあるすべての値をループするように変更するにはどうすればよいですか?

PHP関数とクエリ

<?php
function printSelectOptions($dataArray, $currentSelection) {
    foreach ($dataArray as $key => $value) {
        echo '<option ' . (($key == $currentSelection)) . ' value="' . $key . '">' . $value . '</option>';
    }
}
try {  
    $stmt = $conn->prepare("SELECT * FROM student");  
    $stmt->execute();
    }catch(PDOException $e) {
    echo $e->getMessage();
} 
$row = $stmt->fetch();
?>

選択要素にデータを入力

<select name="fname">
    <?php
        echo printSelectOptions(array($row['fname'])); 
    ?>
</select>

要素を設定するための元の関数とコード

function printSelectOptions($dataArray, $currentSelection) {
    foreach ($dataArray as $key => $value) {
        echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>';
    }
}

<select name="fname">
    <?php
        $options = array("John"=>"John", "Mary"=>"Mary", "Elizabeth"=>"Elizabeth");
        $selected = $row['fname'];
        echo printSelectOptions($options, $selected); 
    ?>
</select>
4

1 に答える 1

1

を介して1つの行のみをフェッチしたためfetch()、関数に渡されるのは1つの値のみですprintSelectOptions()。代わりに、を介してすべての行を取得しfetchAll() 、関数を変更して、完全な配列と、印刷元の列名(配列キー)である文字列を受け取ります。

// All rows into $rows...
$rows = $stmt->fetchAll();

// Make the function accept the full 2D array, and 
// a string key which is the field name to list out:
function printSelectOptions($dataArray, $currentSelection, $fieldname) {
    // String to hold output
    $output = '';
    foreach ($dataArray as $key => $value) {
        // Rather than echo here, accumulate each option into the $output string
        // Use the $fieldname as a key to $value which is now an array...
        $output .= '<option ' . (($key == $currentSelection)) . ' value="' . $key . '">' . htmlspecialchars($value[$fieldname], ENT_QUOTES) . '</option>';
    }
    return $output;
}

次に、関数を次のように呼び出します。

echo printSelectOptions($rows, $currentSelection, 'fname');

現在のように、オプションのvalue属性には、ゼロから番号が付けられる配列キーが入力されます。これは元の配列バージョンと似ていますがid、キー列のように別の列名を指定する方が便利な場合があります。

// This one also takes a $valuename to use in place of $key...
function printSelectOptions($dataArray, $currentSelection, $valuename, $fieldname) {
    // String to hold output
    $output = '';
    foreach ($dataArray as $key => $value) {
        // Rather than echo here, accumulate each option into the $output string
        // Use the $fieldname as a key to $value which is now an array...
        $output .= '<option ' . (($value[$valuename] == $currentSelection)) . ' value="' . $value[$valuename] . '">' . htmlspecialchars($value[$fieldname], ENT_QUOTES) . '</option>';
    }
    return $output;
}

そして、次のように呼ばれます:

    echo printSelectOptions($rows, $currentSelection, 'id', 'fname');
于 2013-03-27T01:36:39.787 に答える