mysqli::multi_query()的诸多注意事项

在处理网页订单的时候,想到最多的就是 mysqli::multi_query()这个了,可以同时提交多条语句:
1、在订单库里生成订单,并返回一个订单号
2、将购物车里产品清单转移到订单清单列表中
    A、Copy到订单列表表中
    B、清空购物车
这就是提交订单过程中,通常所需要处理的步骤了, mysqli::multi_query()的用武之地,然而在使用 mysqli::multi_query()时,需要注意以下几点:

1、 mysqli::multi_query()只需要第一条语句执行成功就会返回TRUE,否则返回FALSE,所以需要自己依次判断每个语句是否执行成功!
2、 在执行mysqli::multi_query()后,如果还有他的语句需要执行时,就需要刷新mysqli::multi_query()的查询结果,如:


while ($mysqli->next_result()) {;} // flush multi_queries

否则mysqli::multi_query()后面的语句将不执行,返回FALSE!
这是PHP论坛上的例子介绍:http://www.php.net/manual/zh/mysqli.multi-query.php,详细代码如下:


// BAD CODE:
$mysqli->multi_query(” Many SQL queries ; “); // OK
$mysqli->query(” SQL statement #1 ; “) // not executed!
$mysqli->query(” SQL statement #2 ; “) // not executed!
$mysqli->query(” SQL statement #3 ; “) // not executed!
$mysqli->query(” SQL statement #4 ; “) // not executed!
?>

The only way to do this correctly is:

// WORKING CODE:
$mysqli->multi_query(” Many SQL queries ; “); // OK
while ($mysqli->next_result()) {;} // flush multi_queries
$mysqli->query(” SQL statement #1 ; “) // now executed!
$mysqli->query(” SQL statement #2 ; “) // now executed!
$mysqli->query(” SQL statement #3 ; “) // now executed!
$mysqli->query(” SQL statement #4 ; “) // now executed!
?>

可惜,我在我的电脑上测试不成功,还是按照手册的代码,稍作调整,测试成功:


$sql = "select * from try_user where id=100;
select * from try_user where id=200;
select * from try_user where id=300;";

if($db->multi_sql($sql)){
  do {
    if($result = $db->mysqli->store_result()) {
      $result->close();
    }
    if(!$db->mysqli->more_results())  break;
  }while($db->mysqli->next_result());
}


echo "

";
var_dump($db->get_one("try_user", "where id=400"));

echo "

";
var_dump($db->get_one("try_user", "where id=500"));

echo "

";
var_dump($db->get_one("try_user", "where id=600"));

发表评论