重复的检测代码不起作用

时间:2016-11-10 20:44:03

标签: php

我这里有一段相当简单的代码,我只是在数据库中添加了一堆链接,然后检查每个链接是否正常。

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

我试图不向数据库添加重复的网址,但他们仍然进入,我错过了我的代码可以让任何人看到的明显的东西吗?我已经看过几次,我看不到任何盯着我的东西。

1 个答案:

答案 0 :(得分:2)

如果您尝试在数据库中强制使用唯一值,则应依靠数据库本身来强制执行该约束。您可以添加索引(假设您使用的是MySQL或变体,语法似乎是这样):

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

要注意的一件事是额外的空格作为前缀/后缀,所以在值上使用trim(),并且你应该使用{{去掉尾随斜杠以保持一致(所以你不会得到欺骗) 1}}。