2016-11-10 8 views
0

私はかなり単純なコードをここに置いています。データベースにたくさんのリンクを追加してから、各リンクを200 OKにチェックしてください。重複検出コードが機能しない

<?php 
function check_alive($url, $timeout = 10) { 
     $ch = curl_init($url); 
     // Set request options 
     curl_setopt_array($ch, array(
     CURLOPT_FOLLOWLOCATION => true, 
     CURLOPT_NOBODY => true, 
     CURLOPT_TIMEOUT => $timeout, 
     CURLOPT_USERAGENT => "page-check/1.0" 
    )); 
     // Execute request 
     curl_exec($ch); 
     // Check if an error occurred 
     if(curl_errno($ch)) { 
     curl_close($ch); 
     return false; 
     } 
     // Get HTTP response code 
     $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     curl_close($ch); 
     // Page is alive if 200 OK is received 
     return $code === 200; 

} 

if (isset($_GET['cron'])) { 
    // database connection 
    $c = mysqli_connect("localhost", "paydayci_gsa", "", "paydayci_gsa"); 
    //$files = scandir('Links/'); 
    $files = glob("Links/*.{*}", GLOB_BRACE); 
    foreach($files as $file) 
    { 
     $json = file_get_contents($file); 
     $data = json_decode($json, true);  
     if(!is_array($data)) continue; 
     foreach ($data as $platform => $urls) 
     {    
      foreach($urls as $link) 
      { 
       //echo $link; 
       $lnk = parse_url($link); 
       $resUnique = $c->query("SELECT * FROM `links_to_check` WHERE `link_url` like '%".$lnk['host']."%'"); 
       // If no duplicate insert in database 
       if(!$resUnique->num_rows) 
       { 
        $i = $c->query("INSERT INTO `links_to_check` (link_id,link_url,link_platform) VALUES ('','".$link."','".$platform."')"); 

       } 
      } 
     } 
     // at the very end delete the file 
     unlink($file); 
    } 
    // check if the urls are alive 
    $select = $c->query("SELECT * FROM `links_to_check` ORDER BY `link_id` ASC"); 
    while($row = $select->fetch_array()){ 
     $alive = check_alive($row['link_url']); 
     $live = ""; 
     if ($alive == true) 
     { 
      $live = "Y"; 
      $lnk = parse_url($row['link_url']); 
      // Check for duplicate 
      $resUnique = $c->query("SELECT * FROM `links` WHERE `link_url` like '%".$row['link_url']."%'"); 
      echo $resUnique; 
      // If no duplicate insert in database 
      if(!$resUnique->num_rows) 
      { 
       $i = $c->query("INSERT INTO links (link_id,link_url,link_platform,link_active,link_date) VALUES ('','".$row['link_url']."','".$row['link_platform']."','".$live."',NOW())"); 
      }  
     } 
     $c->query("DELETE FROM `links_to_check` WHERE link_id = '".$row['link_id']."'"); 
    } 
} 
?> 

誰でも見ることができる私は私のコードで何かを明らかに見逃している、私は、データベースに重複したURLを追加しないようにしようとしているが、彼らはまだでてきていますか?私はそれを数回見てきました、私は私を見つめて何も見ることができません。

+0

どのデータベースエンジンを使用していますか?私は彼らがすべて一意のキーをサポートしていると思いますが、そうでなければURLを主キーにして、データベースに重複値をチェックさせます。 – bassxzero

+0

通常、文字列比較では大文字と小文字は区別されませんが、オペランドの1つで大文字と小文字が区別される照合を使用するか、バイナリ文字列である場合は大文字と小文字が区別される場合があります。たぶんこれが事実だろうか? –

答えて

2

データベースに一意の値を適用しようとする場合は、その制約を適用するためにデータベース自体に依存する必要があります。その上trim()を使用

ALTER TABLE `links` ADD UNIQUE INDEX `idx_link_url` (`link_url`); 

一つのことをに注意する接頭辞/接尾辞として余分なスペースをされて:あなたはこのように(あなたは構文があるように思われるのMySQLまたは変異体を、使用していると仮定します)インデックスを追加することができますまた、rtrim()を使用してすべての一貫性を維持するために後続のスラッシュを取り除く必要があります(ダストを取得しないように)。

+0

彼のコードを見れば、link_urlは全体として一意ではなく、ホスト部分だけである –

+0

ホスト名の部分一致を行うことによって、彼が 'links_to_check'テーブル内の冗長部分を見つけ出す方法がわかります。 @ colinreedy674を明らかにすることはできますか? –

+0

はい:私はそれを行うにはかなり良い方法だと思っていましたが、何人かの理由でダブがまだ滑っています。 – colinreedy674

関連する問題