จะใช้ cURL เพื่อรับข้อมูล jSON และถอดรหัสข้อมูลได้อย่างไร


96

ดังนั้นฉันจึงมีลิงค์ที่ส่งคืนอ็อบเจ็กต์ jSON และฉันต้องถอดรหัสและใส่ลงในตัวแปรใน PHP

URL

api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1

นี่คือวัตถุที่ส่งคืน

{
    "count": 1,
    "threads": {
        "38752": {
            "thread_id": 38752,
            "node_id": 4,
            "title": "The ShadyCraft Beta Launch!",
            "reply_count": 45,
            "view_count": 946,
            "user_id": 2,
            "username": "Shady",
            "post_date": 1366956695,
            "sticky": 0,
            "discussion_state": "visible",
            "discussion_open": 1,
            "discussion_type": "",
            "first_post_id": 226167,
            "first_post_likes": 7,
            "last_post_date": 1369094302,
            "last_post_id": 228226,
            "last_post_user_id": 2,
            "last_post_username": "Shady",
            "prefix_id": 19,
            "tinhte_xentag_tags": "a:4:{i:0;s:9:\"minecraft\";i:2;s:4:\"news\";i:3;s:14:\"private server\";i:1;s:10:\"shadycraft\";}",
            "content": {
                "count": 1,
                "content": {
                    "226167": {
                        "post_id": 226167,
                        "thread_id": 38752,
                        "user_id": 2,
                        "username": "Shady",
                        "post_date": 1366956695,
                        "message": "[ATTACH=full]4143[\/ATTACH]\n \nWe've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.\n \nCurrent Features\n[LIST]\n[*]Towns\n[*]Nations\n[*]All out wars\n[*]A live update map\n[*]No White-list\n[*]Earn Money\n[*]Griefing allowed where possible\n[\/LIST]\nThese are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.\n \nWe really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.\n \n[SIZE=4]All of this is shown in the live updating map located [URL='http:\/\/50.7.6.116:8123']here[\/URL].[\/SIZE]\n \n[SIZE=4][SIZE=6]Join the Beta Now[\/SIZE][\/SIZE]\n[SIZE=6]Server-IP: 50.7.6.116[\/SIZE]\n \n \n[USER=118053]Frenchy[\/USER] and [USER=4863]Wolfbane[\/USER]",
                        "ip_id": 747429,
                        "message_state": "visible",
                        "attach_count": 1,
                        "position": 0,
                        "likes": 7,
                        "like_users": "a:5:{i:0;a:2:{s:7:\"user_id\";i:105699;s:8:\"username\";s:6:\"kvothe\";}i:1;a:2:{s:7:\"user_id\";i:146724;s:8:\"username\";s:12:\"Graveyard219\";}i:2;a:2:{s:7:\"user_id\";i:70182;s:8:\"username\";s:9:\"wmbrown18\";}i:3;a:2:{s:7:\"user_id\";i:5473;s:8:\"username\";s:9:\"Oblivious\";}i:4;a:2:{s:7:\"user_id\";i:118053;s:8:\"username\";s:7:\"Frenchy\";}}",
                        "warning_id": 0,
                        "warning_message": "",
                        "anonymous_posting_real_user_id": 0,
                        "anonymous_posting_real_username": ""
                    }
                }
            }
        }
    }
}

ฉันสนใจเฉพาะไฟล์

"title":"The ShadyCraft Beta Launch!",  
"reply_count:"45, 
"view_count": 946,  
"user_id":2, 
"username":"Shady", 
"post_date":1366956695, 
"sticky":0, 
"discussion_state":"visible",
"discussion_open":1,

และสุดท้ายข้อความ

[ATTACH=full]4143[/ATTACH]

We've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.

Current Features
[LIST]
[*]Towns
[*]Nations
[*]All out wars
[*]A live update map
[*]No White-list
[*]Earn Money
[*]Griefing allowed where possible
[/LIST]
These are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.

We really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.

[SIZE=4]All of this is shown in the live updating map located [URL='http://50.7.6.116:8123']here[/URL].[/SIZE]

[SIZE=4][SIZE=6]Join the Beta Now[/SIZE][/SIZE]
[SIZE=6]Server-IP: 50.7.6.116[/SIZE]


[USER=118053]Frenchy[/USER] and [USER=4863]Wolfbane[/USER]

ดังนั้นฉันจะแยกออบเจ็กต์ jSON และนำไปแก้ไขตัวแปรใน PHP ที่ฉันสามารถใช้ในภายหลังได้อย่างไร

ตัวแปรที่ต้องการ: $username, $user_id, $message, $title, $discussionStateและอื่น ๆ

ฉันแค่ต้องรู้ว่าฉันจะดึงวัตถุ jSON ได้อย่างไรจากนั้นแยกข้อมูลเป็นตัวแปรใน PHP

ตอนนี้ฉันสามารถรับอาร์เรย์ PHP ได้แล้ว แต่ฉันมีปัญหาในการเรียกค่าที่ถูกต้อง นี่คืออาร์เรย์

เป็นเวลาค่อนข้างนานแล้วที่เราเริ่มรวมฟอรัม phanime เข้ากับเว็บไซต์หลัก ตอนนี้เราได้ทำการรวมเข้ากับ phanime Forums และเว็บไซต์หลักเรียบร้อยแล้ว คุณจะไม่สังเกตเห็นอีกต่อไปว่ามีสองแพลตฟอร์มที่ใช้งาน phanime แต่แทนที่จะเป็นเพียงแพลตฟอร์มเดียว ขั้นตอนต่อไปของเราคือการกำหนดธีมของฟอรัมเพื่อให้ดูเหมือนเว็บไซต์หลัก! [ip_id] => 268 [message_state] => มองเห็นได้ [attach_count] => 0 [ตำแหน่ง] => 0 [ไลค์] => 0 [like_users] => a: 0: {} [warning_id] => 0 [warning_message] =>))))))

สมมติว่าอาร์เรย์นี้ถูกตั้งชื่อ$arrayแล้วเพื่อให้ได้ค่าขององค์ประกอบแรก "[count]" ฉันไม่สามารถพูดสิ่งต่อไปนี้ได้: print $array["[count]"] <- สิ่งนี้ส่งคืนข้อผิดพลาด

สิ่งที่เกี่ยวกับองค์ประกอบที่มีค่าเป็นอาร์เรย์ซึ่งเป็น[threads]องค์ประกอบ ฉันจะได้รับค่า[thread_id]องค์ประกอบได้อย่างไร

คำตอบ:


267

ฉันคิดว่าสิ่งนี้จะตอบคำถามของคุณ: P

$url="https://.../api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=‌​desc&limit=1&grab_content&content_limit=1";

การใช้ cURL

//  Initiate curl
$ch = curl_init();
// Will return the response, if false it print the response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Set the url
curl_setopt($ch, CURLOPT_URL,$url);
// Execute
$result=curl_exec($ch);
// Closing
curl_close($ch);

// Will dump a beauty json :3
var_dump(json_decode($result, true));

การใช้ file_get_contents

$result = file_get_contents($url);
// Will dump a beauty json :3
var_dump(json_decode($result, true));

การเข้าถึง

$array["threads"][13/* thread id */]["title"/* thread key */]

และ

$array["threads"][13/* thread id */]["content"/* thread key */]["content"][23/* post id */]["message" /* content key */];

1
ฉันได้อัปเดตคำถามด้วยปัญหาเล็กน้อยที่ฉันกำลังทำงานกับอาร์เรย์ PHP ที่ส่งคืนโดย jSON โปรดอ่านส่วนล่างของมันถ้าคุณทำได้
Maaz

ไฮ! ฉันเริ่มมีปัญหาคล้าย ๆ กันกับคำตอบของคุณ แต่ยังคงติดอยู่ที่ตู้เอทีเอ็มคุณช่วยดูไหม stackoverflow.com/questions/28033267/…
Leon Gaban

ถูกตัอง. CURLOPT_RETURNTRANSFERให้ผลลัพธ์ที่ถูกต้อง (y) ขอบคุณ!
ariyandi

หลังจากใช้เวลาหลายชั่วโมงเพิ่มบรรทัด // ปิดใช้งานการตรวจสอบ SSL curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); ส่งคืนผลลัพธ์
kta

10

ในการรับวัตถุคุณไม่จำเป็นต้องใช้ cURL (คุณกำลังโหลด dll อื่นลงในหน่วยความจำและมีการพึ่งพาอื่นเว้นแต่คุณจะต้องการ curl จริงๆฉันจะใช้ฟังก์ชัน php ในตัว) คุณสามารถใช้ php file_get_contents (url) ง่ายๆ ฟังก์ชัน: http://il1.php.net/manual/en/function.file-get-contents.php

$unparsed_json = file_get_contents("api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1");

$json_object = json_decode($unparsed_json);

จากนั้น json_decode () จะแยกวิเคราะห์ JSON เป็นอ็อบเจ็กต์ PHP หรืออาร์เรย์หากคุณส่งผ่านtrueไปยังพารามิเตอร์ที่สอง http://php.net/manual/en/function.json-decode.php

ตัวอย่างเช่น:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));           // Object
var_dump(json_decode($json, true));     // Associative array

แล้ว url ล่ะ? ฉันจะดึงออบเจ็กต์ jSON ในตอนแรกและตั้งค่าเป็นตัวแปร $ json ได้อย่างไร url คือ: /api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1 ซึ่งส่งคืนวัตถุ jSON
Maaz

1
ฉันได้อัปเดตคำถามด้วยปัญหาเล็กน้อยที่ฉันกำลังทำงานกับอาร์เรย์ PHP ที่ส่งคืนโดย jSON โปรดอ่านส่วนล่างของมันถ้าคุณทำได้
Maaz

สิ่งนี้ไม่ถูกต้อง คุณไม่สามารถส่ง URL ไปยัง file_get_contents () ได้ ... จำเป็นต้องเป็นชื่อไฟล์ (เส้นทาง)
Henrik Petterson

@HenrikPetterson: file_get_contents สามารถใช้เพื่อดึง URL ได้อย่างแน่นอนไม่เพียง แต่ไฟล์ในเครื่องเท่านั้น แม้ว่า cURL จะมีตัวเลือกมากกว่าและอาจเป็นตัวเลือกที่ดีกว่าสำหรับทุกกรณี แต่ใช้งานง่ายที่สุด ดูข้อมูลเพิ่มเติมได้ที่นี่: php.net/manual/en/function.file-get-contents.php
ineedhelp

7

คุณสามารถใช้สิ่งนี้สำหรับ Curl:

function fakeip()  
{  
    return long2ip( mt_rand(0, 65537) * mt_rand(0, 65535) );   
}  

function getdata($url,$args=false) 
{ 
    global $session; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip())); 
    if($args) 
    { 
        curl_setopt($ch, CURLOPT_POST, 1); 
        curl_setopt($ch, CURLOPT_POSTFIELDS,$args); 
    } 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    //curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888"); 
    $result = curl_exec ($ch); 
    curl_close ($ch); 
    return $result; 
} 

หากต้องการอ่าน Json:

$result=getdata("https://example.com");

จากนั้น:

///Deocde Json
$data = json_decode($result,true);
///Count
             $total=count($data);
             $Str='<h1>Total : '.$total.'';
             echo $Str;
//You Can Also Make In Table:
             foreach ($data as $key => $value)
              {
          echo '  <td><font  face="calibri"color="red">'.$value[type].'   </font></td><td><font  face="calibri"color="blue">'.$value[category].'   </font></td><td><font  face="calibri"color="green">'.$value[amount].'   </font></tr><tr>';

           }
           echo "</tr></table>";
           }

คุณยังสามารถใช้สิ่งนี้:

echo '<p>Name : '.$data['result']['name'].'</p>
      <img src="'.$data['result']['pic'].'"><br>';

หวังว่านี่จะช่วยได้


สิ่งนี้ช่วยฉันได้ แต่ฉันต้องแทนที่ $ data ด้วย $ data ['result'] ในปัจจัย foreach ในกรณีการใช้งานของฉัน
Eaweb



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.