如何使用php避免mysql中的重复条目

如何使用php避免mysql中的重复条目,php,mysqli,do-while,Php,Mysqli,Do While,这里我做了一个生成随机键的函数 function gen_link(){ $link = ''; $s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; for ($i= 0 ; $i <= 4 ; $i++) $link = $link.$s[rand(0,63)]; return $link; } 但它似乎根本不起作用,它一直在循环。

这里我做了一个生成随机键的函数

function gen_link(){
$link = '';                             
$s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for ($i= 0 ; $i <= 4 ; $i++)
$link = $link.$s[rand(0,63)]; 
return $link;   
}

但它似乎根本不起作用,它一直在循环。我能做什么?

使用如下查询,而不是生成实际错误:

$sql = "insert ignore into `links` (`link`) values ('$link')";
$con = mysqli_connect("localhost", "shashi", "asd123", "redir");

do {
    $link = gen_link();
    $sql = "insert ignore into `links` (`link`) values ('$link')";
    $result = mysqli_query($con, $sql);
} while (mysqli_affected_rows($con) == 0);

mysqli_close($con);
并检查以确保实际插入了某些内容:

while (mysqli_affected_rows($con) == 0);
总之,看起来是这样的:

$sql = "insert ignore into `links` (`link`) values ('$link')";
$con = mysqli_connect("localhost", "shashi", "asd123", "redir");

do {
    $link = gen_link();
    $sql = "insert ignore into `links` (`link`) values ('$link')";
    $result = mysqli_query($con, $sql);
} while (mysqli_affected_rows($con) == 0);

mysqli_close($con);
另外,关于您的查询,请注意以下几点:

  • 我将表名和列名周围的引号改为反勾号,这是在sql中引用它们的正确方法

  • 因为您直接在查询中包含
    $link
    变量,所以在给
    $link
    变量一个值之后,您需要定义查询,因此我将该行移到了循环中。这可能是您一直循环的原始问题的根源

  • 在本例中,这并不重要,因为您可以完全控制要插入的值(在
    gen_link()
    中生成),但最好养成正确转义插入到查询中的变量的习惯。或者,读一读,用它们代替


  • 从DB as数组中获取现有键值。然后使用
    in_array()
    函数使用现有密钥搜索当前密钥。如果为真,则生成新密钥。如果条件为false,请插入新密钥


    我正在使用准备好的语句“ON DUPLICATE KEY”,用MYSQL更改重复值:

    $sql = "INSERT INTO ".$this->table." ".
            "(".implode(',',$fields).") VALUES
            (".implode(',',$values).")
            ON DUPLICATE KEY 
            UPDATE key_field = concat(substr(key_field,1,".($laenge_key-3)."),FORMAT(FLOOR(RAND()*999),0))