【问题标题】:In PHP how to use $_REQUEST to retrieve an array of inputs to enter into a database在 PHP 中如何使用 $_REQUEST 检索输入数组以输入数据库
【发布时间】:2013-12-19 23:42:55
【问题描述】:

我正在使用 AJAX 将输入从网页发送到 PHP 文件,然后再输入到数据库中。这是我的 JavaScript 文件:

var pageLoaded = function () {
var submitButton = document.getElementById("submit");
if (submitButton) {
    submitButton.addEventListener("click", submit, true);
}
};

var submit = function () {

var xhr, changeListener;


var form = document.getElementById('item_form');
var inputs = form.getElementsByTagName('input');

// create a request object
xhr = new XMLHttpRequest();

// initialise a request, specifying the HTTP method
// to be used and the URL to be connected to.
xhr.open("POST", "../php/add_item.php", true);
console.log(inputs[0].value); // debugging

// Sends the inputs to the add_item.php file
xhr.send(inputs);
};

window.onload = pageLoaded;

在这里,我尝试将表单中的输入发送到位于我的文件系统中 "../php/add_item.php" 的名为 add_item.php 的 PHP 文件。 我很确定这段代码可以工作,并将输入以数组的形式发送到 PHP 文件。

我的问题是,我如何在该文件中使用 $_REQUEST 才能使用数组中的输入发送到数据库?或者,最好的方法是什么?

【问题讨论】:

    标签: javascript php ajax arrays xmlhttprequest


    【解决方案1】:

    xhr.send() 方法只接受一个字符串。如果要发送数组,则必须在发布之前将其展平为字符串。您可以使用 javascript 中的 JSON.stringify() 方法轻松完成此操作,然后在接收到它时使用 PHP 中的 json_decode() 函数。

    此外,为了让 PHP 在 $_POST[] 变量中正确接收数据(或 $_REQUEST,如果必须,但不推荐),您需要为 POST 变量设置名称并对 JSON 文本进行 URL 编码,如下所示:

    var json_array = JSON.stringify(inputs);    
    xhr.send('myJSONData=' + encodeURIComponent(json_array));
    

    在 PHP 端,您不需要使用 urldecode(),因为服务器堆栈期望接收经过 url 编码的 POST 名称-值对。但是您需要在发布的变量上使用 json_decode 来获取数组,例如:

    php_array = json_decode($_POST["myJSONData"]);
    

    您将看到执行此操作的其他方法,包括将 xhr POST 内容类型标头设置为 JSON,但根据我的经验,这是阻力最小的路径。

    另请注意,虽然可以像这样以 HTML 形式发送对象“数组”:

    <input type="text" name="myArray[]" value="val1">
    <input type="text" name="myArray[]" value="val2">
    <input type="text" name="myArray[]" value="val3">
    <input type="text" name="myArray[]" value="val4">
    
    • 这将导致一个数组在 PHP 中的变量 $_POST["myArray"] 中可用,使用 XHR 对象(AJAX 方法)没有简单的等价物。 JSON.stringify() 是 IMO 最简单的方法。

    【讨论】:

    • Uncaught TypeError: Converting circular structure to JSON 我之前确实考虑过使用 json!你知道这是什么原因造成的吗?
    • 可能是因为您尝试对 值数组进行字符串化。在上面的示例中,您尝试打包的数组是 getElementsByTagName() 返回的 DOM 对象数组。对象将有一个参考,例如父级,它本身将具有对其子级的引用,因此是循环引用。这里有几个解决这个问题的例子:linklink
    【解决方案2】:

    $_REQUEST 中的变量存储为数组。要访问它们,您需要执行类似的操作:

    echo $_REQUEST['input_1'];
    

    要查看 JS 发送的所有变量(格式不错),您可以使用以下代码:

    echo "<pre>";
    print_r($_REQUEST);
    echo "</pre>";
    

    【讨论】:

    • 谢谢,您的第二个示例在页面上打印出Array()...我猜这是因为$_REQUEST 是一个包含我的输入数组的数组,我不知道如何将这些数组元素中的每一个元素重新放入自己的变量中
    • 这意味着它是一个空数组,没有任何东西被传递给 $_REQUEST 变量。
    • 我认为它是空的,因为 @james-firth 刚刚说过“xhr.send() 方法只接受一个字符串”
    • 很可能,尝试查看此线程以更好地理解使用 jQuery 完成此操作:stackoverflow.com/questions/7426085/…
    【解决方案3】:

    你不能以你正在做的方式去做。您发送不正确的“输入”数组。您应该准备输入值数组。 Morover,我建议你使用 JQuery。

     $(function (){
      $("#submit").click(function (){
       //the way to get input values and names
       var arr = [];
       $("input").each(function (index,value){});
           arr.push([$(value).attr('name'), $(value).val()];
       });
       // it can be replaced also via serialize() funciton
    
       //ajax
       $.post( "../php/add_item.php", arr)
       .done(function( data ) {
          //data has been send response is in data object
       });
      });
     });
    

    在 PHP 中,您可以通过 $_POST 获取这些值。 $_REQUEST 这里不需要,因为您使用 POST 方法。例如,如果您有输入

    <input name="xxx" value="test">
    

    要在 PHP 中打印此输入的值,您需要使用此代码

    echo $_POST['xxx'];
    

    如果您不想使用 JQuery,那么您仍然需要循环输入并准备适当的数组以通过 XHR 发送它。

    【讨论】:

    • 我还没有遇到过 JQuery,这让我很难理解......这会取代什么代码?或者这会叫什么名字?
    • 它会去var submit = function () {...而不是这个函数吗?所以看起来像var submit = $function (){...
    • 它可以替换你的整个代码。查看 www.jquery.com 有很多示例代码。
    • 但我只希望在按下页面上的提交按钮时执行此代码,这就是为什么我在顶部有事件监听器所以肯定需要吗?
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多