$ _POST值在foreach循环中更改或消失

时间:2015-07-20 20:20:22

标签: php post foreach

在此foreach循环之前$_POST['encounterName']包含预定义的名称。在循环内部,它的值变为“.json”,因此file_put_contents中的第一个字符串读取“.json.json”。同样$_POST['basicTrainingSectionSlide']$_POST['basicTrainingContentHeader']$_POST['basicTrainingContentText']失去了他们的价值观。在foreach循环之后,所有值都恢复正常。这里发生了什么?

$i = 0;
$j = 0;

foreach($_POST['Sections'] as $order){

    if(strcmp($order, "Section") == 0){
        file_put_contents($_POST['encounterName'].".json", "\t\t[\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t\t\"Section\",\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t\t\"".$_POST['basicTrainingSectionSlide'][$i]."\"\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t],\n", FILE_APPEND);
        $i++;
    }
    else if(strcmp($order, "Text") == 0){
        file_put_contents($_POST['encounterName'].".json", "\t\t[\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t\t\"Text\",\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t\t\"".$_POST['basicTrainingContentHeader'][$j]."\"\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t\t\"".$_POST['basicTrainingContentText'][$j]."\"\n", FILE_APPEND);
        file_put_contents($_POST['encounterName'].".json", "\t\t],\n", FILE_APPEND);
        $j++;       
    }

}

这是$ _post数组包含的内容:

array(11) { ["encounterName"]=> string(8) "Violence" ["encounterHint"]=> string(0) "" ["basicTrainingSectionSlide"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "6" } ["basicTrainingContentHeader"]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "4" } ["basicTrainingContentText"]=> array(2) { [0]=> string(1) "3" [1]=> string(1) "5" } ["contextText_1"]=> string(0) "" ["contextText_2"]=> string(0) "" ["contextText_3"]=> string(0) "" ["contextText_4"]=> string(0) "" ["contextText_5"]=> string(0) "" ["submit_form"]=> string(6) "Submit" } array(11) { ["encounterName"]=> string(8) "Violence" ["encounterHint"]=> string(0) "" ["basicTrainingSectionSlide"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "6" } ["basicTrainingContentHeader"]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "4" } ["basicTrainingContentText"]=> array(2) { [0]=> string(1) "3" [1]=> string(1) "5" } ["submit_form"]=> string(6) "Submit" }

一些补充信息: - 填写的表单将其发布数据发送到单独的php文件进行处理。 - $_POST['Sections']通过此功能发送:

function returnValues() {
    $.ajax({
        type: "POST",
        url: "final.php",
        data:{ Sections: $sectionOrder }, 
        success: function(data){
            console.log(data); 
        }
    })
}

来自表单标记的.js文件onsubmit。

1 个答案:

答案 0 :(得分:0)

假设$_POST['Sections']包含类似的内容:

array(11) { 
    ["encounterName"]=> string(8) "Violence" 
    ["encounterHint"]=> string(0) ""
    ["basicTrainingSectionSlide"]=> array(2) { 
        [0]=> string(1) "1" 
        [1]=> string(1) "6" } 
    ["basicTrainingContentHeader"]=> array(2) { 
        [0]=> string(1) "2" 
        [1]=> string(1) "4" } 
    ["basicTrainingContentText"]=> array(2) { 
        [0]=> string(1) "3" 
        [1]=> string(1) "5" } 
    ["contextText_1"]=> string(0) "" 
    ["contextText_2"]=> string(0) "" 
    ["contextText_3"]=> string(0) "" 
    ["contextText_4"]=> string(0) "" 
    ["contextText_5"]=> string(0) "" 
    ["submit_form"]=> string(6) "Submit" 
}
array(11) { 
    ["encounterName"]=> string(8) "Violence" 
    ["encounterHint"]=> string(0) "" 
    ["basicTrainingSectionSlide"]=> array(2) { 
        [0]=> string(1) "1" 
        [1]=> string(1) "6" } 
    ["basicTrainingContentHeader"]=> array(2) { 
        [0]=> string(1) "2" 
        [1]=> string(1) "4" } 
    ["basicTrainingContentText"]=> array(2) { 
        [0]=> string(1) "3" 
        [1]=> string(1) "5" } 
    ["submit_form"]=> string(6) "Submit" 
}

我会做这样的事情:

$i = 0;
$j = 0;

foreach($_POST['Sections'] as $order){
    $fn = $order['encounterName'] . ".json";
    $appText = "";
    if(strcmp($order, "Section") == 0){  
        $appText .= "\t\t[\n";
        $appText .= "\t\t\t\"Section\",\n";
        $appText .="\t\t\t\"" . $order['basicTrainingSectionSlide'][$i] . "\"\n";
        $appText .= "\t\t],\n";
        file_put_contents($fn, $appText, FILE_APPEND);
        $i++;
    } elseif(strcmp($order, "Text") == 0){
        $appText .= "\t\t[\n";
        $appText .= "\t\t\t\"Text\",\n";
        $appText .= "\t\t\t\"" . $order['basicTrainingContentHeader'][$j] . "\"\n";
        $appText .= "\t\t\t\"" . $order['basicTrainingContentText'][$j] . "\"\n";
        $appText .= "\t\t],\n";
        file_put_contents($fn, $appText, FILE_APPEND);
        $j++;       
    }
}

由于您处于foreach循环并迭代数组$_POST['Sections'],因此要调用该数组的元素,您需要使用$order。这就是你定义循环的方式。你一直在调用$ _POST,这些索引不应该存在。

如果您使用的是$ _POST,则encounterName的第一次出现位于$_POST['Sections'][0]['encounterName'],并包含字符串Violence。因此,在循环中,$fn = $order['encounterName'].".json";应该被指定为Violence.json作为字符串。

我不确定if声明正在寻找什么。由于$order是一个数组,而不是一个字符串,strcmp()应返回NULL。请参阅注释here。由于两个if语句都会失败,因此在任何一种情况下都不会附加您的文件。如果你想澄清,请发表评论。

我在http://phpfiddle.org/lite上测试了以下内容:

<?php
    $order = array();
    if(strcmp($order, "Section")){
        echo "Success";
    } else {
        echo "Fail";
    }
?> 

我得到了以下结果:

E_WARNING : type 2 -- strcmp() expects parameter 1 to be string, array given -- at line 5
Fail

此代码未经测试。