【问题标题】:PHP json_decode with curl returning Notice: Trying to get property of non-objectPHP json_decode with curl 返回注意:试图获取非对象的属性
【发布时间】:2016-08-10 10:45:53
【问题描述】:

我想为我的 Cloudant 数据库定义不同的搜索字符串。但是我的 curl 函数有问题。你看出什么不对了吗?

function get_results($url, $bookmark = NULL, $results = array()){
   $username = 'name';
   $password = 'pw';

   $url = $bookmark !== NULL ? $url."&bookmark=$bookmark" : $url;

   $ch = curl_init();
   $timeout = 5;
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
   $r = curl_exec($ch);

   curl_close($ch);

   $response = json_decode($r);

   if(count($response->rows) === 200){
       foreach($response->rows as $row){
           $results[] = $row->doc;
       }
       return get_results($url, $response->bookmark, $results);
   } else {
       foreach($response->rows as $row){
           $results[] = $row->doc;
       }
       return $results;
   }
}

我收到此警告/通知:

Notice: Trying to get property of non-object in C:\xampp\... on line 62

Notice: Trying to get property of non-object in C:\xampp\... on line 68

Warning: Invalid argument supplied for foreach() in C:\xampp\... on line 68

第 62 行是:if(count($response->rows) === 200){

第 68 行是:foreach($response->rows as $row){

谢谢!

【问题讨论】:

  • 了解基本的调试
  • 您是否检查过 $response 的值以确保它包含您尝试访问的属性。这些错误告诉您您正在尝试访问不存在的属性。例如,$response->rows,它告诉你 $response 中不存在“rows”。设置 $response 的值后尝试 print_r($response)。
  • 谢谢,你是对的。它是空的。在我的笔记本电脑上是相同的 PHP 版本和相同的 xamp 版本,它可以工作,但不能在电脑上 -.- 我不明白。

标签: php json curl


【解决方案1】:

在你的 curl 中使用以下 header 选项,将返回 json 对象:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

因为默认接受类型是 Text/Plain 所以它会返回你解析的字符串。通过设置上述标头,您将收到 json 对象。

【讨论】:

  • 谢谢,但不幸的是同样的通知
  • 那你可能没有json响应
  • 而且您可能还需要删除 json_decode 因为我们已经设置了 json 类型
【解决方案2】:

安全解决方案

  1. libcurl official site下载最新的cacert.pem。
  2. 在 php.ini 中编辑 curl.cainfo 并重新启动服务器。
    或者只是使用CURLOPT_CAINFO 选项进行配置。

在 php.ini 中永久设置:

curl.cainfo="/path/to/cacert.pem"

在 PHP 代码中临时设置:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

【讨论】:

    【解决方案3】:

    我明白了!问题是 ssl 证书。我用

    禁用了它
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    

    现在我得到了回复!

    【讨论】:

    • 你知道你实际上在做什么吗?您正在在不受信任的路径中发送用户名和密码。请参考Man-in-the-middle attack
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多