JSON in PHP with existing fields printing as Null, how to resolve?

Asked

Viewed 193 times

2

I have a SELECT that is not returning some fields, such as "Notes". In the following image I list the array and see that it is like "Null" the field remarks:

inserir a descrição da imagem aqui

My return SQL is this:

 <?php


header('Content-type: application/json');
header('Access-Control-Allow-Origin: *');

include 'database.php';

$num_pedido=$_GET['num_pedido'];


$query="SELECT
   dados_pedido.iddados_pedido,
   dados_pedido.nome,
   dados_pedido.endereco,
   dados_pedido.numero,
   dados_pedido.complemento,
   dados_pedido.bairro,
   dados_pedido.cidade,
   dados_pedido.estado,
   dados_pedido.cod_cliente,
   dados_pedido.outro_endereco_cod,
   dados_pedido.forma_pagamento,
   dados_pedido.troco,
   dados_pedido.frete,
   dados_pedido.valor_pedido,
   dados_pedido.cod_fornecedor,
   dados_pedido.total_pedido,
   dados_pedido.observacoes,
   dados_pedido.status_pedido,
   dados_pedido.data_hora_pedido,
   item_pedidos.iditens_pedido,
   item_pedidos.nome,
   item_pedidos.imagem,
   item_pedidos.preco_un,
   item_pedidos.qtd,
   item_pedidos.cod_fornecedor,
   item_pedidos.iddados_pedido
FROM
   dados_pedido INNER JOIN item_pedidos ON dados_pedido.iddados_pedido = item_pedidos.iddados_pedido AND dados_pedido.cod_fornecedor = item_pedidos.cod_fornecedor
WHERE 
   dados_pedido.iddados_pedido='$num_pedido'";


$result=$con->query($query);

$row_cnt = mysqli_num_rows($result);
if ($result->num_rows > 0) 
{
    $count=0;
    echo "[";
    while($row = $result->fetch_assoc()) 
    {
            $count++;
            echo json_encode($row);

            if($count!=$row_cnt)
            {
                    echo ",";
            }


    }
    echo "]";
}
else
{
echo "error";
}

?>

SQL, when run without condition, shows me ALL fields:

RESULTADO SEM A CLÁUSURA WHERE

What am I doing wrong here? How to make the "Observations" field appear on my return?

  • I tried to change my JSON like this:

  • $resultray = array(); if ($result = mysqli_query($con, $query)) { while ($Row = mysqli_fetch_row($result)) { $resultray[] = $Row; } echo json_encode($result)ray; } mysqli_close($con);

  • But it got worse....

  • 1

    If, by chance, in the database these fields set with null, are a text that there are accents and/or special characters, must treat them, escaping or formatting their encoding

  • @Williamasimiliar Andean Have some hint of how to format this encoding?

  • @Williamasimiliar really is the accent, I withdrew straight into the database and appeared. I do not know how to treat in the back...

Show 1 more comment

1 answer

3


You need to be using the same format, UTF-8 in the database and logically do the UPDATE/INSERT using the same formatting.

For this first use, for example, back up first:

ALTER TABLE `tabela`
 COLLATE='utf8mb4_unicode_ci',
   CONVERT TO CHARSET utf8mb4;

This will make use of the UTF-8.

Then in PHP, for obvious reasons it would be ideal to use the same CHARSET:

mysqli_set_charset($conexao, 'utf8mb4');

Now just use the json_encode with the JSON_UNESCAPED_UNICODE as indicated in this post.

json_encode($fetch, JSON_UNESCAPED_UNICODE);

If you use the driver of Mysqlnd you can use the mysqli_fetch_all and shall dispense with the use of while:

header('Content-type: application/json');
header('Access-Control-Allow-Origin: *');

include 'database.php';
$con->set_charset('utf8mb4');

$num_pedido = $con->real_escape_string($_GET['num_pedido']); 

$query = "SELECT dados_pedido.iddados_pedido, dados_pedido.nome, dados_pedido.endereco, dados_pedido.numero, dados_pedido.complemento, dados_pedido.bairro, dados_pedido.cidade, dados_pedido.estado, dados_pedido.cod_cliente, dados_pedido.outro_endereco_cod, dados_pedido.forma_pagamento, dados_pedido.troco, dados_pedido.frete, dados_pedido.valor_pedido, dados_pedido.cod_fornecedor, dados_pedido.total_pedido, dados_pedido.observacoes, dados_pedido.status_pedido, dados_pedido.data_hora_pedido, item_pedidos.iditens_pedido, item_pedidos.nome, item_pedidos.imagem, item_pedidos.preco_un, item_pedidos.qtd, item_pedidos.cod_fornecedor, item_pedidos.iddados_pedido FROM dados_pedido INNER JOIN item_pedidos ON dados_pedido.iddados_pedido = item_pedidos.iddados_pedido AND dados_pedido.cod_fornecedor = item_pedidos.cod_fornecedor WHERE dados_pedido.iddados_pedido='$num_pedido'";
$queryExecutada = $con->query($query);

$resposta = $queryExecutada->fetch_all(MYSQLI_ASSOC);

echo json_encode($resposta, JSON_UNESCAPED_UNICODE);

This will do the same thing, with much less code, using the real_escape_string and also the mysqli_fetch_all. "Minifiquei" the SQL query just not to "emphasize it", after all it remains the same!

  • Thank you very much, solved! William Thank you too! You are the ultimate!

  • 1

    @Inkeliz, welcome! If the answer is correct, put it as completed.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.