当两个用户同时创建帖子时,避免混淆ID?

时间:2011-03-05 21:06:04

标签: php mysql

我正在一个用户可以创建帖子并为该帖子上传几张图片的网站上工作。当用户创建帖子时,我需要获取即将创建的帖子的ID,以便为上传的图像创建文件夹(具有相应的名称)。表“posts”在“id”上有自动增量。我尝试过使用下面粘贴的逻辑,但我觉得这不是可行的方法。

editData("LOCK TABLES posts READ");
$highest = getRow("SELECT MAX(id)+1 AS id FROM posts");
$_SESSION["id"] = $highest["id"];
editData("UNLOCK TABLES");

然后我使用$_SESSION["id"]的值来创建图像的文件夹,但它似乎并不完全万无一失。

我想要实现的目的主要是管理两个用户同时开始创建帖子的情况。在这种情况下,我需要确保用户A上传的图像不会与用户B上传的图像混淆。有任何建议吗?

5 个答案:

答案 0 :(得分:0)

我认为你不应该这样做。一个更好的选择(在几个中)可能是

  • 制作新帖子。在一切都完成之前,它是不可见的
  • 获取最后插入的ID。 MySQL有一个功能,它会从你的会话中检索最后一个ID,所以其他用户不会弄乱你的号码
  • 添加图片。

如果您担心线程安全,请阅读MySQL手册中的以下引用“

  

“生成的最后一个ID是   维护在服务器上   每个连接基础。这意味着   函数的值返回给定的值   客户是最新的   由此生成的AUTO_INCREMENT值   客户。价值不会受到影响   其他客户,即使他们   生成AUTO_INCREMENT值   他们自己的。这种行为可以确保   你可以不用检索你自己的ID   关心他人的活动   客户,而不需要   锁或交易。“

我们正在讨论基于“最后”的连接,因此这意味着您不会受到其他插入的影响。另请参阅http://php.net/manual/en/function.mysql-insert-id.php

答案 1 :(得分:0)

我会创建一个临时目录来上传文件。您可以使用PHP rand()作为目录名称的一部分来确保唯一性,然后获取新ID,然后在上载过程中重命名该目录。

答案 2 :(得分:0)

在处理表单的文件中,您应该插入图片,然后获取它们的ID并创建目录。

答案 3 :(得分:0)

以下是我将如何处理它:

//create the table (with a boolean value to keep it hidden until everything is done)
$r = mysql_query("INSERT INTO foo VALUES(x, y, z, false)");
//retrieve the auto_increment id
$post = mysql_fetch_array(mysql_query("SELECT id FROM foo WHERE x=x y=y z=z..."), MYSQL_ASSOC);
//create your dir with the id and your image uploads
do_stuff();
//flip the boolean field
mysql_query("UPDATE foo SET show=true WHERE id=$id");

答案 4 :(得分:0)

只需返回mysql_insert_id ...