试图理解 php mysqli multi_query

我有一个函数,旨在借助 sql 查询复制具有所有属性的产品。我的问题是完成后将 new_product_id 返回给 php 。


如果我在 phpmyadmin 中运行 sql 脚本,则一切正常。如果我使用 php 函数运行 sql 脚本,则一切正常。


我需要帮助的是如何将上次查询中的 mysql-set-variable: @new_product_id 分配给我想要返回的 php 变量。


----- sql查询------


CREATE TEMPORARY TABLE tmptable SELECT * FROM product WHERE id='19' AND site_id='1';

UPDATE tmptable SET id = 0,parent_id='19',status_id='1',name_internal=concat('NEW ',name_internal);

INSERT INTO product SELECT * FROM tmptable;

SET @new_product_id = LAST_INSERT_ID();

DROP TABLE tmptable;


CREATE TEMPORARY TABLE tmptable SELECT * FROM product_abcd WHERE product_id='19' AND site_id='1';

UPDATE tmptable SET product_id = @new_product_id,id=0;

INSERT INTO product_abcd SELECT * FROM tmptable;

DROP TABLE tmptable;


CREATE TEMPORARY TABLE tmptable SELECT * FROM product_efgh WHERE product_id='19' AND site_id='1';

UPDATE tmptable SET product_id = @new_product_id,id=0;

INSERT INTO product_efgh SELECT * FROM tmptable;

DROP TABLE tmptable;


(Here is more correct SQL insert statements)


SELECT @new_product_id AS new_product_id;

----- php函数(不完整)------

上面的代码有效,我得到了一个很好的产品副本,结果 =0 表示失败,结果 1 表示成功,(这有效)

我希望它的工作方式是 result= 0 失败, result= new_product_id 成功,这样我就可以将用户重定向到新创建的产品,从而节省用户一键点击。

查询结果,来自 phpmyadmin 的结果与来自 php 的结果相同(到目前为止一切都很好,目前没有错误的查询)

  1. Mysql返回空结果(没有行)(创建临时表)

  2. 1 行受影响(更新临时表)

  3. 1 行插入(插入产品中)

  4. mysql 返回空结果(设置 $new_product_id)

  5. mysql 返回空结果(删除 tmp 表)

  6. mysql返回空结果(创建临时表)

  7. mysql x 行受影响(更新 tmp 表)

  8. mysql x 受影响的行(插入表中)

  9. mysql 返回空结果(删除表 tmptable)

  10. mysql返回空结果(创建临时表).... N.....最后一个查询“显示行0-0(总共1行)(选择@new_product_id)new_product_id = 25

我尝试了什么? 我将 select 变量作为我的最终查询,我认为只检查最后一个查询并在那里分配变量是明智的,但由于 php mysqli fetch_assoc 在非对象上不可能,所以我失败了。

所以接下来的事情就没那么光明了,我知道我有 16 个来自 mysql 的结果,我只需要其中一个的结果,但无论如何我把它放在多查询中


12345678_0001
浏览 96回答 3
3回答

慕工程0101907

另一个是尘埃落定,我放弃并定义了一个从 0 到 14 的 sql 查询数组,并将其作为 mysqli->query() 运行。感谢大家的评论和时间。

绝地无双

请记住,multi_query()将一组 SQL 查询发送到 MySQL 服务器,但仅等待第一个查询的执行。如果您想使用执行 SQLmulti_query()并仅获取最后一个查询的结果而忽略前面的查询,那么您需要执行阻塞循环并将结果缓冲到 PHP 数组中。迭代所有结果,等待 MySQL 处理每个查询,一旦 MySQL 响应,就不再有结果,您可以保留最后获取的结果。例如,考虑这个函数。它向 MySQL 服务器发送一堆串联的 SQL 查询,然后等待 MySQL 逐个处理每个查询。每个结果都被提取到 PHP 数组中,最后一个可用的数组从函数返回。function executeMultiQueryAndGetOnlyLastResult(mysqli $mysqli):array {    $mysqli->multi_query('    SELECT "a";    SELECT 2;    SELECT "val";    ');    $values = [];    do {        $result = $mysqli->use_result();        if ($result) {            // process the results here            $values = $result->fetch_all();                        $result->free();        }    } while ($mysqli->next_result()); // next_result will block and wait for next query to finish on MySQL server    $mysqli->store_result(); // Needed to fetch the error as exception    return $values;}显然,将每个查询单独发送到 MySQL 会容易得多。multi_query()非常复杂并且用途非常有限。如果您有许多无法通过 PHP 单独执行的 SQL 查询,那么它会很有用,但大多数时候您应该使用准备好的语句并单独发送每个查询。

哔哔one

.multi_query()您可以尝试对操作中的所有查询使用除最后一个之外的所有查询,即返回您想要的 id 的 SELECT 。然后将该 SELECT 作为单个查询运行。这是解决您的问题的强大解决方案:@- 变量属于 MySql 连接并在这些连接的生命周期内持续存在。而且,它可以使您的软件运行干净且可预测。当您需要将结果集返回到程序时,请使用单个查询。
打开App,查看更多内容
随时随地看视频慕课网APP