亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

試圖理解 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 關注
  • 141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號