首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复检测代码不起作用

问重复检测代码不起作用
EN

Stack Overflow用户
提问于 2016-11-11 04:44:03
回答 1查看 31关注 0票数 0

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

代码语言:javascript
复制
<?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']."'");
    }
} 
?>

我尽量不将重复的urls添加到数据库中,但它们仍然存在,我的代码中是否遗漏了一些明显的东西,任何人都能看到?我已经看过几次了,我看不到任何东西在盯着我看。

EN

回答 1

Stack Overflow用户

发布于 2016-11-11 05:00:38

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

代码语言:javascript
复制
ALTER TABLE `links` ADD UNIQUE INDEX `idx_link_url` (`link_url`);

要知道的一件事是额外的空格作为前缀/后缀,所以在值上使用trim(),而且,您应该去掉尾部斜杠以使用rtrim()保持所有内容的一致性(这样您就不会被愚弄)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40536667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档