【问题标题】:building an array of strings in a SESSION variable (php)在 SESSION 变量中构建字符串数组 (php)
【发布时间】:2016-11-04 21:03:02
【问题描述】:

我有一个页面 (dest.php) 作为 php 会话的一部分,每次另一个页面 (source.php) 上的表单提交到这个页面时,我需要将 POST 中的字符串添加为$_SESSION 变量中的另一个元素。

所以我的想法是我会得到几个POST 变量(['name']['gender'] 等)并需要将它们添加到对应的$_SESSION 变量数组中,所以第一次提交表单时,我将拥有 $_SESSION['name'][0] = $_POST['name'] 并且来自 source.php 的每个后续提交都将发送新的 $_POST 变量,并且在 dest.php 上,我需要添加到 $_SESSION 数组,以便 @987654330 @一直都是。

我稍后在 dest.php 中有一些 php,它应该在表中回显所有 $_SESSION 变量,但它目前处理的一些字符串与其他字符串不同。

<table>    
<?php
for($cntr = 0; $cntr < count($_SESSION['name']); $cntr++)
{
   echo '<tr><td><input type="button" name="' . $cntr . '" value="edit"></td><td>';
   echo $_SESSION['name'][$cntr] .' adopted a ' . $_SESSION['gender'][$cntr] . ', ' . $_SESSION['colors'][$cntr];
   echo $_SESSION['species'][$cntr] . ' when visiting ' . $_SESSION['city'][$cntr] . '!' ;
   echo '</td></tr>';
}
?>
</table>

供参考,形式为:

<form action="petSentence.php" method="POST" accept-charset="UTF-8">
    <table><tr><td>
    Your name:  <input type="text" name="name"></td></tr><tr><td>
    <bold>Pick a city</bold></br>
        <input type="radio" name="city" value="Portland"> Portland<br>
        <input type="radio" name="city" value="Seattle"> Seattle<br>
        <input type="radio" name="city" value="Corvallis"> Corvallis</td><td>
    <bold>Pick the color(s)</bold>
        <input type="checkbox" name="colors[]" value="brown"> brown<br>
        <input type="checkbox" name="colors[]" value="red"> red<br>
        <input type="checkbox" name="colors[]" value="green"> green<br>
        <input type="checkbox" name="colors[]" value="blue"> blue</td></tr>
    <tr><td>
    Gender: <select name="gender">
        <option value="male">Male</option>
        <option value="female">Female</option>
    </select></td><td>
    What Species: 
        <select name="species">
        <option value="cat">cat</option>
        <option value="dog">dog</option>
        <option value="bird">bird</option>
        <option value="chinchilla">chinchilla</option>
    </select></td></tr>
    <tr><td><input type="submit" value="Submit"></td></tr>
    </table>
</form>

以及我如何构建 $_SESSION 数组的示例:

if(isset($_SESSION['name']))
{
   array_push($_SESSION['name'], $_POST['name']);
}
else
{
   $_SESSION['name'] = $_POST['name'];
}
if(isset($_SESSION['gender']))
{
    array_push($_SESSION['gender'], $_POST['gender']);
}
else
{
    $_SESSION['gender'] = $_POST['gender'];
}  

除了['name'] 变量按预期打印,但['gender'] 数组打印就好像它只是一个大字符数组。

【问题讨论】:

  • 简化:$_SESSION['name'][] = $_POST['name']; 等...
  • 我确实在一次迭代中尝试过,但它并没有解决根本问题,所以我坚持我已经拥有的东西,直到我解决问题,然后我会担心简化/优化.
  • @AbraCadaver,如果您将其写成答案,我会立即接受。我回去尝试这种简化,但它导致了问题,直到我结束会话并重新开始,现在它工作得很好。 array_push() 正在推送一个 c 字符串(有效),但您的简化是将一个字符串推送到单个元素。

标签: php arrays forms session


【解决方案1】:

简化。不需要ifs 和elses:

$_SESSION['name'][]   = $_POST['name'];
$_SESSION['gender'][] = $_POST['gender']; 

【讨论】:

  • 是否建议这样做,继续从表单提交添加到会话变量?
  • 视情况而定。我猜是购物车或多页测试之类的。
  • 如果服务器上存在潜在的内存风险,则可能不会,在某个时候,您应该填充数据库,但对于任务是保持数据持久化的类来说,这是一个小任务在会议期间,所以它适用于没有大量人口风险的我
【解决方案2】:

您需要确保 $_SESSION["gender"]$_SESSION["name"] 最初创建为数组。在追加之前,您还应该确保它们不仅仅是设置,而是数组:

例如

function append_to_session_array($var_name)
{
  if (is_array($_SESSION[$var_name]))
  {
    $_SESSION[$var_name][] = $_POST[$var_name];
  }
  else
  {
    $_SESSION[$var_name] = array($_POST[$var_name]);
  }
}

foreach (array("gender","name") as $v)
{
  append_to_session_array($v);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2011-04-15
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多