在表单提交中停止重复的url


stopping duplicate urls in a form submission

我有一个社区站点,人们可以在这里发布页面,url从他们的名字生成。我的事就是我的事。我想创建一种方法,如果有另一个My Business,它会检查并使url为My - Business -2, My - Business -3等。

function check_url($url) {
  $qry = mysqli_query($this->con, "SELECT * FROM businesses WHERE url LIKE '$url%'");
  if(mysqli_num_rows($qry)>0) {
        $slugs = array();
        while($row = mysqli_fetch_array($qry)) $slugs[] = $row['url'];
        if(in_array($url, $slugs)) {
              $max = 1;
              while(in_array(($url . '-' . ++$max ), $slugs)) $url .= '-' . $max;
        }
  }
  return $url;
}

这是我的函数,但这仍然不起作用,就像有一个业务叫做my Bus,它将使它成为my- Bus -2,而它在my- Bus中是唯一的。我也用其他函数做过实验,但这个是最接近的。谁能告诉我一个完美的方法?

所以从我的理解,你试图避免插入/生成重复的URL。输出将像这样-

www.example.com/my-business
www.example.com/my-business-1
www.example.com/my-business-2
www.example.com/my-business-3
...

尝试使用这个函数-

function check_url($base_url, $new_url='', $num=0) {
  if($new_url == '') {
    $new_url = $base_url;
  }
  $qry = mysqli_query($this->con, "SELECT * FROM businesses WHERE url = '$new_url'");
  if(mysqli_num_rows($qry) > 0) {
    while($row = mysqli_fetch_array($qry)) {
      $num++;
      check_url($base_url, $base_url . '-' . $num, $num);
    }    
  }
  return $url;
}
基本上,这个函数将检查数据库,直到找到一个有效的URL。每次它都会增加数字并递归调用相同的函数来生成新的/有效的URL。

简单和基本!

@SpritsDracula有工作代码,但是他的函数每次执行时都会查询数据库。也就是说,递归是一个很好的概念。下面是一段代码,它将节省您的多个数据库调用。

function check_url($url) {
    $qry = mysqli_query($this->con, "SELECT * FROM businesses WHERE url LIKE '$url%'");
    if(mysqli_num_rows($qry)>0) {
        $baseUrl = $url;
        $slugs = [];
        while($row = mysqli_fetch_array($qry)) $slugs[] = $row['url'];
        $max = 1;
        while(in_array($url, $slugs)) {
            $url = $baseUrl . "-" . $max++;
        }
    }   
    return $url;
}