为什么运行mysqli_multi_query()会导致下一个mysqli_query()语句无法执行?

时间:2016-09-26 02:50:56

标签: php mysqli-multi-query

我试图将一条记录复制到同一个table1中的另一条记录。 mysqli_multi_query()执行成功,但导致下一个代码mysqli_query()不被执行。

代码:

mysqli_multi_query($db,"CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12;UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp = 12;INSERT INTO table1 SELECT * FROM TEMP WHERE id=16;UPDATE table1 SET fullname=johnny WHERE id= 16;");} mysqli_query($db,"SELECT * FROM table1 WHERE id-16");

希望有人能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果您省略了multi_query的其他重要组件,请原谅我,但您不能简单地在mysqli_multi_query()中挤出一堆查询语句并继续前进。整个代码块对于处理多查询过程至关重要。阅读此答案,也许您可​​以找到自己的解决方案:Strict Standards: mysqli_next_result() error with mysqli_multi_query

经典" IF(){DO {} WHILE}"语法'片段可以很好地为您提供服务,并允许您将最终的SELECT包含在multi_query中。

*编辑*

好吧,Varkey,我没有为我的一般建议赢得绿色标记,所以现在我完全用勺子喂你答案,看看是否会这样做......

我已经接受了您的查询,更正了破折号错误和单引号包装的 johnny

我使用以下制造的表格测试了我的PHP代码:

CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `id_pengadu_tpgp` int(10) NOT NULL,
  `fullname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

INSERT INTO `table1` (`id`, `id_pengadu_tpgp`, `fullname`) VALUES
(1, 1, 'Eddie'),
(2, 2, 'Jeff'),
(3, 3, 'Mike'),
(4, 4, 'Matt'),
(5, 5, 'Dean'),
(6, 6, 'Robert'),
(7, 7, 'Scott'),
(8, 8, 'Erik'),
(9, 9, 'Chris'),
(10, 10, 'Ben'),
(11, 11, 'Scott'),
(12, 12, 'Kim');

我看到你决定使用一个片段来实现行复制: In MySQL, can I copy one row to insert into the same table? -要么- Duplicate / Copy records in the same MySQL table -要么- Mysql: Copy row but with new id
在mysqli_multi_query函数中欢迎更新UPDATE新行的fullname列和结尾的SELECT结果的其他查询。如果您打算使用mysqli_multi_query(),那么我就不会在同一个查询批处理中查看干扰所有内容的问题。我已经冒昧地将每个查询保存到一个数组中,并使用直观的键分配每个查询以帮助理解这些过程。我只是略微修改了我的代码片段(来自"严格标准"链接)以完全显示SELECTed行。

这是php代码:

<?php
$queries=array(
    "Create Temp Table"=>"CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12",
    "Copy To Temp"=>"UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp=12",
    "Insert From Temp"=>"INSERT INTO table1 SELECT * FROM TEMP WHERE id=16",
    "Update New Row"=>"UPDATE table1 SET fullname='johnny' WHERE id=16",
    "Retrieve New Resultset"=>"SELECT * FROM table1 WHERE id=16"
);

if(mysqli_multi_query($mysqli,implode(';',$queries))){
    do{
        echo "<br><br>",key($queries),": ",current($queries);  // display key:value @ pointer
        if($result=mysqli_store_result($mysqli)){   // if a result set
            while($rows=mysqli_fetch_assoc($result)){
                echo "<br>id = {$rows["id"]}";
                echo "<br>id_pengadu_tpgp = {$rows["id_pengadu_tpgp"]}";
                echo "<br>fullname = {$rows["fullname"]}";
            }
            mysqli_free_result($result);
        }
        echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs
    } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
}
if($mysqli_error=mysqli_error($mysqli)){
    echo "<br><br>",key($queries),": ",current($queries),"<br>Syntax Error: $mysqli_error";  // display array pointer key:value
}
?>

输出:

Create Temp Table: CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12
Rows = 1

Copy To Temp: UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp=12
Rows = 1

Insert From Temp: INSERT INTO table1 SELECT * FROM TEMP WHERE id=16
Rows = 1

Update New Row: UPDATE table1 SET fullname='johnny' WHERE id=16
Rows = 1

Retrieve New Resultset: SELECT * FROM table1 WHERE id=16
id = 16
id_pengadu_tpgp = 12
fullname = johnny
Rows = 1

这应该足以支持您根据您的具体需求进行调整,并帮助您找到任何错误。当一切正常工作时,删除任何回声或其他不必要的代码行,以使其生产就绪。 *请记住,如果任何查询出现任何错误,查询链将暂停,我的代码段将提供错误消息。