Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: json и php
Форумы портала PHP.SU » » Вопросы новичков » json и php

Страниц (1): [1]
 

1. myspase - 13 Февраля, 2017 - 23:48:15 - перейти к сообщению
Всем привет,
получаю JSON ответ от сервера,обработав ответ в браузере выводится текст без переноса строки с тегами <br/> в виде текста,пример ниже

google.com<br/>Registry Domain ID: 2138514_DOMAIN_COM-VRSN< br/>Registrar WHOIS Server: whois.markmonitor.com< br/>Registrar URL: markmonitor.com<; br/>Updated Date: 2015-06-12T10:38:52-0700< br/>

было решено воспользоватся функцией preg_replace где заменил <br/> на тот же <br/>
перенос удалось получить, но в конце и начале подстроки остались угловые скобки

Domain Name: google.com<
>Registry Domain ID: 2138514_DOMAIN_COM-VRSN<
>Registrar WHOIS Server: whois.markmonitor.com<
>Registrar URL: http://www.markmonitor.com<
>Updated Date: 2015-06-12T10:38:52-0700<
>Creation Date: 1997-09-15T00:00:00-0700<
>Registrar Registration Expiration Date: 2020-09-13T21:00:00-0700<
>Registrar: MarkMonitor, Inc.<
>Registrar IANA ID: 292<

последующие манипуляции со str_replace или preg_replace ничего не дали, скобки либо не заменяются либо просто белая страница отображается, мой код
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. $content = file_get_contents('https://www.domaintally.com/api/v1/whois?access_token=bfb4f4f431f1f366fcff9b30b78fe5d67ee20e97&domain=google.com');
  4. $JSON = json_decode($content);
  5. $updated = $JSON->data->{'google.com'}->full_whois;
  6. $asd =  preg_replace('<br/>','<br/>',"$updated");
  7. echo $asd;
  8. ?>

в чем может быть причина?
2. teleoperator27 - 14 Февраля, 2017 - 03:26:11 - перейти к сообщению
А ты бы исходный код страницы глянул, сразу стало ясно в чем проблема.

PHP:
скопировать код в буфер обмена
  1.  
  2. $content = file_get_contents('https://www.domaintally.com/api/v1/whois?access_token=bfb4f4f431f1f366fcff9b30b78fe5d67ee20e97&domain=google.com');
  3. $JSON= json_decode($content);
  4. $updated = htmlspecialchars_decode($JSON->data->{'google.com'}->full_whois);
  5. echo $updated;
  6.  
3. myspase - 14 Февраля, 2017 - 13:05:34 - перейти к сообщению
Спасибо, получилось,но теперь есть другая проблема в обьектах dns_records и domain_status
кажется json_decode не декодировал их и вывод получается неправильный, пробовал решить проблему таким образом

PHP:
скопировать код в буфер обмена
  1. $domain_status = $JSON->data->{'google.com'}->domain_status;
  2. $domain_status = html_entity_decode($domain_status);
  3. $domain_status = stripslashes($domain_status);
  4. echo $domain_status;

но ничего не вышло, ниже примеры вывода
domain_status:
["clientDeleteProhibited https://icann[dot]org
/epp#clientDeleteProhibited","clientTransferProhibited https://icann[dot]org/epp#clientTran[dot][dot][dot]UpdateProhibited https://icann[dot]org
/epp#clientUpdateProhibited","serverDeleteProhibited https://icann[dot]org
/epp#serverDeleteProhibited","serverTransferProhibited https://icann[dot]org/epp#serverTran[dot][dot][dot]UpdateProhibited https://icann.org/epp#serverUpdateProhibited"]

dns_records:
[{"host":"google.com","class":"IN","ttl":"227","type":"A","ip":"172.217.22.14"},{"host":"google.com","class":"IN","ttl":"53759","type":"NS","target":"ns3.google.com"},{"host":"google.com","class":"IN","ttl":"53759","type":"NS","target":"ns2.google.com"},{"host":"google.com","class":"IN","ttl":"53759","type":"NS","target":"ns4.google.com"},{"host":"google.com","class":"IN","ttl":"53759","type":"NS","target":"ns1.google.com"},

может,нужно иначе выводить эти обьекты?
4. teleoperator27 - 14 Февраля, 2017 - 14:40:27 - перейти к сообщению
полагаю, его тоже надо разобрать


PHP:
скопировать код в буфер обмена
  1.  
  2. $json= json_decode($content);
  3. //$updated = htmlspecialchars_decode($json->data->{'google.com'}->full_whois);
  4. $dns_records = json_decode($json->data->{'google.com'}->dns_records);
  5.  
  6. echo '<pre>';
  7. print_r($dns_records);
  8. echo '</pre>';
  9.  
5. myspase - 14 Февраля, 2017 - 16:19:11 - перейти к сообщению
а как быть если в dns_records и domain_status может содержатся информация допустим с другого ресурса(к примеру ok.ru),тогда вывод типа
PHP:
скопировать код в буфер обмена
  1. $dns_records = json_decode($json->data->{'google.com'}->dns_records->0->hots);

не получится как как для разных запросов будет возвращатся разное количество данных
к примеру
domain_status google.com (кстати почему вернулся ассоциативный массив вместо std object? json_decode без параметра true)
Спойлер (Отобразить)

domain_status ok.ru
Спойлер (Отобразить)

dns_records google.com (возвращает std object)
Спойлер (Отобразить)

dns_records ok.ru
Спойлер (Отобразить)

как же все-таки отображать эту информацию в корректном виде?(в случае как c full_whois)
6. teleoperator27 - 14 Февраля, 2017 - 16:20:41 - перейти к сообщению
ну а если домен еще до запроса урла в переменную загнать и ее подставлять в процессе?
(Добавление)
ну, не прокатит наверное
(Добавление)
Я, может, не так понял понял проблему, но все нормально выводится


PHP:
скопировать код в буфер обмена
  1.  
  2. $url     = "ok.ru";
  3. $content = file_get_contents('https://www.domaintally.com/api/v1/whois?access_token=bfb4f4f431f1f366fcff9b30b78fe5d67ee20e97&domain='.$url);
  4. $json    = json_decode($content);
  5.  
  6. echo '<pre>';
  7. print_r($json);
  8. echo '</pre>';
  9. echo "<hr>";
  10.  
  11. $updated = htmlspecialchars_decode($json->data->{$url}->full_whois);
  12.  
  13. echo '<pre>';
  14. print_r($updated);
  15. echo '</pre>';
  16. echo "<hr>";
  17.  
  18. $dns_records = json_decode($json->data->{$url}->dns_records);
  19.  
  20. echo '<pre>';
  21. print_r($dns_records);
  22. echo '</pre>';
  23.  
7. myspase - 14 Февраля, 2017 - 17:05:28 - перейти к сообщению
Я скорее всего неправильно выразился, с самим выводом уже проблем нет, допустим я хочу прикрутить кнопку на сайте, которая будет передавать в GET сам url и будет выводится информация о домене, под удобочитаемым видом я имел ввиду отображение вывода на старнице без скобок,надписей Array и тд
например вот так

host: ok.ru
class: IN
ttl: 85
type: A
ip: 217.20.147.94

а не вот так

Array
(
[0] => stdClass Object
(
[host] => ok.ru
[class] => IN
[ttl] => 85
[type] => A
[ip] => 217.20.147.94
)

я понимаю, что можно вывести элемент обьекта(допустим [host]) таким образом
PHP:
скопировать код в буфер обмена
  1.   json_decode($json->data->{$url}->dns_records->0->host)

и как по всем интересующим меня пунктам,но это будет работать только для одного конкретного сайта, так как для google эти записи в обьекте будут отличаться и они просто не выведутся или приведут к ошибке
8. teleoperator27 - 14 Февраля, 2017 - 17:09:21 - перейти к сообщению
не приведут они ни к какой ошибке. Вернется или строка или массив, сделал проверку, если массив, то возвращаешь его, например, через foreach, а если строка, то так отдаешь.
9. myspase - 14 Февраля, 2017 - 17:26:59 - перейти к сообщению
Я прощу прощения,но я не совсем понял, при помощи gettype проверяем строка или массив, а потом если использовать foreach то print_r выведет что-то типа этого
Array
(
[host] => ok.ru
[class] => IN
[ttl] => 85
[type] => A
[ip] => 217.20.147.94
)
может у вас пример кода завалялся?
10. teleoperator27 - 14 Февраля, 2017 - 17:49:46 - перейти к сообщению
print_r не для того, что бы выводить информацию на сайт, а для отладки. Что бы разработчик мог посмотреть, "что внутри". А foreach он и в африке foreach


PHP:
скопировать код в буфер обмена
  1. $url     = "ok.ru";
  2.  
  3. $content = file_get_contents('https://www.domaintally.com/api/v1/whois?access_token=bfb4f4f431f1f366fcff9b30b78fe5d67ee20e97&domain='.$url);
  4.  
  5. $json    = json_decode($content);
  6.  
  7. $updated = htmlspecialchars_decode($json->data->{$url}->full_whois);
  8.  
  9. $dns_records = json_decode($json->data->{$url}->dns_records);
  10.  
  11. foreach($dns_records as $key=>$value){
  12.  
  13.         echo   '<hr>';
  14.  
  15.         foreach($value as $k=>$v){
  16.  
  17.                 echo $k . ' = ' . $v . '<br>';
  18.  
  19.         }
  20. }


hr и br я для наглядности вставил
11. myspase - 14 Февраля, 2017 - 18:10:25 - перейти к сообщению
Благодарю,это именно то что я хотел узнать

 

Powered by ExBB FM 1.0 RC1