1

如何修改此函数,以便它可以使用从数据库中获取的值,而不是用于生成 Select 选项的数组中指定的值?

该功能允许我区分选择元素的默认值(或“默认状态”,它们预设为最常用的选项)与用户通过单击表单元素主动选择该值时(表明他们做出了一个积极的决定,将其设置为该值)。该函数在初始形式下正常工作,我在这里发布了一个带有工作示例的小提琴: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 数组生成元素的选项,以便预先选择与数据库信息匹配的选项。下面的函数预先选择与数据库中的信息匹配的值(无论用户是否专门选择了该值,或者它是否仍处于“默认状态”),但是因为它需要删除“_default”字符串才能识别由$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 原样。

这个怎么样:

在调用之前echo printSelectOptions(...),找到$options键等于的条目$row_default['jeans'](永远不会以“_default”结尾)并将该条目的键更改为$row['jeans']. 您可能只是将其设置为原来的样子,但您可能正在对其进行更改,因此它现在以“_default”结尾。

您也将更$selected = $row_default['jeans'];改为$selected = $row['jeans'];.

现在,如果数据库中的值以“_default”结尾,则所选选项(并且只有所选选项)将以“_default”结尾。由于 JavaScript 保持不变,如果用户关注选择元素,它将删除“_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);

更新:

The JavaScript that executes when the select gains focus looks correct. 我在jsfiddle中对其进行了测试,它似乎工作正常。如果您查看 jsfiddle,我对其进行了一些更改,因此它反映了选项以“_default”结尾的事实。我也改变了.attr()to的用法.prop(),但原来的效果也很好。(如果你使用 jQuery >=1.6,你应该使用.prop()来改变元素属性,而不是.attr().)

如果 PHP 正在生成它在 jsfiddle 中的选择方式,那么 JavaScript 无法正常工作肯定还有另一个原因。也许有一个 JavaScript 错误导致事件处理程序无法连接。

于 2013-03-18T03:53:28.030 回答
-1

$row在您的代码中是一个数组,您使用 $row['jeans'] 访问字段并返回您需要放入$stmt->fetch()循环的所有行。

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 回答