-2

我正在尝试使用此 PHP 访问有关 Stack Overflow 的最新评论列表:

<?php
    function do_post_request($url, $data, $optional_headers = null)
    {
      $params = array('http' => array(
                  'method' => 'POST',
                  'content' => $data
                ));
      if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
      }
      $ctx = stream_context_create($params);
      $fp = @fopen($url, 'rb', false, $ctx);
      if (!$fp) {
        throw new Exception("Problem with $url, $php_errormsg");
      }
      $response = @stream_get_contents($fp);
      if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
      }
      return $response;
    }
    echo do_post_request("https://api.stackexchange.com/2.1/comments?order=desc&sort=creation&site=stackoverflow", "");
?>

但是,当我运行它时,我收到以下错误消息:

$ php index.php 

PHP Notice:  Undefined variable: php_errormsg in /var/www/secomments/index.php on line 14
PHP Fatal error:  Uncaught exception 'Exception' with message 'Problem with https://api.stackexchange.com/2.1/comments?order=desc&sort=creation&site=stackoverflow, ' in /var/www/secomments/index.php:14
Stack trace:
#0 /var/www/secomments/index.php(22): do_post_request('https://api.sta...', '')
#1 {main}
  thrown in /var/www/secomments/index.php on line 14

是否有人对可能导致此问题的原因有任何想法,以及如何解决此问题?

4

2 回答 2

5

在这种情况下,应该从方法调用 API get

如果您确实访问了此链接上的 API:https://api.stackexchange.com/2.1/comments?order=desc&sort=creation&site=stackoverflow
您会看到一个漂亮的 JSON,其中包含您想要的所有信息。

相反,您可以修复 post 参数:

$params = array('http' => array(
    'method' => 'POST',
    'content' => $data,
    'header' => 'Content-Length: ' . strlen($data)
));

而是向您显示:

{"error_id":404,"error_name":"no_method","error_message":"this method cannot be called this way"}

希望您知道您可以简单地使用file_get_contents传统的 get 来联系 API。

$json = json_decode(file_get_contents("https://api.stackexchange.com/2.1/comments?order=desc&sort=creation&site=stackoverflow"), true);
于 2013-10-04T03:31:15.483 回答
-1

正如错误所说php_errormsg是你的问题。

您必须确保在php_errormsg定义假设之前跟踪错误。

在尝试获取 的值之前,您应该打开track_errorsphp_errormsg配置选项,例如:

<?php
    function do_post_request($url, $data, $optional_headers = null)
    {
      error_reporting(E_ALL);
      ini_set('track_errors', 1);

       global $php_errormsg;

      $params = array('http' => array(
                  'method' => 'POST',
                  'content' => $data
                ));
      if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
      }
      $ctx = stream_context_create($params);
      $fp = @fopen($url, 'rb', false, $ctx);
      if (!$fp) {
        throw new Exception("Problem with $url, $php_errormsg");
      }
      $response = @stream_get_contents($fp);
      if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
      }
      return $response;
    }
    echo do_post_request("https://api.stackexchange.com/2.1/comments?order=desc&sort=creation&site=stackoverflow", "");

编辑:

同样在 php.ini 配置文件中,您可以设置:

track_errors = On

重要提示:来自PHP 网站

虽然$php_errormsg是全球性的,但它不是超全球性的。

您必须在函数内使用全局关键字对其进行限定。

<?php function checkErrormsg() {
    global $php_errormsg;
    @strpos();
    return $php_errormsg; } ?>

编辑2:使用全局变量=不良做法 链接 链接

于 2013-10-04T01:45:50.050 回答