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