提交(POST)后在php生成的表单中保留选择

Posted

技术标签:

【中文标题】提交(POST)后在php生成的表单中保留选择【英文标题】:Keep selections in php generated form after submit (POST) 【发布时间】:2011-04-27 14:56:38 【问题描述】:

我目前正在使用 php 来使用来自数据库的选择来填充表单。用户在选择样式表单中选择选项并提交,这会在使用第二个提交按钮完成交互之前更新表单下方的选择摘要。

我的问题是,每次用户使用第一次提交时,之前的选择都不会保留。他们必须再次检查整个表格。

有没有办法在不使用 php if 语句的情况下保持这些选择存在?有很多选项,所以每个选项都使用 php 会很痛苦。此外,表单正在通过 POST 提交。

表格样本:

<?php
// GRAB DATA
$result = mysql_query("SELECT * FROM special2 WHERE cat = 'COLOR' ORDER BY cat") 
or die(mysql_error());  
echo "<div id='color'><select id='color' name='product_color'>";

while($row = mysql_fetch_array( $result )) 
$name= $row["name"];
$cat= $row["cat"];
$price= $row["price"];
echo "<option value='";echo $name;echo"'>";echo $name;echo" ($$price)</option>"; 
echo "</select>";
echo "<input type='hidden' name='amount_color' value='";echo $price;echo"'></div>";
?>

我尝试使用这个 js sn-p 重新填充选择,但它似乎无法正常工作...

<script type="text/javascript">document.getElementById('color').value = "<?php echo $_GET['proudct_cpu'];?>";</script>

这似乎不起作用。除了 php if 语句还有什么建议吗?

谢谢!

编辑:这基本上是我正在使用的表单设置,尽管我已经大大缩短了它,因为实际实现很长。

// Make a MySQL Connection 
<?php mysql_connect("localhost", "kp_dbl", "mastermaster") or die(mysql_error());
mysql_select_db("kp_db") or die(mysql_error());
?> 
<br />
<form action="build22.php" method="post">
<input type="hidden" name="data" value="1" />
<br />
<br />
<?php
// GRAB DATA
$result = mysql_query("SELECT * FROM special2 WHERE cat = 'color' ORDER BY cat") 
or die(mysql_error());  
echo "<div id='color'><select id='color' name='product_color'>";

while($row = mysql_fetch_array( $result )) 
$name= $row["name"];
$cat= $row["cat"];
$price= $row["price"];
echo "<option value='";echo $name;echo"'>";echo $name;echo" ($$price)</option>"; 
echo "</select>";
echo "<input type='hidden' name='amount_color' value='";echo $price;echo"'></div>";
?>

<input type="submit" value="Update Configuration">
</form>

上面表单中的选择在提交后得到回显,以便为用户提供更新:

<div id="config" style="background-color:#FFF; font-size:12px; line-height:22px;">
  <h1>Current Configuration:</h1>
  <?php echo "<strong>Color:</strong>&nbsp&nbsp&nbsp&nbsp";echo $_POST['product_color']; ?>
</div>

【问题讨论】:

【参考方案1】:

我假设您将用户的选择存储在单独的表中。如果是这种情况,您需要添加一些逻辑来确定是否应该显示表单值或已存储的内容。

<?php

    // form was not submitted and a config id was passed to the page
    if (true === empty($_POST) && true === isset($_GET['config_id'])) 
    
        // make sure to properly sanitize the user-input!
        $rs = mysql_query("select * from saved_configuration where config_id=$_GET['config_id']"); // make sure to properly sanitize the user-input!

        $_POST = mysql_fetch_array($rs,MYSQL_ASSOC); // assuming a single row for simplicity.  Storing in _POST for easy display later
    

?>

<div id="config" style="background-color:#FFF; font-size:12px; line-height:22px;">
  <h1>Current Configuration:</h1>
  <?php echo "<strong>Color:</strong>&nbsp&nbsp&nbsp&nbsp";echo $_POST['product_color']; ?>
</div>

因此,在将用户的选择存储在数据库中之后,您可以将它们重定向到 URL 中具有新 config_id 的页面以加载保存的值。如果您没有将选定的值存储在表中,则可以对 cookie/会话执行类似的操作。

【讨论】:

【参考方案2】:

将变量回显到表单元素的value 标记中。如果您发布所有代码,我相信我可以帮助您。

更新

啊,所以它们是下拉列表,您需要记住选择了什么?抱歉,昨天匆忙看了你的帖子,还以为是带文字输入的表格。

我自己也做了类似的事情,但没有尝试您的代码,让我看看是否可以提供帮助。

基本上你需要做的是在下拉列表中设置一个值selected="selected"

当我不得不这样做时,我将下拉值放在一个数组中,如下所示:

$options = array( "stack", "overflow", "some", "random", "words");

// then you will take your GET variable:
$key = array_search($_GET['variablename'], $options);
// so this is saying find the index in the array of the value I just told you

// then you can set the value of the  dropdown to this index of the array:
$selectedoption = $options[$key];

这可能是令人困惑的地方,因为我的代码不同,所以如果你想使用它,你可能需要重新构造一下

我有一个doSelect 函数,我将以下参数传递给它:

// what we are passing is: name of select, size, the array of values to use and the 
// value we want to use as the default selected value
doSelect("select_name", 1, $options, $selectedoption, "");


// these are the two functions I have:

// this one just processes each value in the array as a select option which is either
// the selected value or just a 'normal' select value
FUNCTION doOptions($options, $selected)
        
    foreach ($options as $option)
    

        if ($option == $selected)
            echo ("<option title=\"$title\" id=\"$value\" selected>$option</option>\n");
        else
            echo ("<option title=\"$title\" id=\"$value\">$option</option>\n");
    



// this is the function that controls everything - it takes your parameters and calls   
// the above function
FUNCTION doSelect($name, $size, $options, $selected, $extra)

    echo("<select class=\"\" id=\"$name\" name=\"$name\" size=\"$size\" $extra>\n");
    doOptions($options, $selected);
    echo("</select>\n");

我知道有很多新代码被扔给你,但如果你可以将你选择的值从数据库中获取到数组中,那么其他一切都应该很好地到位。

我唯一要补充的是,在我们调用 doSelect 的开头,我会将其放在 if 语句中,因为您不想将尚未设置的内容设置为已选择:

if (isset($_GET['variable']))
    
        $key = array_search($_GET['variablename'], $options);
        $selectedoption = $options[$key];
        doSelect("select_name", 1, $options, $selectedoption, "");
         
    else
    
        doSelect("select_name", 1, $options, "", ""); 
    

希望对你有帮助!

【讨论】:

感谢您的回复,刚刚用代码结构更新了帖子。因为篇幅太长,所以没有包括全部内容。但这本质上就是它的功能。提交的 POST 信息会回显给用户以查看摘要。然而,在提交之后,这些选择会重置。我知道有一种 js 方法可以确保它们保持不变,只是无法弄清楚。 啊,所以它们是下拉列表,您需要记住选择了什么?抱歉,昨天匆忙看了你的帖子,还以为是带文字输入的表格。 啊太棒了!谢谢(你的)信息。这是我必须整理的很多内容,但看起来很直接!如果我有足够的帖子,那么我会给你一些支持!不幸的是,我是一个卑微的新手。不过谢谢! 没有问题,如果可行,请接受答案,如果您需要任何帮助,请随时在此询问。我是一个新手,自己会堆栈溢出,但我得到了很大的帮助,所以当我真正知道如何回答问题时,我会尝试帮助他人!

以上是关于提交(POST)后在php生成的表单中保留选择的主要内容,如果未能解决你的问题,请参考以下文章

提交 PHP 后保留表单值

表单提交后 Textarea 不保留其内容

表单的提交有两种方式:GET和POST,这两种方式的区别是啥?

提交表单时如何保留多个空格及换行的文本样式

使用php提交后将表单数据保留在字段内

C# 模拟 post提交php页面的表单