php,通过多个表单提交保留变量

时间:2017-07-12 12:30:32

标签: php forms

我正在尝试构建一个表单中提交的名称列表,但每次提交表单时都会重置我的变量。我读了一些看起来像隐藏变量会有所帮助的东西,但它不起作用。欢迎任何想法。我希望用户一次输入一个名字。我希望每次提交表单时都显示它们。很抱歉包含这么多代码,欢迎任何评论。

<?php
// define variables and set to empty values
$gname = "";

$counter = isset($_POST['counter']) ? $_POST['counter'] : 0;
$guestlist = isset($_POST['guestlist']) ? $_POST['guestlist'] : "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
if(isset($_POST["submit"]))
    $counter++;
if( isset($_POST["paidflag"]) && !empty($_POST["paidflag"]) )
  $paidflag = test_input($_POST["paidflag"]);
else
  $paidflagErr = "Please select either Paid or Guest Pass";
if (empty($_POST["gname"])) {
  $gnameErr = "<b>Error: Enter a guest name before hitting 'Submit.'</b><br>";
}
else
 ....
}

<br><br>
 Enter guest name and click the button for Paid or Guest Pass.
<form id="form1" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<br>
<input type="radio" name="paidflag" value="Paid"> <b>Paid </b>
<input type="radio" name="paidflag" value="Guest Pass"> <b>Guest Pass</b>
<span class="error">* <?php echo $paidflagErr;?></span>
<br> <br>
 <b> Name:</b>  <input type="text" name="gname">
  <span class="error">* <?php echo $gnameErr;?></span>
<br>
  <input type="submit" name="submit" value="Submit">
  <input type = "hidden" name = "counter" value = "<?php print $counter; ?>"; />
  <input type = "hidden" name = "guestlist" value = "<?php echo htmlspecialchars($guestlist); ?>"; />
</form>


<?php

if( (!$gnameErr) && ( $paidflag == "Paid" || $paidflag == "Guest Pass")) {

 $vc++;
 if($counter>0) {

 $gl2 = $gname . ", " . $paidflag . "<br>";
 $guestlist .= $gl2;

 echo "<br>Guest checked in today: <br>" .  $guestlist;

好的,在看了昨天的帮助后,我正在增加更多内容。谢谢Dexter0015! 我最终使用Session工作。我仍然不明白为什么它不能用隐藏变量,但我确定我错过了一些简单的东西。

会话的一个问题是我保留的数据比我想要的更长。我需要为给定用户构建一个数组,一旦他们关闭窗口,我希望清除该数组。以下是我提出的工作:

$counter = (!empty($_POST['counter'])) ? $_POST['counter'] : 0;
//purge list the first time through
$guest_list = ($counter==0) ? "" : $_SESSION['guest_list'];

我定义了一个隐藏的计数器变量,以查看表单完成的次数。如果$ counter为0,我想清除数组。这似乎工作正常。

我在使用建议的方法时遇到了问题。 这些行产生以下错误:     $ guests_list [] = $ new_guest;     $ _SESSION ['guests_list'] = $ guests_list;

PHP致命错误:无法使用[]进行阅读...

但这不是一个大问题,b / c我不介意使用字符串并在php中构建html数组。我做到了:     $ new_guest ='

  • '。 $ gname。 ','。 $ paidflag。 '
  • ';     $ guest_list。= $ new_guest;

    我还有一个关于流程和处理的基本问题。当我设置一个要由php处理的表单时,看起来每次提交表单时都会运行整个php代码。有没有办法设置一些只在第一次设置页面时运行的初始化部分?

    再次感谢您的帮助。

    1 个答案:

    答案 0 :(得分:0)

    您可以使用session来存储变量,并且如果要在其中存储多个名称,请使用数组而不是字符串。

    以下是我如何组织代码:

    <?php
    // 1 - Init session: needs to be first thing in your code
    session_start();
    
    // Init variable from session or null if doesn't exist
    $guests_list = (!empty($_SESSION['guest_list']))? $_SESSION['guest_list'] : array();
    $counter = (!empty($_POST['counter']))? (int)$_POST['counter'] : 0;
    
    // 2 - When you handle your form (if it is posted) : add entry to variable, then update it in session
    if (!empty($_POST['submit']))   {
        // 2.1 - do needed traitments relative to form
        if(!empty($_POST['paidflag'])) {
            $paidflag = tes_input($_POST['paidflag']);  
        }
        else {
            $paidflagErr = "Pleas select either Paid or Guest Pass";
        }
    
        if(!empty($_POST['gname'])) {
            $gname = filter_var($_POST['gname'], FILTER_SANITAZE_STRING)
        }
        else {
             $gnameErr = "<b>Error: Enter a guest name before hitting 'Submit.'</b><br>";
        }
        //...
        // Don't forget to set $new_guest var
        $new_guest = $gname . ', ' . $paidflag;
    
        // 2.2 - Update $guests_list and session.
        $guests_list[] = $new_guest;
        $_SESSION['guests_list'] = $guests_list;
    }
    ?>
    

    要显示$ gname变量中的所有现有值,您只需要循环它 例如:

    <p>Existing names:</p>
    <ul>
    <?php
    for($guests_list as $entity) {
        echo '<li>' . $entity . '</li>';
    }
    ?>
    </ul>
    

    改善代码的一些提示:

    服务器将: 1 - 执行PHP代码 2 - 然后生成并返回HTML

    所以你把所有的PHP代码都放在同一个地方(例如在html代码之前)而不是混合它(当然除了打印/回声部分)。

    默认情况下,在显示的完全相同的网址上有一个空动作帖子的表单,所以不需要在这里使用$ _SERVER [&#39; PHP_SELF&#39;]。

    如果var不存在,那么

    php empty()函数已经返回true,所以你不需要检查isset() && !empty()