有人能告诉我如何使用mysqli-> multi_query()在单个连接上执行多个更新/插入查询吗?感谢。
我确实按照PHP手册中的教程进行操作。但我有一些问题。
我的一批查询有5个以分号分隔的语句。
UPDATE scenes set UserID = '11111111' WHERE ID = '031DFDAD92F6F4AB64AF317C06D64089DF119EC2';
INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 'front ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 11432044);
INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('864406A2CB30CFBE846ED7B0B08A79BD5605037D', '5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 375, 22, 104, 125, 'asdasdcvxcv');
INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);
INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('DBD0E85EAEE2685E2AEC590C8CA214C3C5653971', '1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 272, 288, 114, 89, 'asdasd')
除第3个查询外,全部执行。这就是我失去的地方。如果插入第三个查询时出现sql错误,我怎么能得到它?以及第3次失败后的查询是如何执行的?
答案 0 :(得分:2)
这些示例并没有真正展示如何处理错误。
第一次失败后执行将停止。
使用mysqli_error()
获取错误信息。
mysqli_use_result()
将返回false - 如果您计算结果且数量不足,则会发生错误。
答案 1 :(得分:1)
这不是万无一失的,但是我和MySQLi一起战斗过,而且我的乐队也参与了multi_query,我无法按照我想要的方式进行游戏,或者拥有我需要的灵活性。我看到了一些例子,其中一些程序员只是在运行explode(';', $sql_statements)
,这让我的眼睛流下了可怕的错误。
我的解决方案可能不适合您,但这对我有用。 (不,它也不是防弹,但是我的特定应用程序的工作)。
<?php
$file = file_get_contents('test_multiple_queries.sql');
$result = preg_split("/;(?=\s*(create|insert|update|alter|show|explain|truncate|drop|delete|replace|start|lock|commit|rollback|set|begin|declare|rename|load|begin|describe|help))/im", $file);
$result = array_map('trim', $result);
foreach($result as $sql_query) {
// Procedural style
mysqli_query($link, $sql_query);
// Now you can get errors easily, or affected_rows, or whatever
// using much simpler, readable code
mysqli_error($link);
mysqli_affected_rows($link);
// or go crazy with some other stuff
$words = preg_split("/\s+/", $sql_query);
switch(strtolower($words[0])) {
case 'insert':
// do something nifty like...
echo 'New ID: '.mysqli_insert_id($link)."\n";
break;
case 'drop':
// obviously run this before the query, simply here for example
echo 'Hey young (man|lady)! We don\'t drop anything!';
break;
}
}
答案 2 :(得分:0)
这是未经测试的,不会处理错误,但应该运行所有5个查询。
$fconn = new mysqli($fdbhost, $fdbuser, $fdbpass, $fdbname) or die ('Error connecting to mysqli');
$query = "UPDATE scenes set UserID = '11111111' WHERE ID = '031DFDAD92F6F4AB64AF317C06D64089DF119EC2';";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 'front ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 11432044);";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);";
$query .= "INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('DBD0E85EAEE2685E2AEC590C8CA214C3C5653971', '1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 272, 288, 114, 89, 'asdasd')";
if ($fconn->multi_query($query)) {
if ($result = $fconn->store_result()) {
//while ($row = $result->fetch_row()) {
//print_r($row);
}
//$result->free();
}
if ($fconn->more_results()) {
while ($fconn->next_result()){
$thisresult = $fconn->store_result();
print_r($thisresult).'<br />';
}
}
}
unset($query);
$fconn->close();