为了账号安全,请及时绑定邮箱和手机立即绑定

试图理解 php mysqli multi_query

试图理解 php mysqli multi_query

PHP
12345678_0001 2023-09-22 15:28:10
我有一个函数,旨在借助 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 的结果相同(到目前为止一切都很好,目前没有错误的查询)Mysql返回空结果(没有行)(创建临时表)1 行受影响(更新临时表)1 行插入(插入产品中)mysql 返回空结果(设置 $new_product_id)mysql 返回空结果(删除 tmp 表)mysql返回空结果(创建临时表)mysql x 行受影响(更新 tmp 表)mysql x 受影响的行(插入表中)mysql 返回空结果(删除表 tmptable)mysql返回空结果(创建临时表).... N.....最后一个查询“显示行0-0(总共1行)(选择@new_product_id)new_product_id = 25我尝试了什么? 我将 select 变量作为我的最终查询,我认为只检查最后一个查询并在那里分配变量是明智的,但由于 php mysqli fetch_assoc 在非对象上不可能,所以我失败了。所以接下来的事情就没那么光明了,我知道我有 16 个来自 mysql 的结果,我只需要其中一个的结果,但无论如何我把它放在多查询中
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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



查看完整回答
反对 回复 2023-09-22
?
绝地无双

TA贡献1946条经验 获得超4个赞

请记住,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 查询,那么它会很有用,但大多数时候您应该使用准备好的语句并单独发送每个查询。


查看完整回答
反对 回复 2023-09-22
?
哔哔one

TA贡献1854条经验 获得超8个赞

.multi_query()您可以尝试对操作中的所有查询使用除最后一个之外的所有查询,即返回您想要的 id 的 SELECT 。然后将该 SELECT 作为单个查询运行。

这是解决您的问题的强大解决方案:@- 变量属于 MySql 连接并在这些连接的生命周期内持续存在。

而且,它可以使您的软件运行干净且可预测。当您需要将结果集返回到程序时,请使用单个查询。


查看完整回答
反对 回复 2023-09-22
  • 3 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信