1

選択オプションの生成に使用される配列で指定された値の代わりに、データベースからフェッチされた値を使用できるように、この関数を変更するにはどうすればよいですか?

この関数を使用すると、選択要素のデフォルト値(または最も一般的に選択されるオプションに事前設定されている「デフォルト状態」)と、ユーザーがフォーム要素をクリックしてその値をアクティブに選択した場合(その値に設定したままにするという積極的な決定を行ったことを示します)。この関数は初期形式で正しく機能します。実際の例を含むフィドルをここに投稿しました:http://jsfiddle.net/chayacooper/JHAPp/4/

<script>
$('select').focus(function () {
    var option = $(this).find("option[value*=default]");
    option.attr('value', option.attr('value').replace(/_default/g, ''));
});
</script>
<select name="jeans">
    <option value="$0">$0</option>
    <option value="$50_default" selected="selected">$50</option>
    <option value="$100">$100</option>
    <option value="$150">$150</option>
</select>

ユーザーが自分の情報を確認および編集できるアカウントページで機能するように機能を調整するのに問題があります。関数の最初の使用では、オプションの値を手動で変更できます(つまり、に置き換えvalue="$50"ますvalue="$50_default"が、アカウントページは以下のprintSelectOptions関数で$options配列を使用してdb情報に一致するオプションを事前に選択するための要素のオプション。以下の関数は、データベース内の情報に一致する値を事前に選択します(ユーザーが値を具体的に選択したかどうか、または値がまだ「デフォルト状態」であるかどうかに関係なく)。ただし、$options変更されているかどうかに関係なく、「_default」文字列なしで値を送信している配列によって生成された正しいオプションを識別します。

これと連携して動作するようにjs関数を変更するには、ユーザーが要素に焦点を合わせていない場合に、値が「デフォルト状態」(「_default」を使用してデータベースからフェッチされた場合)にデフォルト値を送信するようにするにはどうすればよいですか? ' ストリング)?

<?php
    try {  
        $stmt = $conn->prepare("SELECT * FROM price WHERE user_id = :user_id");  
        $stmt->bindValue(':user_id', $user_id); 
        $stmt->execute();
    }  catch(PDOException $e) {echo $e->getMessage();}
    $row = $stmt->fetch();
    $search_default = array('_default');
    $replace_default = array('');
    $row_default = str_replace($search_default, $replace_default, $row);

    // This function selects the option matching the value in the db
    function printSelectOptions($dataArray, $currentSelection) {
        foreach ($dataArray as $key => $value) {
            echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>';
        }
    }
?>
<select name="jeans">
<?php

    // Generates a <select> element with the options specified in this array
    $options = array("Null"=>"", "$0"=>"$0", "$50"=>"$50", "$100"=>"$100", "$150"=>"$150");
    $selected = $row_default['jeans'];

    // Pre-selects the option matching the db information
    echo printSelectOptions($options, $selected); 
?> 
</select> 
4

2 に答える 2

1

PHPコードの変更を検討し、JavaScriptはそのままにしておくべきだと思います。

これはどう:

を呼び出す前に、キーが等しいエントリ( "_default"で終わることはありません)をecho printSelectOptions(...)見つけて、そのエントリのキーをに変更します。すでに設定しているだけかもしれませんが、「_default」で終わるように変更している可能性があります。$options$row_default['jeans']$row['jeans']

また、に変更$selected = $row_default['jeans'];$selected = $row['jeans'];ます。

これで、データベースの値が「_default」で終わる場合、選択されたオプション(および選択されたオプションのみ)は「_default」で終わります。JavaScriptは同じままなので、ユーザーがselect要素にフォーカスすると、「_default」が削除されます。

コードは次のようになります。

// This is a helper function that replaces a key while maintaining the entry's
// position in the array. It does not modify the given array, but returns a
// new array.
function replaceKey($array, $oldKey, $newKey) {
    $newArray = array();
    foreach ($array as $key => $value) {
        $newArray[($key === $oldKey) ? $newKey : $key] = $value;
    }
    return $newArray;
}

$options = array("Null"=>"", "$0"=>"$0", "$50"=>"$50", "$100"=>"$100", "$150"=>"$150");

// We will change the key for the entry in $options so it includes "_default" if
// the value from the database includes "_default". We need to do this only if
// $row['jeans'] ends with "_default". That will be the case if these two are
// different.
if ($row_default['jeans'] !== $row['jeans']) {
    $options = replaceKey($options, $row_default['jeans'], $row['jeans']);
}

// Now we can use the value from the db for setting the selected value, rather
// than the value that had "_default" removed. 
$selected = $row['jeans'];

// Pre-selects the option matching the db information.
echo printSelectOptions($options, $selected);

アップデート:

選択がフォーカスを取得したときに実行されるJavaScriptは正しく見えます。jsfiddleでテストしましたが、正常に動作しているようです。jsfiddleを見ると、オプションが「_default」で終わるという事実を反映するように変更しました。の使い方もに変更しました.attr().prop()、オリジナルも同様に機能しました。(jQuery> = 1.6を使用している場合は、.prop()要素のプロパティを変更するために使用する必要があります。ではありません.attr()。)

PHPがjsfiddleでの選択を生成している場合は、JavaScriptが機能していない別の理由があるはずです。おそらく、イベントハンドラーが接続されない原因となっているJavaScriptエラーがあります。

于 2013-03-18T03:53:28.030 に答える
-1

$row$stmt->fetch()コードには配列があり、$ row ['jeans']を使用してフィールドにアクセスし、ループに入れる必要のあるすべての行を返します。

while ($row = $stmt->fetch()) {
    $row_default = str_replace($search_default, $replace_default, $row['jeans']);
    echo '<option value="' . $row_default . '">' . $row_default . '</option>';
}

これがフェッチドキュメントです

于 2013-03-17T20:48:48.187 に答える