2016-09-17 12 views
0

何らかの理由で、関数で呼び出されているURLに画像がない場合、次のエラーが発生します。PHP CURL致命的なエラー:nullのメンバー関数getAttribute()を呼び出す

Fatal error: Call to a member function getAttribute() on null in .... on line 29 

これは何のタイトルは自分でない場合は何のメタタグがない場合、それは発生しませんし、何の段落タグが彼らではない場合、それは発生しません発生しません。 imgタグがない場合にのみ起こるようです。画像がないときにエラーが出なくなるように、どうすればこの作業を行うことができますか?

<? 
function file_get_contents_curl($url) 
{ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $data = curl_exec($ch); 

    curl_close($ch); 

    return $data; 
} 

function getit($site) { 

    $parsing = file_get_contents_curl($site); 
    //parsing begins here: 
    $doc = new DOMDocument(); 
    @$doc->loadHTML($parsing); 

    $nodes = $doc->getElementsByTagName('title'); 
    $node = $doc->getElementsByTagName('img'); 
    $para = $doc->getElementsByTagName('p'); 
    //get and display what you need: 

    $title = $nodes->item(0)->nodeValue; 
    $firstimage = $node->item(0)->getAttribute('src'); 
    $firstparagraph = $para->item(0)->nodeValue; 

    $metas = $doc->getElementsByTagName('meta'); 

    for ($i = 0; $i < $metas->length; $i++) 
    { 
     $meta = $metas->item($i); 
     if($meta->getAttribute('property') == 'og:description') { 
      $description = $meta->getAttribute('content'); } 
     elseif ($meta->getAttribute('name') == 'description') { 
      $description = $meta->getAttribute('content'); } 
     else { $descrition = "<p>".implode(' ', array_slice(explode(' ', $firstparagraph), 0, 25))."</p>"; } 
     if($meta->getAttribute('property') == 'og:image') { 
      $image = $meta->getAttribute('content'); 
     } 
    } 

    if ($image != '') { $image = $image; } else { $image = $firstimage; } 

    $str .= 'Title: '.$title.' <br/><br/>'; 
    $str .= 'Description: '.$description.' <br/><br/>'; 
    $str .= 'Image: <img src="'.$image.'"><br/><br/>'; 
    echo $str; 
} 
?> 
+0

を、そして神は、短いタグの使用を停止し、他に何を知っています! – hanshenrik

+0

あなたは@hanshenrikの意味を理解していません。上に掲載されたコードのいずれも短いタグを使用していません。あなたは特にの使用を参照していますか、それとももっと何かを見ていますか? – Bruce

+0

はい、それらはのことを意味します。彼らはさまざまな理由で悪いです。たとえば、短いタグが無効になっているサーバーでは動作しません。無効になっている新しいサーバーに移動し、ハードコードされたパスワードを持っている場合は、ソースコードとハードコードされたパスワードを見ることができます。パーサを使用してXMLファイルを実行するとエラーが発生しやすくなります – hanshenrik

答えて

1

使用します。attrib取得する前に、このチェック:ポータビリティ、セキュリティのために

 
    if($node->item(0)->hasAttribute('src')) { 
     $firstimage = $node->item(0)->getAttribute('src'); 
    } else { 
     $firstimage = ""; 
    } 

関連する問題