Ошибка PHP CURL: данные возвращают значение NULL

У меня есть код JSON, который я помещаю в файл JSON с именем data.json.

код JSON:

[
 {"value":"23","date":"03/2018"},
 {"value":"43","date":"03/2019"},
 {"value":"34","date":"12/2017"},
 {"value":"13","date":"01/2019"},
 {"value":"34","date":"02/2019"}
]

Теперь код php, который я использую для извлечения данных, выглядит следующим образом:

$url = "data.json" ;

$ch = curl_init() ;

curl_setopt($ch, CURLOPT_URL, $url) ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch);


curl_close($ch) ;


$data = json_decode($result, true) ;

foreach($data as $mydata)
{
  $data1 = $mydata["value"] ;
  $data2 = $mydata["date"] ;

echo $data1 ." : ". $data2 ;
echo "<br/>";

}

Я не понимаю, что не так с кодом, но он выдает ошибку Warning

Invalid argument supplied for foreach()

Это происходит потому, что данные возвращают значение НУЛЕВОЙ, но я не знаю, почему мой формат данных JSON неверен. Формат выглядит нормально. Но он по-прежнему возвращает значение NULL.

Вы получаете данные в $data?

Mangesh Sathe 23.04.2019 12:22

Что вам дает console.info($result);?

Kévin Bibollet 23.04.2019 12:23

var_dump $data, чтобы увидеть, что там находится - когда я использую ваш json напрямую, это работает для меня

B001ᛦ 23.04.2019 12:23

не могли бы вы сбросить переменную $mydata, пожалуйста, и показать нам

rapaelec 23.04.2019 12:24

Var_dump($data) дает мне NULL Result @rapaelec Но почему?

Okeyy 23.04.2019 12:25

foreach также неверен, он должен быть foreach($data as $key => $value)

Mangesh Sathe 23.04.2019 12:25

@ B001ᛦ Нет опечатки, ему нужны ключ и значение, foreach должен иметь ключ и значение для следующих строк кода $data1 = $mydata["value"] ; $data2 = $mydata["дата"] ;

Mangesh Sathe 23.04.2019 12:30

Я изменил заголовок и описание вопроса. пожалуйста, дайте мне знать, почему я получаю эту ошибку

Okeyy 23.04.2019 12:40

этот файл json находится на вашем сервере? почему вы используете cUrl и бот file_get_contents?

shushu304 23.04.2019 12:42

Вы уверены, что используете правильный URL?

B001ᛦ 23.04.2019 12:42

@ shushu304 Может быть, я могу использовать этот контент с внешнего URL-адреса, поэтому я использую cURL.

Okeyy 23.04.2019 12:44

@ B001ᛦ да, оба файла находятся в одной папке

Okeyy 23.04.2019 12:45

@abnit-chauhan использовать cUrl для локального файла бесполезно, попробуйте перейти на использование file_get_contents, если это локальный файл, и используйте curl, если это URL/

shushu304 23.04.2019 12:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
13
1 124
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

при использовании cUrl только с именем файла cUrl думает, что это URL-адрес, поэтому вы получите ошибку

curl: (6) Could not resolve host

если это локальный файл, я предпочту использовать file_get_contents...

$json = file_get_contents("file.json");
put here your json decode and logic

и в случае URL использовать завиток.

чтобы ответить и помочь вам, давайте попробуем посмотреть, есть ли у вас какие-либо ошибки от curl...

измените такой код и обновите нас

попробуйте использовать curl_error и проверьте, нет ли ошибок от cUrl,

то, что вы получаете?

$url = "data.json" ;
$ch = curl_init() ;
curl_setopt($ch, CURLOPT_URL, $url) ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch);

if (curl_error($ch)) {
    $error_msg = curl_error($ch);
}

curl_close($ch) ;

if (isset($error_msg)) {
    // TODO - Handle cURL error accordingly
}

// put here your json decode and logic

Я понял, что я делаю неправильно. Когда я добавляю полный URL-адрес в $url . Я могу получить данные. Но знаете ли вы причину, почему?

Okeyy 23.04.2019 12:50

я пытаюсь помочь... сначала проверьте, что за ошибки... а потом мы обновим и продолжим помогать вам

shushu304 23.04.2019 12:51

Спасибо за помощь . Я не минусовал твой ответ. но может быть ваша причина верна. Использование завитка, когда это необходимо, является лучшей практикой.

Okeyy 23.04.2019 12:53

Пожалуйста, попробуйте это, и давайте продолжим разбираться. и вы можете проголосовать :)

shushu304 23.04.2019 12:55

Я проголосовал, но мои голоса не учитываются. Позвольте мне попробовать этот пример

Okeyy 23.04.2019 12:56
Ответ принят как подходящий

Вы должны указать полный URL-адрес файла JSON, если вы используете CURL вместо data.json

http://localhost/text.json 

другие варианты получения данных из json

$result = file_get_contents($url);

У меня работает нормально. Пожалуйста, проверьте.

<?php
      $url = "http://raveesh.rnd/data.json" ;
      $ch = curl_init() ;

      curl_setopt($ch, CURLOPT_URL, $url) ;
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      $result = curl_exec($ch);
      curl_close($ch) ;

      $data = json_decode($result, true) ;

      foreach($data as $mydata)
      {
           $data1 = $mydata["value"] ;
           $data2 = $mydata["date"] ;

           echo $data1 ." : ". $data2 ;
           echo "<br/>";
      }
?>

Output:

 23 : 03/2018
 43 : 03/2019
 34 : 12/2017
 13 : 01/2019
 34 : 02/2019

Проблема вот в чем:

1- вы не можете скручивать один и тот же хост, вы должны использовать функцию file_get_content(), чтобы получить свой json, например:

<?php

$string = file_get_contents("./data.json");
$data = json_decode($string, true);



foreach($data as $mydata)
{
  $data1 = $mydata["value"] ;
  $data2 = $mydata["date"] ;

echo $data1 ." : ". $data2 ;
echo "<br/>";

}

если вы хотите использовать curl , это должен быть другой хост, например:

<?php

$url = "http://date.jsontest.com" ;

$ch = curl_init($url) ;

$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array('Content-type: application/json')
);

curl_setopt_array( $ch, $options );
$result = curl_exec($ch);

curl_close($ch) ;

$result = json_decode($result, 1);


foreach($result as $key => $mydata)
{
    echo $key ." : ". $mydata ;
    echo "<br/>";
}

так что это зависит от структуры вашего Json

Спасибо

Другие вопросы по теме