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

Php 避免两个用户同时创建帖子时ID混淆?,php,mysql,Php,Mysql,我在一个网站上工作,用户可以创建一个帖子,并上传该帖子的几张图片。当用户创建帖子时,我需要获取即将创建的帖子的ID,以便为上传的图像创建具有相应名称的文件夹。表posts在id上有自动递增功能。我尝试过使用下面粘贴的逻辑,但我觉得这不是正确的方法 editData("LOCK TABLES posts READ"); $highest = getRow("SELECT MAX(id)+1 AS id FROM posts"); $_SESSION["id"] = $highest["id"];

我在一个网站上工作,用户可以创建一个帖子,并上传该帖子的几张图片。当用户创建帖子时,我需要获取即将创建的帖子的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上传的图像混淆。对此有何建议?

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

做一个新的职位。有必要让它隐形,直到一切都完成 获取最后一个插入的id。MySQL有一个函数用于此,它将从您的会话中检索最后一个id,这样其他用户就不会弄乱您的号码 添加图像。 如果您担心这个的线程安全性,请阅读MySQL手册中的以下引用

生成的最后一个ID为 在服务器上的 每个连接的基础。这意味着 函数返回给给定值的值 客户是最新的 自动增加由该 客户该值不受影响 其他客户,即使他们 生成的自动增量值 他们自己的。这种行为确保 您可以检索自己的ID,而无需 关注其他组织的活动 客户,而且不需要 锁或事务


我们讨论的是基于连接的last,这意味着您不会受到其他插入的影响。另外,请参见

我将创建一个临时目录以将文件上载到。您可以使用PHP作为目录名的一部分,以确保唯一性,然后获取新ID,然后作为上载过程的一部分重命名目录。

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

以下是我的做法:

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

只需返回mysql\u insert\u id…

注意>是引号的标记。对于代码,您只需要在行的开头多加四个空格。我明白您的意思,但最后插入的id可能至少在理论上是用户B刚刚创建的id,而不是用户A的id,如果您明白我的意思的话。是的,但您不必担心,由于您是请求此连接的最后一个插入id,因此这可能是一种方式,但在我的情况下,有点复杂,因为文件上载是在创建实际帖子之前(即:提交表单之前)通过ajax进行的。因此,在进行实际上传之前,我必须调用某种保存方法。但是谢谢,我认为这是一种方式:-如果你必须先上传,那么只需创建一个临时目录,该目录的名称来自一个帖子详细信息或创建它的人的用户名的散列,$dir\u name=shapost\u title;然后把所有的东西都搬走