复杂PHP表单处理的奇怪错误


Strange Error with Complex PHP Form Processing

新信息:
我在$_REQUEST上使用了print_r函数,那里也发生了一些非常奇怪的事情。GET正确地传递了一些值,例如另一个表单上传递"TRUE"的值。这可以在print_r输出中看到,但没有写入文件。。。然而,仍然没有找到解决我问题的方法。

我正在处理一个包含大量表单的页面,这些表单是根据AJAX的需要加载的。这一切都很好,就像解析名称:值对并适当存储它们一样。

我的错误发生在PHP解析AJAX发送的GET请求时。当用户完成时,它似乎只从某些字段中检索值。

其想法是,用户可以添加来自任意数量表单的数据,然后将这些表单转换为GET请求并发送到服务器。

JavaScript完美地构建了我的请求,并且所有表单都被正确发送。

根据用户提交的表单,数据由一个大型switch语句处理,该语句将相关名称传递给一个可变函数,该函数获取值,并创建一个用于写入文件的字符串。

奇怪的错误是,只有一些值被写入文件,而其他值只有一行空白。Apache或PHP没有报告错误,JavaScript控制台也没有报告错误。

例如,我将使用"颜色"形式,因为这是比较复杂的形式之一。

所以我添加了一个彩色动作,然后点击按钮提交所有表格(这次,只是彩色表格)

我的get请求如下所示:actionIDs=Colour&coOptionSelect=Tinting&coColourEffect=Sepia&coRemoveColour=#000000&coRemoveFuzzNumber=0&coRemoveHueSelect=None&coReplaceColour=#000000&coReplaceFuzzNumber=0&coReplacementColour=#000000&coReplacementAlphaNumber=0&coReplaceHueSelect=None&coReplacementHueSelect=None

接下来,PHP解析actionID部分,因为有时会有很多操作。这很好用。

现在我们跳到switch语句的"颜色"部分。

case "Colour":
    $config = processAction("coOptionSelect", "coColourEffect", "coRemoveColour", "coRemoveFuzzNumber", "coRemoveHueSelect", "coReplaceColour", "coReplaceFuzzNumber", "coReplacementColour", "coReplacementAlphaNumber", "coReplaceHueSelect", "coReplacementHueSelect");
    file_put_contents($confpath . "colour.conf", $config);
    break;

这会写入正确的文件,但奇怪的是,只有coOptionsSelectcoColourEffect的值会写入该文件。这不是它们的输入类型,因为它们是select语句,与表单上的其他select语句类似。在其他表单上,它可能是数字输入或文本输入,但可以正确提交。

它也不是随机的,同样的东西总是写得很好。当我在值周围移动时,它也不是位置性的,它仍然是正确书写的,它们的位置不会影响任何东西。

最后是processAction函数。

function processAction()
{
    $config = "";
    foreach(func_get_args() as $field)
    {
        $temp = isset($_REQUEST[$field]) ? $_REQUEST[$field] : null;
        $config = $config . $temp . "'n";
    }
     return $config;
}

最终的结果应该是所有的值都应该正确地写入到它们的相关文件中,而不是当前的问题,即每个表单中只有几个值被写入,其余的值被写入为空行。

您可能需要将#符号编码为编码方法%23

在将其传递给变量之前,您还可以使用urlencode来执行此操作。

参考:http://php.net/manual/en/function.urlencode.php


更新:

如果你要尝试通过javascript进行编码,我会尝试使用这种方法

var newURL = 
   "http://example.com/index.php?url=" + encodeURIComponent(actionIDs);

var newURL = 
   "http://example.com/index.php?url=" + escape(actionIDs);

参考:用JavaScript编码URL?

你有三个选择:

  • escape()不会编码:@*/+

  • encodeURI()不会编码:~!@#$&*()=:/,;?+'

  • encodeURIComponent()不会编码:~!*()'

但在您的情况下,如果您想将URL传递到其他页面的GET参数中,则应该使用escapeencodeURIComponent,而不是encodeURI

请参阅堆栈溢出问题最佳实践:escape或encodeURI/encodeURIComponent以了解进一步的讨论。