簡體   English   中英

在mysqli准備好的語句中使用@用戶變量

[英]Use @ user variables inside mysqli prepared statement

我有這個長查詢,我必須在循環內運行。 我准備如下:

    $stmt = $db2->prepare("
    select 
        sum(n_pallets) as n_pallets,
        taxa_pallet,
        sum(valor_pallets) as valor_pallets 
    from 
        ( select 
            A.id_order, A.n_notafiscal, 
            @1:= case 
                when C.tipo_palet like 'A' then D.PalA 
                when C.tipo_palet like 'B' then D.PalB 
                when C.tipo_palet like 'C' then D.PalC 
                when C.tipo_palet like 'D' then D.PalD 
                else E.cs_pallet 
            end as cases_pallet,
            G.taxa_pallet,
            @2 := ceil(B.quantidade/@1) as n_pallets,
            G.taxa_pallet*@2 as valor_pallets
          from 
            lop_order A inner join 
            lop_order_item B using (cod_fatura) inner join 
            lop_cliente C using (cod_cliente) inner join 
            deposito H using (cod_deposito) inner join 
            produto D using (cod_produto) left join 
            lop_cli_prod_pal E on 
                (E.cod_cliente=C.cod_cliente and 
                 E.cod_produto=D.cod_produto) inner join 
            lop_transportador F on (F.cod_transportador= ? ) inner join 
            lop_lead_time G on 
                (F.cod_transportador=G.cod_transportador and 
                 A.cod_domicilio_fiscal=G.cod_domicilio_fiscal and 
                 H.cidade=G.cidade_origem and H.UF=G.UF_origem and 
                 G.data_inicial_vigencia<=A.data_nf and 
                 G.data_final_vigencia>=A.data_nf)
          where
            A.tipo_order='E' and 
            A.tipo_usage<>'ZTRANS' and 
            A.id_order= ?
        ) as pal 
    group by id_order, n_notafiscal");

$id_order = '';
$cod_transportador_pallet = '';
$stmt->bind_param("ss", $id_order,$cod_transportador_pallet);

注意@ 1和@ 2用戶變量,用於在查詢中計算值。 如果我用數據替換?,此查詢在PHP外部運行良好。

在循環內部,我這樣做:

    // (...)
    $id_order=XXX; // some data
    $cod_transportador_pallet=XXX; // some data
    // (...)
    if(!$stmt->execute())
    {
        $erro .= htmlspecialchars($stmt->error)."<br>\n";
        continue;
    }
    $stmt->bind_result($n_pallets,$valor_pallet,$valor_calculado);
    $stmt->fetch();
    $erro .= "$n_pallets, $valor_pallet, $valor_calculado<br>\n";

我在這里沒有執行錯誤,但是無論我在兩個綁定變量上設置了什么,三個結果變量都將設置為0,''和0。 我想知道這是否是由於在准備好的語句中使用“ @”引起的,有什么線索嗎?

謝謝你的幫助!

好了,伙計們,由於我找不到解決此問題的方法,所以我放棄了准備好的語句,並使用相同的代碼創建了一個存儲過程。 不是我想要的解決方案,但至少它能起作用! 無論如何,感謝您的閱讀!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM