2016-11-10 6 views
0

Ich habe ein ziemlich einfaches Stück Code hier, ich füge nur ein paar Links in der Datenbank, dann überprüfen Sie jeden Link für eine 200 ok.Doppelte Erkennungscode funktioniert nicht

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

Ich versuche, keine doppelten URLs in die Datenbank hinzufügen, aber sie werden immer noch in, habe ich etwas offensichtlich mit meinem Code verpasst hat, kann jemand sehen? Ich habe ein paar Mal darüber geschaut, ich kann nichts sehen, was mich anstarrt.

+0

Welche Datenbank-Engine verwenden Sie? Ich denke, sie alle unterstützen eindeutige Schlüssel, aber wenn sie dies nicht tun, dann machen Sie Ihre URL zu einem Primärschlüssel und lassen Sie die Datenbank nach doppelten Werten suchen. – bassxzero

+0

in der Regel String-Vergleiche sind nicht Groß-und Kleinschreibung, aber in einigen Fällen in mysql "wie", wenn einer der Operanden eine Groß-und Kleinschreibung verwendet, ist eine Groß- und Kleinschreibung beachten. Vielleicht könnte das der Fall sein? –

Antwort

2

Wenn Sie versuchen, eindeutige Werte in einer Datenbank zu erzwingen, sollten Sie sich darauf verlassen, dass die Datenbank selbst diese Einschränkung erzwingt. Sie können einen Index hinzufügen (vorausgesetzt, Sie verwenden MySQL oder eine Variante, die die Syntax zu sein scheint) wie folgt aus:

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

Eine Sache bewusst zu sein wird zusätzliche Leerzeichen als Präfixe/Suffixe verwenden, so trim() auf die Werte und auch, sollten Sie nachfolgende Schrägstriche entfernen, um alles konsistent zu halten (so dass Sie keine Duplikate erhalten) mit rtrim().

+0

sieh dir seinen Code an link_url ist nicht einzigartig als Ganzes, nur der Host Teil –

+0

Es sieht so aus, als ob er nur Duples in seiner 'links_to_check' Tabelle findet, indem er eine Teilübereinstimmung mit dem Hostnamen macht. Kannst du @colinreedy674 klären? –

+0

ja :) ich dachte, das wäre ein ziemlich guter Weg, es zu tun, aber Betrüger sind immer noch aus irgendeinem Grund hereinrutschen. – colinreedy674

Verwandte Themen