【问题标题】:Make checkbox array stay checked after submitting the form提交表单后使复选框数组保持选中状态
【发布时间】:2014-03-23 18:35:30
【问题描述】:

我创建了一个从数据库中获取值的大型复选框。问题是,我需要找到一种方法来让浏览器记住某些复选框已被选中。提交表单后,它发布值,另一个函数将发布值用于另一个函数。

这就是我创建复选框表单的方式:

$query .= "SELECT id, ediens FROM menu_edieni_otrie";
    $query1 .= "SELECT id, ediens FROM menu_edieni_zupas";

    echo "<body>\n";
    echo "<form name='otrie_edieni' action='' method='post'>\n";
    echo "<table border='1px'>\n";
    echo "<tr>\n";
    echo "<td>\n";
    /* execute multi query */
    if ($mysqli->multi_query($query)) {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
            echo "<input type='checkbox' name='ediens2[]' value='";
            printf ("%s", $row[1]);
            echo "' ";
            echo "/>";
            printf ("%s </br>\n ", $row[1]);
            }
            $result->free();
        }
    }
    echo "</td>\n";
    echo "<td>\n";
    if ($mysqli->multi_query($query1)) {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
            echo "<input type='checkbox' name='zupas2[]' value='";
            printf ("%s", $row[1]);
            echo "'/>";
            printf ("%s </br>\n ", $row[1]);
            }
            $result->free();
        }
    }
    echo "</td>\n";
    echo "</tr>\n";
    echo "</table>";
    echo "<input type='submit' name='formSubmit' value='Submit' />";
    echo "</form>\n";
    echo "</body>";

如何检查在按下提交按钮后选中的复选框并在之后保持选中状态 - 刷新后?

_POST 被这个函数接收:

$ediens2 = $_POST['ediens2'];
$zupas2 = $_POST['zupas2'];
  if(empty($ediens2) && empty($zupas2)) 
  {
    echo("Nav ievadīta neviena vērtība");
  } 
  else
  {
    $N = count($ediens2);
    $M = count($zupas2);
    $mysqli = @new mysqli('*', '*', '*', '*');

        $mysqli->query("SET NAMES 'utf8'", $connection);

        if ($mysqli->connect_errno) {
            die('Connect Error: ' . $mysqli->connect_errno);
        }
    for($i=0; $i < $N; $i++){
        $query3 = "UPDATE tmp_cirks SET name='$ediens2[$i]' WHERE id='$i'";
        $mysqli->multi_query($query3);
    }
    /* close connection */
    $mysqli->close();
    $date = date('d/m/Y', time());
    echo $date;
    echo("<br>");
    echo("<ul>");
    for($i=0; $i < $N; $i++)
    {
        echo("<li>");
        echo("<strong>" . $ediens2[$i] . "</strong>");
        echo("</li>");
    }
    echo("</ul>");
    echo("<ul>");
    for($i=0; $i < $M; $i++)
    {
        echo("<li>");
        echo("<strong>" . $zupas2[$i] . "</strong>");
        echo("</li>");
    }
    echo("</ul>");      
  }

到目前为止,我发现,我将从 _POST 接收到的值存储到一个单独的数据库表中 - 使用这个:

for($i=0; $i < $N; $i++){
        $query3 = "UPDATE tmp_cirks SET name='$ediens2[$i]' WHERE id='$i'";
        $mysqli->multi_query($query3);
    }

我在想,然后我可以比较生成的复选框表单是否有任何值存储在这个单独的表中。如果它有 - 那么它会产生“checked='checked'”功能。我在正确的轨道上吗?

数据库表如下所示: id ediens edieni_ru edieni_eng cena cena_puse otr1 Kotletes Котлеты Сutlet 2,00 1,30 otr2 Gulašs Гуляш 炖牛肉 2,20 1,40 otr3 Slinkie tīteņi Ленивые голубцы 切碎的卷心菜配炸肉末 1,70 1,15 otr4 Plovs Плов Pilaff 1,70 1,15

要生成复选框值,我只使用“ediens”列。 我创建的新表如下所示(保存值的表)。

身份证名称 1 科特莱特斯 2 古拉斯 3 卡博纳德

所以我的想法是,像这样: if (name==ediens) echo 'checked=checked'; (当然这只是一个不工作的例子)

有什么建议吗?我什至不知道我是否走在正确的轨道上。

提前感谢您的帮助!

【问题讨论】:

  • 当您将它们保存到数据库时,必须有我提交值的主键,您可以将其保存在会话键中,并在页面刷新后检索该值。
  • 我是 SQL 编码的新手,现在我想出了一个解决方案,但不知道如何实现它。我所做的是将检查的数据存储在 tmp 数据库表中,如果 tmp 数据库中的值等于任何复选框值,我想在页面加载时进行比较。如果是这样 - 它会生成 checked="checked" 属性。问题是我不确定如何在 php“if”语句中比较两个数据库表。
  • 您是否要“记住”用户的最后一次菜单设置以及用户下次访问您的网站时,即使是几个小时后,他们也会看到他们最后的菜单选择?跨度>
  • 是的,如果它在再次登录后仍能记住它,那就太好了。我现在按计划进行了一切工作,尽管用户必须保持窗口打开,以免“删除”它以前的选择。我怎样才能设法存储数据?我应该使用临时数据库吗?

标签: php forms checkbox


【解决方案1】:

所有工作都在这里...有任何问题请询问。我会修复它们。

此代码显示来自存储在两个表中的条目的两个菜单。它允许用户选择他们希望的条目,并通过检查 $_POST 数组在输出屏幕上设置“已检查”属性来保留“已检查”项目。

它是提供的代码,经过调试,只需极少的更改即可工作。

修复: 1) 'multi_query' 没有正确处理第二个结果集。

2) 单独的 SQL 查询需要以 ';' 结束。

这是经过测试的代码 (PHP 5.3.18)。

我更改了“获取”语句,以便可以通过“列名”访问数据。

我已将调试代码保留在其中显示 $_POST 数组,以便您可以看到它正在工作。只需删除标记为 /* debug */ 的代码即可停止显示。

<?php
    /* debug */ var_dump($_POST);

    $mysqli = new mysqli('localhost', 'test', 'test', 'testmysql');

    $query  = '';
    $query .= "SELECT id, ediens FROM menu_edieni_otrie order by id;";

    $query .= "SELECT id, ediens FROM menu_edieni_zupas order by id;";

    echo "<body>\n";
    echo "<form name='otrie_edieni' action='' method='post'>\n";
    echo "<table border='1px'>\n";
    echo "<tr>\n";
    echo "<td>\n";
    /* execute multi query */
    if ($mysqli->multi_query($query)) {
        if ($result = $mysqli->store_result()) {

            while ($row = $result->fetch_array()) {
                echo "<input type='checkbox' name='ediens2[]' value='";
                printf ("%s", $row['id']);
                echo "' ";
                echo isset($_POST['ediens2']) && in_array($row['id'], $_POST['ediens2']) ? ' checked="checked"' : '';
                echo "/>";
                printf ("%s </br>\n ", $row[1]);
            }
            $result->free();
        }
    }

    echo "</td>\n";
    echo "<td>\n";
    // try and get the next results (zupas)

    if ($mysqli->more_results()) {          // any results from the zupas menu?
        $mysqli->next_result();             // get them...
        $result = $mysqli->store_result();  // access them...

        while ($row = $result->fetch_array()) { // process them
            echo "<input type='checkbox' name='zupas2[]' value='";
            printf ("%s", $row['id']);
            echo "' ";
            // we need to set the 'checked' attribute if the user ticked the box.
            // we check the $_POST array to see if the current value is in there ans set it checked if it is.
            echo isset($_POST['zupas2']) && in_array($row['id'], $_POST['zupas2']) ? ' checked="checked"' : '';
            echo "'/>";
            printf ("%s </br>\n ", $row[1]);
        }
        $result->free();
    }
    echo "</td>\n";
    echo "</tr>\n";
    echo "</table>";
    echo "<input type='submit' name='formSubmit' value='Submit' />";
    echo "</form>\n";
    echo "</body>";
?>

【讨论】:

  • 感谢您的回答。虽然它似乎不想为我工作。我检查了您建议的代码,但在尝试以这种方式对其进行排序后 - 我仍然失败并且刷新后复选框未选中。
  • 好的,我没有测试你的代码,因为我不知道你的表定义或有示例数据。但是,我怀疑您的代码中还有其他错误。不要惊慌!不远了。您是否能够轻松发布您的表格和一些示例数据?如果你不能,我会创建一些与你的表相匹配的东西。而且您至少会看到它在原则上起作用。
  • @nSage,不需要更多信息!我会尽快发布工作代码!
  • 哦.. 以任何方式很好地编辑了我的帖子,它现在有更多信息,希望它更清楚。
  • 它现在运行良好!非常感谢,我的 php 技能需要更多工作。
【解决方案2】:

在post函数中使用setcookie,刷新后使用$_COOKIE判断是否被勾选。

setcookie("Checkbox1", "checked", time()+3600);
if($_COOKIE["Checkbox1"] == "checked") echo "checkbox1 checked";

编辑:但是,当然,如果你保存它们,你可以从数据库中加载复选框值。

【讨论】:

  • Cookie 似乎不是一个有效的选项,因为我没有确定的时间应该勾选这些框。从数据库加载值似乎是一个更有效的选择,尽管我仍在寻找如何做到这一点的解决方案。不太擅长SQL。仍然试图通过它找到我的方式。 :)
  • 嗯,这取决于它应该保留数据的时间以及它们是否与用户或浏览器(会话)相关。如果与用户相关(您需要他的一些 id),请使用数据库;如果没有,则使用会话/cookie。如果是过滤器或选择之类的,一定要使用 cookie 并将时间设置为一年。编辑:用户=有人登录;浏览器 = 访问您网站的人(甚至定期访问)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多