我遇到了一个我以前从未见过的问题。代码太多太多,类太多,所以请原谅我没有详细说明。有趣的是:
$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,而查询回显正确的 id?我只能处理某种形式的后台/多线程损坏,但由于我无法控制这类事情,我什至不知道如何解决这个问题。
从 $att->mysql_create_row 回显查询时,我得到:
查询前 id: 305
'插入到
XXXXXXXX
.attendees
(contactid
,title
,forenames
,surname
,relationship
,gender
,age
,arrived
,left
,supervised
,ics_number
) 值 ('305','Mr', 'Alex','Werner','','M','29/08/1981','0',' ','','0');'
查询后 id: 305
但是当我真正进入数据库时,插入的值是旧的 id 值(比如 294)。表列不是自动递增的,不是唯一的或主要的,它只是一个 int(11)。
到底是什么原因造成的?