2013-06-28 3 views
0

У меня есть этот длинный запрос, который должен выполняться внутри цикла. Я подготовил его следующим образом:Использовать переменные пользователя @ в подготовленном операторе mysqli

$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, независимо от того, что я установить на два связанных приложении переменные. Мне интересно, вызвано ли это использованием «@» внутри подготовленного оператора, какой-либо подсказки?

Спасибо за помощь!

+0

Это огромное заявление! : D – vikingmaster

+0

Да, я знаю ... :( –

+0

это $ mysqli-> ошибка, а не $ stmt-> ошибка –

ответ

0

Ну, ребята, так как я не мог найти решение этой проблемы, я просто отказался от подготовленного оператора и создал хранимую процедуру с тем же кодом. Не решение, которое я хотел, но, по крайней мере, он работает! В любом случае, спасибо за чтение!