【问题标题】:Sending a multidimensional array using cURL and foreach in php在 php 中使用 cURL 和 foreach 发送多维数组
【发布时间】:2018-06-13 08:30:04
【问题描述】:

我也读过这个问题:Missing index in a multidimensional array PHP

我搜索了丢失的密钥,但没有。

我的目标是创建一个包含数组内信息的 csv 文件。 当我在同一台服务器上处理它时,我能够做到这一点,但由于环境升级和 csv 文件的划分,我必须使用第二台服务器,因此 CURL 请求。

问题是我可以调用 receiver.php 而这实际上创建了 file.csv ,但是这个文件是空的(0 字节)。 我唯一的日志是下面的那个..

请在下面找到php运行后的结果:

Array
(
    [0] => Array
        (
            [0] => name
            [1] => frank
        )

    [1] => Array
        (
            [0] => address
            [1] => none
        )

    [2] => Array
        (
            [0] => email
            [1] => some@email
        )

    [3] => Array
        (
            [0] => job
            [1] => none
        )

    [4] => Array
        (
            [0] => 
        )

    [5] => Array
        (
            [0] => options
            [1] => status
            [2] => link
            [3] => time
            [4] => note
            [5] => check
        )

    [6] => Array
        (
            [options] => none
            [status] => active
            [link] => http://something
            [time] => 2018-01-11 10:00
            [note] => none
            [check] => OK
        )

)
Array key exist for 0
Array key exist for 1
Array key exist for 2
Array key exist for 3
Array key exist for 4
Array key exist for 5
Array key exist for 6

我有一个包含许多 <input> 字段的表单;其中 4 个是静态的(姓名、电子邮件等),其他的在每次用户按下按钮时生成。 每次点击都会出现一行,用户可以输入更多数据。

此数据的 <input name=...> 是:

at row0:
name='prefs[0][options]'
name='prefs[0][status]'
name='prefs[0][link]'
name='prefs[0][time]'
name='prefs[0][note]'
name='prefs[0][check]'

If the user clicks the button, the row appears in the table and the new <input> fields will be:
name='prefs[1][options]'
name='prefs[1][status]'
name='prefs[1][link]'
name='prefs[1][time]'
name='prefs[1][note]'
name='prefs[1][check]'

.. and so on.

提交表单时,sender.php 处理数据。

我将有 2 个数组:

A - $list, which contain the static fields
B - $_POST['prefs'] containing each row

我将两个数组合并在一起:

$final_array = array_merge($list, $_POST['prefs']);

日志说:

PHP Notice:  Undefined index: fields_string in /var/www/report/receiver.php on line 4
PHP Warning:  Invalid argument supplied for foreach() in /var/www/report/receiver.php on line 4

sender.php

<?php

if (isset($_POST['submit'])){
    require_once('config.php');

    $name = addslashes(strip_tags($_POST["name"]));
    $address = addslashes(strip_tags($_POST["address"]));
    $email = addslashes(strip_tags($_POST["email"]));
    $job = addslashes(strip_tags($_POST["job"]));

    $list = array (
        array('name', "$name"),
        array('address', "$address"),
        array('email', "$email"),
        array('job', "$job"),
        array(''),
        array('options', 'status', 'link','time', 'note','check' )
    );


    // Merge the 2 arrays and split to variables
    $final_array = array_merge($list, $_POST['prefs']);
    echo '<pre>'; print_r($final_array); echo '</pre>';
    sleep(2);

    // Check for missing keys
    $firstkey = key($final_array); // get first index of array
    end($final_array);         
    $lastkey = key($final_array);  // get last index of array
    for($i = $firstkey;$i <= $lastkey;$i++) {
        if(!array_key_exists($i,$final_array)) { // check key exist or not 
            echo "Missing Array key is ".$i."<br/>";
        } else echo "Array key exist for ".$i."<br>";
    }


    $fields_string = "";
    foreach($final_array as $key=>$value) {
        $fields_string .= $key.'='.$value.'&';
        }
    rtrim($fields_string, '&');


    // Send through CURL
    $ch = curl_init('http://192.168.10.10/receiver.php');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

    // execute!
    $response = curl_exec($ch);

    // close the connection, release resources used
    curl_close($ch);

    // do anything you want with your response
    var_dump($response);


    header("Location:index.php");
    exit;

}
?>

receiver.php

<?php
$csv = fopen( "/home/user/file.csv", 'w+' );
foreach ($_POST["fields_string"] as $fields) {
    fputcsv($csv, $fields, ";");
}
fclose($csv);
?>

【问题讨论】:

  • fields_string 是字符串类型,您不能在 foreach 中使用它。它的数组函数
  • 为什么不使用http_build_query($final_array)?
  • 没试过,明天去办公室看看!谢谢
  • 我使用了this链接:并更新了代码:$array_final = http_build_query_same_names($final_array); curl_setopt($ch, CURLOPT_POSTFIELDS, $array_final);,但我没有解决。相同的日志错误。请问您是否有时间提供解决方案?我在这里有点困惑
  • curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($final_array)); 也在尝试这种方式。我想知道问题是否出在接收器上...

标签: php curl post


【解决方案1】:

感谢This awesome reply,我明白我只能使用$POST。

发件人:

<?php

function post_to_url($url, $data) {
    $post = curl_init();

    curl_setopt($post, CURLOPT_URL, $url);
    curl_setopt($post, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($post, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($post);
    curl_close($post);
}

if (isset($_POST['submit'])){

    $name = addslashes(strip_tags($_POST["name"]));
    $address = addslashes(strip_tags($_POST["address"]));
    $email = addslashes(strip_tags($_POST["email"]));
    $job = addslashes(strip_tags($_POST["job"]));

    $list = array (
        array('name', "$name"),
        array('address', "$address"),
        array('email', "$email"),
        array('job', "$job"),
        array(''),
        array('options', 'status', 'link','time', 'note','check' )
    );


    // Merge the 2 arrays together
    $final_array = array_merge($list, $_POST['prefs']);

    // Send through CURL
    post_to_url("http://192.168.10.10/receiver.php", $final_array);

    header("Location:index.php");
    exit;
}

?>

接收者:

<?php
$csv = fopen( "/home/user/file.csv", 'w+' );
foreach ($_POST as $fields) {
    fputcsv($csv, $fields, ";");
}
fclose($csv);
?>

现在它可以工作了。

【讨论】:

  • 如果我也想发送 $_GET,那么:function post_to_url($url, $data, $foo) - curl_setopt($post, CURLOPT_URL, $url.'?bar='.$foo); - post_to_url("http://192.168.10.10/receiver.php", $final_array, $foobar); - 以及接收者.php:$foo= $_GET['bar'];。轻松
  • 如果解决方案完全符合我的需求,我不明白为什么有人会否决这个。
猜你喜欢
  • 2011-04-15
  • 2015-01-31
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2016-07-03
  • 2017-10-10
相关资源
最近更新 更多