在PHP中运行多个查询会插入错误的值

时间:2013-03-26 18:11:06

标签: php mysql mysqli

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

$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

  

'插入XXXXXXXXattendees    (contactidtitleforenamessurnamerelationshipgenderagearrived,{ {1}},leftsupervised)   价值观('305','先生',   '亚历克斯', '沃纳', '', 'M', '29/08/1981', '0', '', '', '0');”

在查询ID:305

之后

但是当我真正进入数据库时​​,插入的值是旧的id值(比如说294)。 表列不是自动递增,不是唯一的或主要的,它只是一个int(11)。

究竟是什么造成这种情况?

1 个答案:

答案 0 :(得分:2)

您的问题可能是您正在使用mysql_last_insert_id来获取最后插入的行的ID。在插入多行时,可能无法获得正确的ID。

mysql_last_insert_id调用替换为select查询,该查询返回上次插入的ID,并查看问题是否已解决。