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.!
}