尝试使用PHP和Curl从我的网站上的一个页面向另一个页面发出POST请求

时间:2011-10-28 16:06:26

标签: php post curl

嘿,我在这里看到了几个关于这个主题的问题,但是没有一个问题解决了我的问题。我的网站上有一个脚本,我想用它来为我的用户生成几种不同类型的电子邮件。我想要一种能够为不同的电子邮件创建模板文件的方法,这些电子邮件接受$ _POST变量来填充相关信息,并简单地向这些模板发出请求并获取作为电子邮件正文的回复。我正在尝试编写一个函数来接受模板文件的位置(相对或绝对可以工作,但我更愿意相对老实说),以及我希望通过post发送到模板的参数数组。到目前为止,我没有运气。到目前为止,这是我的代码:

private function post_request($url, $data) {
    $output = array();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($ch);
    curl_close($ch);
    if ($result) {
        $output['status'] = "ok";
        $output['content'] = $result;
    } else {
        $output['status'] = "failure";
        $output['error'] = curl_error($ch);
    }
    curl_close($ch);
    return $output;
}

我从curl得到错误“无法连接到主机”,但在将我的网址输出到错误日志后,我已经能够验证将URL复制并粘贴到firefox中会导致正确查看页面。

有什么想法吗?我没有使用curl的想法,所以如果有更好的选择,我会非常乐意使用它。谢谢大家的帮助!

3 个答案:

答案 0 :(得分:0)

您应该可以使用file_get_contents(),只要您的主机没有阻止它访问远程位置(并且$ url脚本不专门查找POST数据)。

private function post_request($url, $data) {
    $output = array();

    $url_with_data = '';
    foreach ( $data as $k=>$v ){ // Loop through data and create request string
        $url_with_data .= '&' . $k . '=' . $v;
    }

    // Remove first ampersand and encode the data
    $url_with_data = urlencode( substr( $url_with_data, 1 ) );

    // Request file
    // Format will be http://url.com?var1=data&var2=data&var3=data
    $result = file_get_contents( $url . '?' . $url_with_data );

    if ($result) {
        $output['status'] = "ok";
        $output['content'] = $result;
    } else {
        $output['status'] = "failure";
        $output['error'] = 'Could not open remote file';
    }
    return $output;
}

答案 1 :(得分:0)

另一种选择:您说两个文件都驻留在同一台服务器上。如果是这种情况,您可以只需要()模板构建器。

private function post_request($url, $data) {
    $output = array();

    @require_once('./path/to/template_builder.php');

    if ($result) {
        $output['status'] = "ok";
        $output['content'] = $result;
    } else {
        $output['status'] = "failure";
        $output['error'] = 'Could not open remote file';
    }
    return $output;
}

然后在template_builder.php中:

<?php

unset( $result );

if ( is_array( $data ) ){
    // Parse $data ...
    $result = $email_template;
}

答案 2 :(得分:0)

事实证明,问题最终是服务器配置错误。服务器在尝试联系文件时超时,因为它遇到了错误的DNS服务器。修复解决了我的问题!