PHP,控件在生成时重复名称

  • 本文关键字:控件 PHP php duplicates
  • 更新时间 :
  • 英文 :


我是PHP的新手。 我只想生成随机名称(或您想要的名称... 它确实有效! 但是当我在代码中间放入一个"do/while"来控制和避免重复的名称时,它不起作用......为什么?我的代码有什么问题?我筋疲力尽,被摧毁了。

<?php
require_once 'config.php';
require_once 'dbconn.php';
function getnome() {
$nome = ['tin', 'pin', 'nid', 'din', 'vin'];
return $nome[mt_rand(0, count($nome) - 1)];
}
for ($f =0; $f<6; $f++) {
$arr = [];
do {
$x = getnome();
}
while (in_array($x, $arr));
$arr[]=$x;
$query = "INSERT INTO ants (ant_id, nome) VALUES (NULL, '".getnome()."')";
$res = $mysqli->query($query);
if (!$res) {
echo('<br>Error' . $mysqli->error);
} else {
echo $mysqli->affected_rows . ' created';
}
}
?>

在此处输入图像描述

从数组中获取唯一值的一种更简单的方法是随机化数组,然后按顺序处理它。

$stmt = $mysqli->prepare("INSERT INTO ants (nome) VALUES (?)");
$stmt->bind_param("s", $a_nome);
$nome = ['tin', 'pin', 'nid', 'din', 'vin'];
shuffle($nome);
foreach ($nome as $a_nome) {
$stmt->execute();
}

有两个主要问题:

  1. 您在 for 循环的每次迭代中重新初始化$arr,因此它实际上并没有跟踪您已经插入的随机值。您需要在 for 循环之前初始化它。

  2. 没有使用您刚刚在插入语句中的 do... while 循环中获得的$x的非重复值。您再次调用getnome函数,这将为您提供另一个(可能是重复的(值。您需要改用$x


$arr = [];                      // initialize $arr here instead
for ($f = 0; $f < 6; $f++) {
do {
$x = getnome();
}
while (in_array($x, $arr));
$arr[] = $x;
// use $x instead of getnome()    
$query = "INSERT INTO ants (ant_id, nome) VALUES (NULL, '" . $x . "')";
$res = $mysqli->query($query);
if (!$res) {
echo('<br>Error' . $mysqli->error);
} else {
echo $mysqli->affected_rows . ' created';
}
}

修复其他两件事后,您将遇到的另一个问题是,您尝试插入六个唯一值,但您的getnome函数只能生成五个,因此看起来...而循环在最后一次尝试时将变得无限。(这可能只是您在创建示例时在翻译中丢失的东西,但这是 while 或 do 的一种可能性......而您需要注意的循环。

最新更新