0

我遇到了一个我以前从未见过的问题。代码太多太多,类太多,所以请原谅我没有详细说明。有趣的是:

$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)。

到底是什么原因造成的?

4

1 回答 1

2

您的问题可能是您正在使用mysql_last_insert_id获取最后插入行的 id。当您插入多行时,您可能没有获得正确的 ID。

mysql_last_insert_idcall替换为select返回您上次插入的 id 的查询,并查看您的问题是否已解决。

于 2013-03-26T21:24:20.987 回答