2011-05-09 102 views
1

我试图将一个简短的表单的结果存储到一个平面文件(例如.text文件)。该文件将作为分隔文件导入到Excel中。窗体有复选框,因此它可以被设置成一个数组:

<input type="hidden" name="roflz" value="noresponse"> 
<input type="checkbox" name="roflz[]" value="Yesroflz" id="Yesroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['rolfz'] == "Yesroflz") { echo 'checked="checked"'; } ?>> <label for="Yesroflz">Yesroflz</label> <br /> 
<input type="checkbox" name="roflz[]" value="Moreroflz" id="Moreroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['roflz'] == "Moreroflz") { echo 'checked="checked"'; } ?>> <label for="Moreroflz">Moreroflz</label><br /> 

是否有可能从$_POST['rolfz']破灭的阵列,并将结果返回到$_POST['rolfz']?所需的结果是一个字符串,我可以将其存储到一个文本文件中。请参阅下面的代码:

<?php 
// begin the session 
ini_set('session.cache_limiter', 'private'); 
session_start(); 
//Turn checkboxes (an array) into a string. So we can later store it into a strong. 
if(isset($_POST['rolfz'])){ 
    $_POST['rolfz'] = implode(",",$_POST['rolfz']); 
    } 

总体目标是将$ _SESSION中的所有值存储到文本文件中。但是,当我尝试运行代码时,我得到了“注意:数组在14行E:\ cgi-bin \ thankyou.php中的字符串转换”。错误告诉我,在下面的代码中,我试图将一个数组作为一个字符串使用。

// Take each input name and create a variable for it 
foreach($_POST as $k=>$v) { 
$_SESSION[$k]=$v; 
} 
//Implodes the array so we can store the values as a string (not the variables name though!) 
$results = implode("|", $_SESSION); 
//Open up the file that we will store the collected information to 
$datafile=fopen("V1.txt","a") or exit("Unable to open file to record data!"); 
//Write the data on a new line ("\r\n") so we don't over-write the existing data 
fwrite($datafile, "\r\n".$results); 
//Close out the file 
fclose($datafile); 
//reset session variables and destroy the session 
$_SESSION = array(); 
session_destroy(); 
?> 

如果我在做什么是错的或不可能的,是可以使用的替代语句,而不是为foreach($_POST as $k=>$v),使其忽略$_POST['rolfz']?那样我可以自己处理$_POST['rolfz']

编辑(11年5月10日): 之前爆:

array(5) { ["date"]=> string(10) "05/10/2011" ["time"]=> string(11) "09:11:20 AM" ["gender"]=> string(4) "male" ["lolz"]=> string(7) "YesLOLZ" ["roflz"]=> array(2) { [0]=> string(8) "Yesroflz" [1]=> string(7) "Noroflz" } } 

爆后:

array(5) { ["date"]=> string(10) "05/10/2011" ["time"]=> string(11) "09:11:20 AM" ["gender"]=> string(4) "male" ["lolz"]=> string(7) "YesLOLZ" ["roflz"]=> array(2) { [0]=> string(8) "Yesroflz" [1]=> string(7) "Noroflz" } } 

编辑(11年5月10日): 请参阅迈克尔的解决方案,如果你正在尝试做类似的解决方案。并注意我是一个白痴,并在我的代码中使用了错误的复选框名称(它应该是roflz而不是rolfz)。

+0

是否有一个原因,你是c用你自己的方式来表示'$ _SESSION'作为一个字符串来写入你的文件,而不是使用专为此目的而设计的'serialize()'函数? http://us.php.net/manual/en/function.serialize.php – 2011-05-09 20:29:11

+0

该文件是数据收集方面的终点。我会使用数据库,但由于环境限制而无法使用。我确实尝试过在某个时候使用'serialize()',但是如果我记得它最后会出现一堆大多数人无法读取的文本。由于其他人会将文本文件导入到Excel中(不能直接写入Excel文件)并使用管道删除功能将其分解为列,所以我试图通过这种方式来完成。 – OneBigNewbie 2011-05-09 20:35:49

+0

我明白了。从你的帖子中不清楚你需要的输出是人类可读或可用的CSV等。 – 2011-05-09 20:41:12

回答

0

编辑:一定要var_dump($_SESSION)试图implode()前,万一有在那里已经是一些其他的阵列。

如此看来你的错误是你的$_POST包含数组,你直接转换成$_POST然后$_SESSION它试图implode()成一个字符串原样。 implode()跳过该阵列。

可以忽略$_SESSION['rolfz']很简单:

foreach($_POST as $k=>$v) { 
    if ($k != 'rolfz') { 
    $_SESSION[$k]=$v; 
    } 
} 

然后用其他方式处理它,你建议。

更好

然而,店$_POST$_SESSION原样,但使用不同的临时数组来过滤掉rolfz

$_SESSION = $_POST; // will overwrite anything already in $_SESSION 

$tmp_array = array(); 
foreach($_POST as $k=>$v) { 
    if ($k != 'rolfz') { 
    $tmp_array[$k]=$v; 
    } 
} 

// Then implode() $tmp_array and write to file. 

编辑2011/5/11: 由于覆盖$_POST似乎并不正在工作,尝试使用一个中间值,并删除有价值的rolfz键:

if (isset($_POST['rolfz'])) { 
    $temp = implode(",", $_POST['rolfz']); 
    unset($_POST['rolfz']); 
    $_POST['rolfz'] = $temp; 
} 
+0

感谢您的回复。我不能使用第二种解决方案,因为这会删除_SESSION数组中的所有其他变量。我已经使用了第一个,然后试图将内爆的$ _POST变成$ _SESSION [变量]。但是,它似乎并不奏效。 'if(isset($ _ POST ['rolfz'])){__ {}} {__ {''rolfz'] = implode(',',$ _POST ['rolfz']); \t}' – OneBigNewbie 2011-05-09 20:59:55

+0

编辑:请参阅下面的主要帖子。 – OneBigNewbie 2011-05-10 13:06:52

+0

对不起,我是个白痴。我刚刚意识到错误是什么。当我使用rolfz时,复选框的名字是roflz。对不起,浪费你的时间了。谢谢您的帮助!我正在学习PHP。 – OneBigNewbie 2011-05-10 13:25:55