【问题标题】:php mysql insert report with unique idphp mysql插入具有唯一ID的报告
【发布时间】:2017-07-01 13:24:29
【问题描述】:

我正在尝试向我的数据库中插入一个具有唯一 ID 的新条目。我的代码中的某个地方是一个错误,但我找不到它。你能帮忙吗?

不能选择自动增量

    $newConversationID = uniqid();

    $checkID = $DBcon->query("SELECT * FROM tbl_conversations WHERE conversation_id=$newConversationID");
    $countID = $checkID->num_rows;


    while($countID) {

        if ($countID==0) {
            $DBcon->query("INSERT INTO tbl_conversations (conversation_id,user_id, date) VALUES('$newConversationID','$fromID',UNIX_TIMESTAMP())");break;
        } else {

            $newConversationID = uniqid();

            $checkID = $DBcon->query("SELECT * FROM tbl_conversations WHERE conversation_id=$newConversationID");
            $countID = $checkID->num_rows;

        }

    }

【问题讨论】:

  • 您已经在使用支持 prepared statements 的 API 和有界变量输入,您应该使用带占位符的参数化查询(prepared statements)来保护您的数据库免受SQL-injection !开始使用 mysqli::prepare()mysqli_stmt::bind_param()
  • @Qirel 在这种情况下,由于数据是在脚本中生成的,因此并没有真正的区别。
  • 虽然这是真的,但要养成一个好习惯。准备任何变量。
  • @Qirel 同意,我不是想开始争论 :)
  • 似乎我们在发表评论之前就达成了一致! ;-)

标签: php mysql unique-id


【解决方案1】:

是的,错误在于where($countId)。假设您没有使用该键找到类似的行,您将在$countId 中得到零,并且零等于 FALSE。所以 where 子句永远不会运行。

因此,如果新的 uniqueid 与该表中的任何现有键都不匹配,则 while 循环将不会运行!

如果新的 uniqueid 确实与现有行匹配,则 while 循环将运行,但只会执行 ELSE 条件,它实际上并没有做任何有用的事情。

我假设您想要循环直到创建一个有效的新 uniqid 然后存储该行。

$qfind = "SELECT COUNT(conversion_id) FROM tbl_conversations WHERE conversion_id = ?";
$search = $mysqli->prepare($qfind);
$qinsert = "INSERT INTO tbl_conversations (conversion_id) VALUES(?)";
$insert = $mysqli->prepare($qinsert);

//loop till we end up with a new unique id
while(true) {
    $id = uniqid();
    $search->bind_param('s', $id);
    $search->execute();
    $result = $search->get_result();
    $row = $result->fetch_array(MYSQLI_NUM);

    if ($row[0] == 0) {
        // we have a new unique index so store the row
        $insert->bind_param('s', $id);
        $insert->execute();

        // we are all done here so break out of the while loop
        break;
    }
}

【讨论】:

  • 这是一个'while'运算符
  • 是的,while 运算符仅在条件为真且零不为真时运行
  • 你能告诉我如何做得更好吗?
  • 你使用的是PDO还是MYSQLI_
  • 我正在使用 MYSQLI
【解决方案2】:

我认为你有一个逻辑错误

让我们假设代码

$countID = $checkID->num_rows;

返回 1

所以条件 if 不会执行

如果

$countID = $checkID->num_rows;

返回 1 while 迭代器不会执行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2023-04-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多