创建随机字符串,检查数据库,如果发现再次运行 - 代码无法按预期运行?

时间:2011-08-01 23:02:27

标签: php mysql

这有点是this post

的延续

我已经采用了以下代码,并根据我的需要进行了一些调整;

function makeString() {

    // Create our random string
    $string = "";
    $characters = array('a', 'b', 'c', 'd');

    for ($i = 0; $i < 4; $i++) {

        $string .= $characters[mt_rand(0, 4)];
    }

    $query = "SELECT COUNT(*)
    FROM myTable
    WHERE string = '{$string}'";

    $result = mysql_query($query);
    $row = mysql_fetch_assoc($result);

    if ($row['COUNT(*)'] > 0) { // if it already exists, do it again

        $string = makeString();
    }

    return $string;
}

我的版本:

function valCode() {

$num1 = mt_rand(1, 6);
$valcode = $num1;

include("dbdata.php");
$conn = mysql_connect($db_host, $db_uname, $db_pword) or die("Couldn't connect because ".mysql_error());
mysql_select_db($db_name);
$query = "SELECT COUNT(*) FROM records WHERE valcode='{$valcode}'";
$result = mysql_query($query) or die("Query failed because ".mysql_error());

$row = mysql_fetch_assoc($result);

if($row['COUNT(*)'] > 0) {
    $valcode = valCode();
}

$query2 = "INSERT INTO records (valcode) VALUES ($valcode)";
$result2 = mysql_query($query2) or die("Query failed because ".mysql_error());

return $valcode;
}

valCode();

不是创建随机字符串(示例中为int),而是根据数据库进行检查,然后再次运行它,这会运行脚本两次,将重复值插入到我的表中。

我想也许这可能是因为使用主键允许将两个相同的值放在不同的主键下,因此将它们称为独特的,但实际上我真的不知道。

非常感谢任何帮助或评论!

1 个答案:

答案 0 :(得分:1)

它正在执行您的代码所要做的事情。每次调用valCode()都会执行一个INSERT查询,因为这是函数的一部分。

代码的示例运行:

  • 您致电valCode()开始寻找新代码
  • valCode()生成代码并发现它已存在,因此再次调用valCode()
  • valCode()生成代码并发现它已存在,因此再次调用valCode()
  • valCode()生成一个唯一代码INSERT进入数据库,然后返回其调用者(函数的第二次调用)
  • 第二次调用valCode现在INSERT代码并返回其调用者(函数的第一次调用)
  • 第一次调用valCode现在INSERT代码并返回其调用方(代码末尾)

您需要将INSERT移到函数外部并在查询中使用其返回值。