Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止尝试创建同一用户两次?_Php_Mysql_Ios - Fatal编程技术网

Php 如何防止尝试创建同一用户两次?

Php 如何防止尝试创建同一用户两次?,php,mysql,ios,Php,Mysql,Ios,情况是这样的: iPhone应用程序通过Appache、PHP和MySQL连接到Web服务器 iPhone应用程序的连接超时时间为5秒(异步NSURLConnection)。如果服务器的响应在超时后出现,应用程序将不知道,并尝试再次发送数据 在服务器上,php脚本运行两次。第一组数据到达时一次。它会在数据库中创建一个新用户,但在它应该响应应用程序超时时。应用程序第二次尝试创建用户时,会收到一个错误,因为用户名应该是唯一的。这是因为php脚本第一次将用户插入数据库 在这种情况下,用户是在服务器上

情况是这样的:

  • iPhone应用程序通过Appache、PHP和MySQL连接到Web服务器

  • iPhone应用程序的连接超时时间为5秒(异步NSURLConnection)。如果服务器的响应在超时后出现,应用程序将不知道,并尝试再次发送数据

  • 在服务器上,php脚本运行两次。第一组数据到达时一次。它会在数据库中创建一个新用户,但在它应该响应应用程序超时时。应用程序第二次尝试创建用户时,会收到一个错误,因为用户名应该是唯一的。这是因为php脚本第一次将用户插入数据库

  • 在这种情况下,用户是在服务器上创建的,但用户不知道这一点,因为他收到了一个关于已创建用户的错误

有几件事:
-超时时间可以增加,但这无关紧要。服务器在加载时可能需要更多的时间来创建用户。
-我可以测试用户是否可以登录,而不是尝试创建,我只是正常登录他。这里的问题是,如果两个用户试图创建具有相同用户名和密码的用户,会发生什么情况,因为在这种情况下,第二个用户将自动登录。在这种情况下,我确实可以添加一个检查来查看用户是否是在最后一分钟创建的,如果是,只需登录即可。(问题是,如果脚本的执行时间超过1分钟,那么服务器应该先崩溃,创建用户脚本的执行时间为0.001秒,在加载时需要3-4秒)


如果另一个php脚本使用相同的数据执行,是否有任何方法可以阻止它执行?或者这个问题还有其他解决方案吗?

我不确定php路由,但iPhone端的一个解决方案是在客户端的http请求中包含UIDevice的
标识符中的特定于供应商的设备标识符。对于供应商:
,通过这种方式,您可以确定创建请求是否来自同一设备(同一iPhone用户)或其他人。如果此唯一id不匹配,您可以发送“抱歉,此用户名已被占用”消息


不过,作为补充说明,如果用户创建了一个具有相同用户名和密码的用户,那么通常可以假设该用户是尝试登录多个设备(例如iPhone和iPad)的同一用户。这可能是您希望支持的一个用例。两个用户独立尝试创建同一个用户/密码帐户的可能性非常小。与普通情况相比,这种情况不太可能是有人随机猜测用户名/密码组合并通过该路径访问。如果您使用的是用户名/密码系统em基本假设是,这代表了一个可接受的风险水平。降低此风险的一些策略是使用密码复杂性规则,强制用户名为有效和已确认的电子邮件地址,在极端情况下使用两个因素(或更多)身份验证。

所有iphone中都有一个设备ID,并且它们都是唯一的,请使用您的语言验证一旦用户尝试使用其iphone注册,您将如何获得该ID。因此,使用该设备ID,他们不能注册多个。

第一选择可能是假设他们是同一用户(或者应该选择更好的密码)并让它们进入,正如@Aaron所说

其他两种可能性,取决于重复用户的重要性: 1) 使用电子邮件地址,让他们验证他们的用户创建操作。如果您收到重复的注册请求,您可以在相同的屏幕上显示“查看您的电子邮件,单击此处重新发送”屏幕


2) 使用数据库事务确保同一时间只有一个连接可以登录/注册。糟糕的可扩展性。

为什么不在请求发出时禁用用户交互,以防止用户在前一个/第一个响应返回之前重复点击“注册”按钮。如果响应失败或完成,则重新启动用户交互。这不是问题所在。接口已锁定,但如果第一次不起作用,则会将请求重新发送到服务器。在任何情况下,我都通过创建一个随机字符串来解决问题,该字符串与注册一起发送。它有4个字符长,我很同意两个不同的用户会尝试使用相同的用户名和密码创建相同的帐户,并且设备会生成完全相同的字符串。在下一次更新中,我将在最后一分钟的验证中添加一个did注册,这样就不再是问题了。Thx,不知道identifierForVendor,在任何情况下,我通过创建一个随机字符串来解决,该字符串与注册一起发送。它有4个字符长,我很同意两个不同的用户会尝试使用相同的用户名和密码创建相同的帐户,并且设备会生成完全相同的字符串。我将在下一次更新的最后一分钟验证中添加did注册,这样就不再是问题了。