2011-05-09 59 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