Skip to content →

[PHP] cURL傳回空字串和 json_decode()傳回NULL


之前使用OPEN DATA取出資料來用,自從資料更新後就抓不到資料了。
於是展開了一連串的除錯之旅XD

在這邊分享二個我遇到的問題。
一、cURL傳回空字串。
二、json_decode()傳回NULL, Syntax error。

一開始的寫法

$curl= curl_init(); //設定user AGENT curl_setopt($curl,CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"); //規避ssl的證書檢查 curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); //將抓取的網頁元素當成字串傳回來,反之則呈現該網頁的原貌 curl_setopt($curl,CURLOPT_RETURNTRANSFER, true); //取得網址 curl_setopt($curl, CURLOPT_URL, $url); $ro = curl_exec($curl); curl_close($curl); $array=json_decode($ro,true);

一、cURL傳回空字串。

1、json_decode()傳回NULL。

2、先找出錯的地方,下面二種方法都可以得到錯誤訊息。

2-1、
$array=json_decode($ro,true,9);
$json_errors = array(
 JSON_ERROR_NONE => ‘No error has occurred’,
 JSON_ERROR_DEPTH => ‘The maximum stack depth has been exceeded’,
 JSON_ERROR_CTRL_CHAR => ‘Control character error, possibly incorrectly encoded’,
 JSON_ERROR_SYNTAX => ‘Syntax error’,
);

echo ‘Last error : ‘, $json_errors[json_last_error()], PHP_EOL, PHP_EOL;


2-2、
$err = json_last_error();
echo $err.”\n”;
echo json_last_error_msg().”\n”;

2-1、 錯誤訊息
 Last error : No error has occurred
2-2、錯誤訊息
 0 No error

3、既然沒有錯誤,再往上看看資料有沒有帶進來。
var_dump($ro);  // string(0) “”
沒抓到資料!!!

看來是再更上面設定的問題囉~

4、一個一個查看curl_setopt,得到都是 bool(true) 。
拜這篇文章Why does cURL return an empty string?所賜,很快的找到答案。

加個
//抓取轉址
 curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
就解決了。



二、json_decode()傳回NULL, Syntax error。

1、json_decode()傳回NULL。

2、得到錯誤訊息

2-1
 Last error : Syntax error
2-2
 4 Syntax error


3、有抓到資料
var_dump($ro);  // string(1799870)
資料有帶進來

看來可能是資料型態的問題?

在資料裡面出現了多餘的單雙引號、反斜線、逗號等問題。

//stripslashes() 是删除反斜線
單純用 stripslashes ()對我的例子是沒有作用的,
//把HTML 實體轉換為字符,ENT_QUOTES轉換雙引號和單引號
$array = stripslashes(html_entity_decode($ro, ENT_QUOTES));  
 // string(1798089)
終於有值跑出來了,但是json_decode()還是NULL。
表示還有沒抓到的…

跑出來的數值有落差,可能還有些隱藏的字元。

加了
 $ro = substr($ro, 3);
資料全都撈到了,萬歲~

後來又找到更方便的作法

for ($i = 0; $i <= 31; ++$i) {
 $ro = str_replace(chr($i), "", $ro);
}
$ro = str_replace(chr(127), "", $ro);

if (0 === strpos(bin2hex($ro), 'efbbbf')) {
$ro = substr($ro, 3);
}

發生 Syntax error 的情況有很多種,可以試試我的方法;如果沒有效果,可能要再找別的辦法試 了。



另外,也有UTF-8編碼的問題。

測試JSON是哪個編碼,如果不是UTF-8,就要做轉換。

echo mb_detect_encoding($ro, array(“ASCII”,”GB2312″,”GBK”,”UTF-8″,”ISO-8859-1″));

下面兩種方式都可以轉換。

$ro = mb_convert_encoding($ro, ‘UTF-8’, ‘UTF-8’);
$ro=iconv(“GBK”, “UTF-8”, $ro);

Published in PHP

Comments are closed.