2016-11-10 3 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']."'"); 
    } 
} 
?> 

Я стараюсь не добавлять дублированные ссылки в базу данных, но они по-прежнему получать в, я упустил что-то очевидное с моим кодом может кто-нибудь увидеть? я просмотрел его несколько раз, я не вижу ничего, что можно было бы смотреть на меня.

+0

Какой двигатель базы данных вы используете? Я думаю, что все они поддерживают уникальные ключи, но если они этого не делают, сделайте свой URL-адрес первичным ключом и дайте базе данных проверить повторяющиеся значения. – bassxzero

+0

Обычно сравнения строк не чувствительны к регистру, но в некоторых случаях в mysql 'like', если один из операндов использует зависящую от регистра сортировку или представляет собой двоичную строку, это может быть чувствительным к регистру. Может быть, это может быть так? –

ответ

2

Если вы пытаетесь применять уникальные значения в базе данных, вы должны полагаться на базу данных, чтобы обеспечить соблюдение этого ограничения. Вы можете добавить индекс (если вы используете MySQL или вариант, который появляется синтаксис будет), как это:

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

Одна вещь, чтобы быть в курсе, лишние пробелы в качестве префиксов/суффиксов, так что используйте trim() на а также, вы должны отделять трейлинг-косые черты, чтобы все было согласовано (чтобы вы не обманывались), используя rtrim().

+0

Посмотрите на свой код link_url, который не является уникальным в целом, только часть хоста –

+0

Похоже, это только то, как он находит обманы в своей таблице «links_to_check», выполняя частичное совпадение имени хоста. Вы можете уточнить @ colinreedy674? –

+0

да :) Я думал, что это будет очень хороший способ сделать это, но по какой-то причине все еще сползают. – colinreedy674

Смежные вопросы