我正在构建一个登录系统,该系统在一个称为用户,会话和登录的mysql数据库(PHP)中使用三个表。所有表都有一个自动增量索引。在成功登录后,用户行通过存储在新登录行中的值链接到会话行。我想知道在这个过程中是否安全使用mysqli_insert_id()
。我担心,如果在会话行INSERT
期间出现错误,登录行将收到不正确的会话索引号,并且用户将登录到错误的会话。是mysqli_insert_id可靠吗?
这会是一个问题吗?如果是这样,是否有一个好办法来处理它?
我正在构建一个登录系统,该系统在一个称为用户,会话和登录的mysql数据库(PHP)中使用三个表。所有表都有一个自动增量索引。在成功登录后,用户行通过存储在新登录行中的值链接到会话行。我想知道在这个过程中是否安全使用mysqli_insert_id()
。我担心,如果在会话行INSERT
期间出现错误,登录行将收到不正确的会话索引号,并且用户将登录到错误的会话。是mysqli_insert_id可靠吗?
这会是一个问题吗?如果是这样,是否有一个好办法来处理它?
这种方法会产生可靠的结果如果会做一个查询:
INSERT
操作成功。INSERT
成功后,在相同的数据库连接。大多数情况下,只要调用INSERT
然后获取插入的ID作为下一个操作即可,只要您使用相同的数据库句柄即可。
一个框架会自动为你做所有这些,所以它通常不是你应该关心的。
如果你想确保数据的完整性&你执行的操作,那么我建议你去“全部或无”的方法。这意味着您的所有查询都将单独传递,否则即使失败,它们也将全部失败。您可以在MySQL中使用TRANSACTION & ROLLBACK功能来实现此功能。欲了解更多信息,您可以访问:http://www.tutorialspoint.com/sql/sql-transactions.htm
您如何看待这样的错误可能会发生?您*可以*检查插入是否有效。 – Popnoodles
如果您担心数据一致性,请使用'TRANSACTION'。 'mysql_insert_id'对每个PHP运行都是安全的。 – Halcyon
如果你担心这个问题,你不应该直接使用'mysqli'。相反,请使用[开发框架](http://codegeekz.com/best-php-frameworks-for-developers/)或[学说](http://www.doctrine-project.org/)等ORM。或[Propel](http://propelorm.org/)为您可靠地处理此问题。 – tadman