我遇到了一个我以前从未见过的问题。代码太多,太大,类太多,所以请原谅我没有详细说明。 有趣的是这个:
$copy = clone $this;
$copy->workerid = $new_workerid;
if ( $copy->mysql_create_row( $this->pending_table ) )
return $copy;
这按预期运行。当我进入数据库时,我在表Pending中看到了一个新条目。
然而,当我连续运行多个查询时:
$copy = clone $this;
$copy->workerid = $new_workerid;
if ( $copy->mysql_create_row( $this->pending_table ) )
if ( $this->mysql_delete_row( $this->pending_table ) )
if ( $this->mysql_create_row( $this->cancelled_table ) )
return $copy;
然后由于某些无法解释的原因,在其中一个表中插入了错误的id列。 在具体的方法中,$ copy-> mysql_create_row除此之外还可以这样做:
if ( $con = db_connect() ) {
$res = mysqli_query( $con, "INSERT INTO $table (`workerid`,`time`,`location`,`tasks`) VALUES ('$this->workerid','$this->datetime','$this->location','$this->tasks');" )
or error_log( "mysql_create_row Error: " . mysqli_error( $con ) );
if ( $res ) {
$this->contactid = mysqli_insert_id( $con );
foreach ( $this->attendees as $att ) {
$att->__setContactId( $this->contactid );
if ( !$att->mysql_create_row( $this->attendee_table ) ) {
error_log( " Contact->mysql_create_row Error: Did not create attendee MySQL row" );
return false;
}
通过对象方法委派$ att-> mysql_create_row($ this-> attendee_table)以相同的方式工作,它只是一个INSERT查询。
现在这就是事情没有意义的地方: 而新插入的$ copy对象在$ copy-> mysql_create_row中插入了正确的id,而$ att-> mysql_create_row则没有! 它插入旧的id。 此外,当我从$ att-> mysql_create_row回显查询时,它会回显正确的(新id)!!!
但是当我进入实际的数据库时,它已经插入了旧的id。这对我来说毫无意义。
我试图创建自定义__clone()方法,尝试确保我有副本而不是引用(该死的你的php)但它仍然会产生相同的错误。
问题似乎是连续查询,因为当我不执行删除或新插入时,我没有任何问题。
删除工作正常,第二次插入也正常,没有任何错误。
什么可能强制MySQLi api插入错误的id,而查询回应正确的? 我只能处理某种形式的背景/多线程腐败,但由于我无法控制这类事情,我甚至不知道如何解决这个问题。
当从$ att-> mysql_create_row回显查询时,我得到:
在查询ID之前:305
'插入
XXXXXXXX
。attendees
(contactid
,title
,forenames
,surname
,relationship
,gender
,age
,arrived
,{ {1}},left
,supervised
) 价值观('305','先生', '亚历克斯', '沃纳', '', 'M', '29/08/1981', '0', '', '', '0');”
在查询ID:305
之后但是当我真正进入数据库时,插入的值是旧的id值(比如说294)。 表列不是自动递增,不是唯一的或主要的,它只是一个int(11)。
究竟是什么造成这种情况?
答案 0 :(得分:2)
您的问题可能是您正在使用mysql_last_insert_id
来获取最后插入的行的ID。在插入多行时,可能无法获得正确的ID。
将mysql_last_insert_id
调用替换为select
查询,该查询返回上次插入的ID,并查看问题是否已解决。