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

在PHP中运行多个查询会插入错误的值,php,mysql,mysqli,Php,Mysql,Mysqli,我遇到了一个我以前从未见过的问题。代码太多太大,类太多,所以请原谅我没有讲太多细节。 有趣的是: $copy = clone $this; $copy->workerid = $new_workerid; if ( $copy->mysql_create_row( $this->pending_table ) ) return $copy; 这运行正常。当我进入数据库时,我看到表中有一个新条目挂起 但是,当我连续运行多个查询时: $copy = clone $this

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

$copy = clone $this;
$copy->workerid = $new_workerid;
if ( $copy->mysql_create_row( $this->pending_table ) )
    return $copy;
这运行正常。当我进入数据库时,我看到表中有一个新条目挂起

但是,当我连续运行多个查询时:

$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\u create\u 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\u create\u row($this->attendee\u table)进行委托的方式相同,它只是一个插入查询

这就是事情没有意义的地方: 新插入的$copy对象在$copy->mysql\u create\u行插入正确的id,而$att->mysql\u create\u行没有!!! 它插入旧的id。 此外,当我从$att->mysql\u create\u行回显查询时,它会回显正确的(新id)

但是当我进入实际的数据库时,它已经插入了旧的id。这对我来说完全没有意义

我尝试创建自定义的_clone()方法,尝试确保我有副本而没有引用(该死的php),但它仍然会产生相同的错误

问题似乎在于连续的查询,因为当我不执行删除或新插入时,我没有任何问题

删除可以正常工作,第二次插入也可以正常工作,没有任何错误

什么可能会迫使MySQLi api插入错误的id,而查询会回显正确的id? 我只能处理某种形式的后台/多线程损坏,但由于我无法控制这类事情,我甚至不知道如何解决这个问题

从$att->mysql\u create\u行回显查询时,我得到:

查询前id:305

'插入
XXXXXXXX
与会者
联系人ID
标题
姓名
姓氏
关系
性别
年龄
到达
左侧
监管
ics\u编号
) 值('305','Mr', “Alex”、“Werner”、“M”、“1981年8月29日”、“0”、“0”);”

查询后id:305

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


究竟是什么导致了这种情况?

您的问题可能是您正在使用
mysql\u last\u insert\u id
获取最后插入行的id。插入多行时,可能没有获得正确的id


mysql\u last\u insert\u id
调用替换为
select
查询,该查询返回上次插入的id,并查看问题是否得到解决。

使用准备好的语句()instead of
mysqli::query
避免SQL注入@米施,这有什么不同?我应该在连续运行多个查询的任何地方使用它吗?不,应该在可以插入用户数据的任何地方使用它(可能几乎在任何地方)。假设此查询:“选择*FROM t,其中值='$variable'”。现在,如果恶意用户输入:“DROP TABLE t;”,则生成的查询将是:“SELECT*FROM t,其中value='';DROP TABLE t-->”。事先准备好的语句可以防止出现这种情况。@Mish谢谢,我将尝试一下,看看它是否能解决问题:)不,这并不能解决这个问题。它被认为可以防止SQL注入,而SQL注入与您的问题无关。您完全正确。我在一小时前遇到类似的问题时就知道了。注意调用这些查询的顺序很重要。我以为通过克隆,我会得到一个深度副本,结果我仍然引用同一个object对象(attendee是contact数组中的一个对象)。