2

在这里,我制作了一个生成随机密钥的函数,

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

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

4

3 回答 3

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()),但是养成正确转义插入到查询中的变量的习惯是个好主意。或者,阅读一些准备好的语句,然后使用它们。

于 2013-06-22T05:28:32.787 回答
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
}
于 2013-06-22T05:30:58.127 回答
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))
于 2013-06-22T05:34:46.197 回答