Php 如果字符串已经存在,请在其后面添加数字

Php 如果字符串已经存在,请在其后面添加数字,php,mysql,Php,Mysql,我正在编写一个脚本,检查数据库中是否已经存在url,如果是,则在最后添加一个额外的-1或-2等。我找到了剧本 但它需要在添加-1后再次检查它。因为它可能已经存在。我该怎么做?我这样累了 $query = mysql_query("SELECT * FROM posts WHERE url='$url'"); while ( $query ) { $result = mysql_fetch_assoc($query);

我正在编写一个脚本,检查数据库中是否已经存在url,如果是,则在最后添加一个额外的-1或-2等。我找到了剧本

但它需要在添加-1后再次检查它。因为它可能已经存在。我该怎么做?我这样累了

        $query = mysql_query("SELECT * FROM posts WHERE url='$url'");   

        while ( $query ) {      

            $result = mysql_fetch_assoc($query);
            $url = $result['url'];
            $urlnew = $result['url'];   
            $oldurl = $url;             
            $first = 1;
            $separator = '-';

            while ( $urlnew == $url ) {

                $url = preg_match('/(.+)'.$separator.'([0-9]+)$/', $urlnew, $match);        

                $urlnew = isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $url.$separator.$first;

                $first++;

            }
        $url = $urlnew;
        }
上面的新代码工作得很好。但它只检查一次。我怎样才能让它检查,直到它不存在于数据库中

尝试在$url-$urlnew之后的底部添加新的sql查询,但这只会中断函数

编辑

下面是正确的脚本:D

$query = mysql_query("SELECT * FROM posts WHERE url LIKE '%".$url."%'");    

if ( $query ) {

    while ( $result = mysql_fetch_assoc($query) ) {     

        $url = $result['url'];
        $urlnew = $result['url'];           
        $first = 1;
        $separator = '-';


        while ( $urlnew == $url ) {

            preg_match('/(.+)'.$separator.'([0-9]+)$/', $urlnew, $match);       

            $urlnew = isset($match[2]) ? $match[1].$separator.($match[2] + 1) :$url.$separator.$first;

            $first++;   

        }

    }
}                       

$url = $urlnew;

您的代码可能容易受到攻击。你应该考虑使用或替代。

下面是一个示例,说明如何做到这一点:

$url = 'www.example.com';
$i = 0;
$max_duplicates = 100;

$query = $pdo->prepare('SELECT COUNT(id) count FROM urls WHERE url=?');
while ($i++ < $max_duplicates) {
  $result = $query->execute($url);

  if (!$result->fetch(PDO::FETCH_OBJ)->count)
    break;

  if ($i == 1) {
    $url = $url . '-1';
  } else {
    $n = $i > 10 ? 2 : 1;
    $url = substr($url, -$n) . $i;
  }
}
$url='www.example.com';
$i=0;
$max_duplicates=100;
$query=$pdo->prepare('从url=?'的url中选择COUNT(id)COUNT);
而($i++<$max\u个副本){
$result=$query->execute($url);
if(!$result->fetch(PDO::fetch_OBJ)->计数)
打破
如果($i==1){
$url=$url'-1';
}否则{
$n=$i>10?2:1;
$url=substr($url,-$n)。$i;
}
}

以下是我用来满足需要的东西

function checkLink($link, $counter=1){
    global $connect;
    $newLink = $link;
    do{
        $checkLink = mysqli_query($connect, "SELECT id FROM table WHERE link = '$newLink'");
        if(mysqli_num_rows($checkLink) > 0){
            $newLink = $link.'-'.$counter;
            $counter++;
        } else {
            break;
        }
    } while(1);

    return $newLink;
}

$link = 'www.example.com';
$uniquelink = checkLink($link);

这是一个进步。我删除了我的否决票。
mysql\u fetch\u assoc
只返回一行。您的查询有可能返回多行吗?
$this->increment\u string
工作正常吗?@Rocket Hazmat it dose。但它只检查一个url。并且不确定如何在将数字添加到后面后使其多次检查。@和0R1995,在循环之前定义
$first
,然后在循环的最后一行之后定义
$first=$first+1我如何配置它来处理mysql_uu查询和函数?不确定如何使用$pdomysql_uuz已被弃用,并将在PHP5.5(目前处于RC发行阶段)中删除。查看有关如何使用pdo或mysqli的附加链接。当使用程序形式时,MySQLi几乎是替代品。我明白了,谢谢你的消息。我不知道它会掉下来。