2014-03-31 57 views
1

我正在构建一个登录系统,该系统在一个称为用户,会话和登录的mysql数据库(PHP)中使用三个表。所有表都有一个自动增量索引。在成功登录后,用户行通过存储在新登录行中的值链接到会话行。我想知道在这个过程中是否安全使用mysqli_insert_id()。我担心,如果在会话行INSERT期间出现错误,登录行将收到不正确的会话索引号,并且用户将登录到错误的会话。是mysqli_insert_id可靠吗?

这会是一个问题吗?如果是这样,是否有一个好办法来处理它?

+0

您如何看待这样的错误可能会发生?您*可以*检查插入是否有效。 – Popnoodles

+2

如果您担心数据一致性,请使用'TRANSACTION'。 'mysql_insert_id'对每个PHP运行都是安全的。 – Halcyon

+0

如果你担心这个问题,你不应该直接使用'mysqli'。相反,请使用[开发框架](http://codegeekz.com/best-php-frameworks-for-developers/)或[学说](http://www.doctrine-project.org/)等ORM。或[Propel](http://propelorm.org/)为您可靠地处理此问题。 – tadman

回答

0

它的更好,如果你使用触发

触发,当你触发另一

see this tutorial

+0

创建一个触发器是一个好主意返回刚刚创建的行?或者在用户登录时创建几个完全更新数据库的触发器? – Hoytman

+0

触发器对于像这样简单的事情来说是一种**巨大的**痛苦,并且不能解决检索插入的最后一行的ID的问题。 – tadman

+0

是的,你可以创建几个触发器来更新多个表,因此当用户登录时只需插入日志表中,触发器将为你完成剩下的工作 –

2

这种方法会产生可靠的结果如果会做一个查询:

  • 最后INSERT操作成功。
  • 结果被检查立即INSERT成功后,在相同的数据库连接。

大多数情况下,只要调用INSERT然后获取插入的ID作为下一个操作即可,只要您使用相同的数据库句柄即可。

一个框架会自动为你做所有这些,所以它通常不是你应该关心的。

0

如果你想确保数据的完整性&你执行的操作,那么我建议你去“全部或无”的方法。这意味着您的所有查询都将单独传递,否则即使失败,它们也将全部失败。您可以在MySQL中使用TRANSACTION & ROLLBACK功能来实现此功能。欲了解更多信息,您可以访问:http://www.tutorialspoint.com/sql/sql-transactions.htm