Home > database >  Use do while in php to send by json
Use do while in php to send by json

Time:01-17

I intend to use do while in php to send by json. I'm trying this way:

$estado = '2';
    
$query = $conn->prepare("SELECT raddb.EncomendasGerais.Id, date(DataEncomenda) AS `Data`,
    raddb.GrupoProdutos.Identificacao,
    IdProduto,
    Produto,
    Quantidade,
    Requerente,
    Destino,
    Observacoes,
    Estado
    
    FROM raddb.EncomendasGerais 
    WHERE Estado = ?
    ORDER BY Data ASC");
    
$query->execute([$estado]);
    
$produto = $query->fetchALL(PDO::FETCH_ASSOC);
    
do{
    $teste = $produto['IdProduto'];
    $estado1 = '5';
    $query1 = $conn->prepare("SELECT DataAprovacao
        FROM raddb.EncomendasGerais 
        WHERE Estado = ? AND IdProduto = ?
        ORDER BY Id DESC
        LIMIT 1");
    $query1->execute([$estado1, $teste]);
    
    $query2 = $conn->prepare("SELECT Preco
        FROM raddb.EncomendasGerais 
        WHERE Estado = ? AND IdProduto = ?
        ORDER BY Id DESC
        LIMIT 1");
    $query2->execute([$estado1, $teste]);
    
    $json1 = [];
    while($row1=$query1->fetch(PDO::FETCH_ASSOC)){
        extract($row1);
    
        $json1[]= [(string)$DataAprovacao];
    }

    $json2 = [];
    while($row2=$query2->fetch(PDO::FETCH_ASSOC)){
        extract($row2);
    
        $json2[]= [(string)$Preco];
    }
}
    
$json = [];
while($row=$produto->fetch(PDO::FETCH_ASSOC)){
    extract($row);
    
    $json[]= [(string)$Id, (string)$Data, (string)$Identificacao, (string)$IdProduto, (string)$Produto, (string)$Quantidade, (string)$Requerente,
              (string)$Destino, (string)$Observacoes, (string)$Estado];
}

Before sending by json I'm trying to see what is returned in the variables like this:

var_dump($json1);
var_dump($json2);
var_dump($json);

But the error 500 is always returned.

I want to use do while in pdo, but I don't know if I'm using it correctly.

Can anyone help to see what I have wrong with my code?

Updated code:

$estado = '2';

$query = $conn->prepare("SELECT raddb.EncomendasGerais.Id, date(DataEncomenda) AS `Data`,
raddb.GrupoProdutos.Identificacao,
IdProduto,
Produto,
Quantidade,
Requerente,
Destino,
Observacoes,
Estado

FROM raddb.EncomendasGerais 

WHERE Estado = ?

ORDER BY Data ASC");

$query->execute([$estado]);

$produto = $query->fetch(PDO::FETCH_ASSOC);

$json = [];
$json1 = [];
$json2 = [];

do{
    $teste = $produto['IdProduto'];
    $estado1 = '5';
    $query1 = $conn->prepare("SELECT DataAprovacao
       
    FROM raddb.EncomendasGerais 
    
    WHERE Estado = ? AND IdProduto = ?
    
    ORDER BY Id DESC
    
    LIMIT 1");

    $query1->execute([$estado1, $teste]);

    $query2 = $conn->prepare("SELECT Preco
       
    FROM raddb.EncomendasGerais 
    
    WHERE Estado = ? AND IdProduto = ?
    
    ORDER BY Id DESC
    
    LIMIT 1");

    $query2->execute([$estado1, $teste]);

   
    while($row1=$query1->fetch(PDO::FETCH_ASSOC)){
    extract($row1);

    $json1[]= [(string)$DataAprovacao];
    }
    
    while($row2=$query2->fetch(PDO::FETCH_ASSOC)){
    extract($row2);

    $json2[]= [(string)$Preco];
    }

}while($produto = $query->fetch(PDO::FETCH_ASSOC)){
    extract($produto);

    $json[]= [(string)$Id, (string)$Data, (string)$Identificacao, (string)$IdProduto, (string)$Produto, (string)$Quantidade, (string)$Requerente,
    
    (string)$Destino, (string)$Observacoes, (string)$Estado];
}

var_dump($json1);
var_dump($json2);
var_dump($json);

CodePudding user response:

$produto is not an associative array. It's a 2-dimensional array of all the rows returned by the first query. So you can't use $produto['IdProduto'].

Instead of fetching everything from the first query with fetchAll(), use while ($produto = $query->fetch(PDO::FETCH_ASSOC)). Then you can do the other queries inside that loop.

You don't need to prepare the same query multiple times. Do all the prepare() calls before the loop.

$estado = '2';
    
$query = $conn->prepare("SELECT raddb.EncomendasGerais.Id, date(DataEncomenda) AS `Data`,
    raddb.GrupoProdutos.Identificacao,
    IdProduto,
    Produto,
    Quantidade,
    Requerente,
    Destino,
    Observacoes,
    Estado
    
    FROM raddb.EncomendasGerais 
    WHERE Estado = ?
    ORDER BY Data ASC");

$query1 = $conn->prepare("SELECT DataAprovacao
    FROM raddb.EncomendasGerais 
    WHERE Estado = ? AND IdProduto = ?
    ORDER BY Id DESC
    LIMIT 1");

$query2 = $conn->prepare("SELECT Preco
    FROM raddb.EncomendasGerais 
    WHERE Estado = ? AND IdProduto = ?
    ORDER BY Id DESC
    LIMIT 1");
    
$query->execute([$estado]);
    
$json = [];
$json1 = [];
$json2 = [];

while ($produto = $query->fetch(PDO::FETCH_ASSOC)) {
    extract($row);
    
    $json[]= [(string)$Id, (string)$Data, (string)$Identificacao, (string)$IdProduto, (string)$Produto, (string)$Quantidade, (string)$Requerente,
              (string)$Destino, (string)$Observacoes, (string)$Estado];

    $estado1 = '5';

    $query1->execute([$estado1, $IdProduto]);
    $json1 = array_merge($json1, $query1->fetchAll(PDO::FETCH_NUM));

    $query2->execute([$estado1, $IdProduto]);
    $json2 = array_merge($json2, $query2->fetchAll(PDO::FETCH_NUM));
}

CodePudding user response:

do {
  // something
}
$json = []; // is not valid as the next statement after `do` should be a `while`.
while(foo) // requires semicolon

This variable has to be declared before the do {

The code has to be like

$json = [];
do {
  // something
}
while(foo);

also the while loop should not contain a body as you are using do-while loop.

do {
  // something
} while() { // this wrong.!
}
  •  Tags:  
  • php
  • Related