【问题标题】:Working with session in PHP在 PHP 中使用会话
【发布时间】:2018-11-13 23:16:27
【问题描述】:

我有一个表单,我从中获取一些数据并使用会话我想将这些数据作为历史记录保留在我的页面上,并且当我单击历史记录中的一行时,我希望我的数据在我的表单中自动完成.我在一页上看到了一个示例,我尝试将其应用于我想要的,但它不是很实用。

这是我的表单代码:

<form method="get">
         Create:<br><br>

                  Name:<br> <input type="text" id="name" value="" /><br>
                  surname:<br> <input type="text" id="surname" value="" /><br>
                  Sex:<br> <div class="select-wrapper">
                              <select name="sex" id="sex">
                                 <option value="">- Sex -</option>
                                 <option value="woman">Woman</option>
                                     <option value="male">Male</option>
                              </select>
                             </div>
                  Role: <div class="select-wrapper">
                              <select name="rol" id="rol">
                                 <option value="">- Role -</option>
                                 <option value="visitor">Visitor</option>
                                 <option value="Professor">Professor</option>
                                 <option value="Student">Student</option>
                              </select>
                             </div>
                   Text color: <div class="select-wrapper">
                              <select name="cul" id="cul">
                                 <option value="">- Text color -</option>
                                 <option value="red">Red</option>
                                 <option value="blue">Blue</option>
                                 <option value="black">Black</option>
                              </select>
                             </div>
                   Font text: <div class="select-wrapper">
                              <select name="font" id="font">
                                 <option value="">- Font text -</option>
                                 <option value="15px Arial">Arial</option>
                                 <option value="15px Times New Roman">Times New Roman</option>
                                 <option value="15px Georgia">Georgia</option>
                                 <option value="15px Comic Sans MS">Comic Sans MS</option>
                                 <option value="15px Lucida Sans Unicode">Lucida Sans Unicode</option>
                                 <option value="15px Courier New">Courier New</option>
                              </select>
                             </div>
                   Format : <div class="select-wrapper">
                                    <select name="format" id="format">
                                       <option value="">- Format -</option>
                                       <option value="portrait">Portrait</option>
                                       <option value="landscape">Landscape</option>
                                    </select>
                                  </div>
                   Style text: <div class="select-wrapper">
                                    <select name="stil" id="stil">
                                       <option value="">- Style text -</option>
                                       <option value="stil1">Stil1</option>
                                       <option value="stil2">Stil2</option>
                                       <option value="stil3">Stil3</option>
                                       <option value="stil4">Stil4</option>
                                       <option value="stil5">Stil5</option>
                                       <option value="stil6">Stil6</option>
                                    </select>
                                  </div>
</form>

这是我尝试使用会话的地方:

<?php
session_start();

$createpas = parseRequest();
storecreatepas($createpas);

include "form.php";

$createpases = $_SESSION['createpases'];
include "history.php";




function storecreatepas($createpas) {
    if (!isset($_SESSION['createpases'])) {
        $_SESSION['createpases'] = [];
    }

    if (!$createpas->isEmpty()) {
        $_SESSION['createpases'][] = $createpas;
    }
}


function parseRequest() {
    $createpas = new createpasRequest;
    $createpas->cul = !empty($_GET['cul']) ? $_GET['cul'] : "";
    $createpas->font = !empty($_GET['font']) ? $_GET['font'] : "";
    $createpas->format = !empty($_GET['format']) ? $_GET['format'] : "";
    $createpas->stil = !empty($_GET['stil']) ? $_GET['stil'] : "";
    return $createpas;
}


/**
 * createpas request
 */
class createpasRequest
{
    public $cul = "";
    public $font = "";
    public $format = "";
    public $stil = "";

    function toQueryString() {
        $params = [
                'cul' => $this->cul,
                'font' => $this->font,
                'format' => $this->format,
                'stil' => $this->stil
        ];

        return http_build_query($params);
    }

    function isEmpty() {
        return !$this->cul || !$this->font || !$this->format || !$this->stil;
    }

    function culAsObject() {
        return new DateTime($this->cul);
    }

    function fontAsObject() {
        return new DateTime($this->font);
    }
    function formatAsObject() {
        return new DateTime($this->format);
    }
    function stilAsObject() {
        return new DateTime($this->stil);
    }

}

以及显示代码:

<ul>
    <?php
    foreach ($createpases as $s) {
    ?>
     <li><a href="search.php?<?php echo $s->toQueryString() ?>">
            <?php echo $s->cul?> - <?php echo $s->font?> - <?php echo $s->format?> - <?php echo $s->stil?>
          </a></li>
    <?php
    }
    ?>
</ul>

在某些时候它工作得很好。它从我的表单中获取我的数据将它们发布在页面上,但是当我点击它们时,它们不会在我的表单中自动完成。而且,如果我希望选项在列表中是唯一的,我该怎么做?现在,如果我完成相同的数据 2 或 3 次,它们会在我的列表中出现多次。 感谢您的帮助!

【问题讨论】:

  • 您的 HTML 表单不使用来自 $_SESSION 的任何数据,那么它如何知道表单输入中的“应该”是什么?
  • 我看到的表格是这样的,但我不知道如何适应我需要的wnat:&lt;form method="get"&gt; &lt;h3&gt;Dream trip&lt;/h3&gt; &lt;label&gt; from &lt;input type="date" name="fromDate" required value="&lt;?php echo $search-&gt;fromDate ?&gt;"&gt;, to &lt;input type="date" name="toDate" required value="&lt;?php echo $search-&gt;toDate ?&gt;"&gt; &lt;/label&gt; &lt;button&gt;Find it!&lt;/button&gt; &lt;/form&gt;

标签: php html session


【解决方案1】:

您需要在表单页面中启动会话,然后检查 SESSION 数组是否包含要回显的值。

所以你的代码会变成:

<?php session_start(); 
 if(!isset($_SESSION['name']){$_SESSION['name']=''}
 if(!isset($_SESSION['sex']){$_SESSION['sex']=''}
 if(!isset($_SESSION['rol']){$_SESSION['rol']=''}
?>
//this way you will not have issues on page first load before the user fills in the form
<form method="get">
         Create:<br><br>

                  Name:<br> <input type="text" id="name" value="<?php echo $_SESSION['name']; ?>" /><br>
                  surname:<br> <input type="text" id="surname" value="" /><br>
                  Sex:<br> <div class="select-wrapper">
                              <select name="sex" id="sex">
                                 <option value="" <?php if($_SESSION['rol']==''){echo 'selected'} ?>>- Sex -</option>
                                 <option value="woman" <?php if($_SESSION['rol']=='woman'){echo 'selected'} ?>>Woman</option>
                                     <option value="male" <?php if($_SESSION['rol']=='visitor'){echo 'selected'} ?>>Male</option>
                              </select>
                             </div>
                  Role: <div class="select-wrapper">
                              <select name="rol" id="rol">
                                 <option value="" <?php if($_SESSION['rol']==''){echo 'selected'} ?>>- Role -</option>
                                 <option value="visitor" <?php if($_SESSION['rol']=='visitor'){echo 'selected'} ?>>Visitor</option>
                                 <option value="Professor"<?php if($_SESSION['rol']=='Professor'){echo 'selected'} ?>>Professor</option>
                                 <option value="Student"<?php if($_SESSION['rol']=='student'){echo 'selected'} ?>>Student</option>
                              </select>
                             </div>

等等。

【讨论】:

  • 我试过你的代码,我得到一个通知:未定义的索引:rol 在这一行:&lt;option value="" &lt;?php if($_SESSION['rol']==''){echo 'selected'} ?&gt;&gt;- Role -&lt;/option&gt;,它不起作用。
  • 这只是一个例子。使其适应您的变量名称。存储角色的会话数组的名称是什么?
  • 我看到之后..我正在使用$createpases
  • 我成功了,感谢迷失者的帮助,但快速提问也许你也可以帮助我。当我单击列表中的一个元素时,表单会自动完成,但相同的参数集再次出现在我的列表中。我怎样才能在我的列表中只获得一组唯一的参数?
  • 如果答案解决了您的问题,请标记。对于另一个请求,我无法理解您的问题是什么
【解决方案2】:

您的表单似乎没有自动填充数据,因为您没有实现这样的功能。这种自动完成功能不是自动的,因为服务器不会为您完成。

下面是一个示例,说明您需要执行哪些操作才能使自动完成功能正常工作:

Name:<br> <input type="text" id="name" value="<?= $_SESSION['name'] ?>" /><br>

要使选择自动完成,您需要执行以下操作:

<select name="cul" id="cul">
    <option value="">- Text color -</option>
    <option value="red" <? echo ($_SESSION['cul']==="red")?"selected='selected'":""; ?>>Red</option>
    <option value="blue" <? echo ($_SESSION['cul']==="blue")?"selected='selected'":""; ?>>Blue</option>
    <option value="black" <? echo ($_SESSION['cul']==="black")?"selected='selected'":""; ?>>Black</option>
</select>

这通过使用先前提交的 $_GET 数据直接设置值/所选项目来设置每个表单元素的值,或者如果没有数据,则所有内容都将为空/默认值。

根据其中一位 cmets 对此答案的建议,我想指出,如果您希望在文档中使用会话变量,则必须在文档顶部包含“session_start()”(如果您还没有这样做)。

关于原始问题的一个问题:第一个代码块是程序生成的还是手动输入的?

【讨论】:

  • 不正确。您需要使用存储在 SESSION 数组中的值而不是 GET one
  • 啊,我误解了问题的那一部分,他希望它比最初的表单提交更持久。使用 $_SESSION 变量而不是 $_GET 变量就可以了。至于您的代码质量评论,请说明您将如何重构以改进。
  • @BrandonDixon 1) 停止使用&lt;? 这是不好的做法,不鼓励使用。 2)(您已经修复了其他所有问题)
  • @Martin 看来您的声明
  • @BrandonDixon 短标签已被弃用,必须在 php.ini 中明确启用。这是因为这可能导致代码中的错误。我什至不确定它是否已从 PHP 7 中删除。请参阅manual
猜你喜欢
  • 2017-08-17
  • 2016-02-29
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多