如何避免使用php在mysql中重复输入

时间:2013-06-22 05:17:53

标签: php mysqli do-while

这里我已经创建了一个生成随机密钥的函数,

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

我不想重复mysql表中的密钥,我在mysql中使它独一无二,但我想要做的是,当密钥已经存在时我想重新生成另一个随机密钥并尝试再次将其添加到表中,我在下面尝试了这段代码。

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

do{
 $link = gen_link();
$result = mysqli_query($con,$sql);

}while(mysqli_errno($con)==1064);

 mysqli_close($con);

但它似乎根本不工作,它不断循环。我该怎么办?

3 个答案:

答案 0 :(得分:2)

使用INSERT IGNORE查询,而不是生成实际错误:

$sql = "insert ignore into `links` (`link`) values ('$link')";

并检查mysqli_affected_rows()以确保实际插入了某些内容:

while (mysqli_affected_rows($con) == 0);

总之,看起来像这样:

$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);

此外,还有一些关于您的疑问的说明:

  1. 我将表和列名称的引号更改为反引号,这是在sql中引用它们的正确方法。

  2. 由于您在查询中直接包含$link变量,因此您需要在之后定义查询,为$link变量赋值 - 所以我在循环中移动了那一行。这可能是您保持循环的原始问题的根源。

  3. 在这种情况下并不重要,因为你可以完全控制你要插入的值(在gen_link()中生成),但是养成正确转义变量的习惯是个好主意插入查询。或者,在prepared statements上读一下,然后使用它们。

答案 1 :(得分:0)

将数据库中的现有键值作为数组获取。然后使用in_array()功能使用现有密钥搜索当前密钥。如果是真的生成新密钥。如果条件为false,请插入新密钥。

http://php.net/manual/en/function.in-array.php

if(in_array($new_key,$existing))
{
//generate new key
}
else
{
//insert current key
}

答案 2 :(得分:0)

我使用“ON DUPLICATE KEY”使用Prepared Statement,使用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))