How to transform multiple JSON into a single valid JSON with json_encode in PHP

0

Hello! I have a script that at the end of each while loop prints a json

echo json_encode($retorno);

The result when running the script is (example bringing multiple results)

    {
    "IdClienteLS": 1695,
    "Nome": "Magia das Flores",
    "Anuncio": "",
    "Telefones": [{
        "Wpp": 0,
        "Fone": "(49) 3224-0196"
    }],
    "Email": "",
    "RedeSocial": "",
    "Site": "",
    "PalavrasChave": ["", null],
    "Ramos": ["Floriculturas"],
    "Logradouro": "",
    "Bairro": "",
    "Cidade": "Lages",
    "Cep": "",
    "Estado": "SC",
    "Complemento": "",
    "Latitude": "",
    "Longitude": ""
} {
    "IdClienteLS": 20141,
    "Nome": "BF Motos",
    "Anuncio": "",
    "Telefones": [{
        "Wpp": 0,
        "Fone": "(49) 3225-5497"
    }],
    "Email": "",
    "RedeSocial": "",
    "Site": "",
    "PalavrasChave": ["", null],
    "Ramos": ["Motos"],
    "Logradouro": "",
    "Bairro": "",
    "Cidade": "Lages",
    "Cep": "",
    "Estado": "SC",
    "Complemento": "",
    "Latitude": "",
    "Longitude": ""
} {
    "IdClienteLS": 3656,
    "Nome": "Trateq",
    "Anuncio": "",
    "Telefones": [],
    "Email": "",
    "RedeSocial": "",
    "Site": "",
    "PalavrasChave": ["", null],
    "Ramos": ["Motos"],
    "Logradouro": "",
    "Bairro": "",
    "Cidade": "",
    "Cep": "",
    "Estado": "",
    "Complemento": "",
    "Latitude": "",
    "Longitude": ""
} {
    "IdClienteLS": 10874,
    "Nome": "Jeane Karine Marcon - Consultora de Beleza",
    "Anuncio": "",
    "Telefones": [],
    "Email": "",
    "RedeSocial": "",
    "Site": "",
    "PalavrasChave": ["", null],
    "Ramos": ["Motos"],
    "Logradouro": "",
    "Bairro": "",
    "Cidade": "",
    "Cep": "",
    "Estado": "",
    "Complemento": "",
    "Latitude": "",
    "Longitude": ""
} {
    "IdClienteLS": 25713,
    "Nome": "Dalia Festas e Eventos",
    "Anuncio": "",
    "Telefones": [],
    "Email": "",
    "RedeSocial": "",
    "Site": "",
    "PalavrasChave": ["", null],
    "Ramos": ["Eventos", "Festas"],
    "Logradouro": "",
    "Bairro": "",
    "Cidade": "",
    "Cep": "",
    "Estado": "",
    "Complemento": "",
    "Latitude": "",
    "Longitude": ""
}

The complete result is not a valid JSON (I tested it on JSONLint ). This is because the impression of several, one followed by the other. To fix it, I tried to mount another array like this:

$retornoScript[] = $retorno;

And after finishing the loop while dei encode in the array $ returnScript containing all others, like this:

echo json_encode($retornoScript);

But the script does not show anything. Neither error nor information. Can anyone tell me what I'm doing wrong? The script was requested by a third party, so the purpose is the same: return (after reading some parameters) database information in a JSON.

PHP code for verification:

$buscaClientes = mysqli_query($conn, "SELECT * FROM clientes WHERE status = 1 AND data_alteracao BETWEEN date('{$dataSQL}') AND date('{$dataHJ}') LIMIT {$inicio}, {$fim}");

if(mysqli_num_rows($buscaClientes) != 0){
        //$retornoScript = array();

        while($dadosCliente = mysqli_fetch_array($buscaClientes)){
            //Busca Atividades
            //Verifica se vem da integração ou da importacao
            if($dadosCliente['integracao'] == 1){
                //Busca Atividades
                $sqlAtividadesCliente = mysqli_query($conn, "SELECT cc.id_cliente, cat.nome AS nome_categoria, cat.url FROM categorias cat INNER JOIN cliente_categorias cc ON cat.id_sistema_ls = cc.id_categoria AND cat.status = 1 INNER JOIN clientes cli ON cli.id_ls = cc.id_cliente AND cli.status = 1 AND cli.id_ls = {$dadosCliente['id_ls']} GROUP BY nome_categoria");
            }else{
                //Busca Atividades
                $sqlAtividadesCliente = mysqli_query($conn, "SELECT cc.id_cliente, cat.nome AS nome_categoria, cat.url FROM categorias cat INNER JOIN cliente_categorias cc ON cat.id_ls = cc.id_categoria AND cat.status = 1 INNER JOIN clientes cli ON cli.id_ls = cc.id_cliente AND cli.status = 1 AND cli.id_ls = {$dadosCliente['id_ls']} GROUP BY nome_categoria");
            }

            $countAtividades = mysqli_num_rows($sqlAtividadesCliente);

            //Endereços do Cliente
            $sqlEnderecosCliente = mysqli_query($conn, "SELECT * FROM endereco_cliente WHERE id_cliente = {$dadosCliente['id']}");

            //Telefones do Cliente
            $sqlTelefonesCliente   = mysqli_query($conn, "SELECT * FROM telefone_cliente WHERE id_cliente = {$dadosCliente['id']}");


            //Endereço Mapa
            $sqlEndereco = mysqli_query($conn, "SELECT * FROM endereco_cliente WHERE id_cliente = {$dadosCliente['id']} ORDER BY id_ls ASC LIMIT 1");
            $dadosEndereco = mysqli_fetch_array($sqlEndereco);

            //PalavrasChave
            $palavras    = $dadosCliente['palavras_chave'];
            $palavra     = explode(",", $palavras);
            $numPalavras = count($palavra);

            //Palavras Chave para o Google
            $palavrasChave = array();
            for ($i = 0; $i <= $numPalavras; $i++) {
                $palavrasChave[] = $palavra[$i];
            }

            $telefones = array();
            while($dadosFone = mysqli_fetch_array($sqlTelefonesCliente)){
                    $telefones[] = array("Wpp" => (int) $dadosFone['whatsapp'], "Fone" => $dadosFone['telefone']);
            }

            //Atividades
            if($countAtividades != 0){
                    $ramos = array();
                    while($dadosAtividade = mysqli_fetch_array($sqlAtividadesCliente)){
                        $ramos[] = $dadosAtividade['nome_categoria'];
                    }
            }

            //Retorna Array jSON
            $retorno = array("IdClienteLS"    => (int) $dadosCliente['id_ls'], 
                            "Nome"        => $dadosCliente['nome'], 
                            "Anuncio"     => $dadosCliente['imagem'],
                            "Telefones"   => $telefones,
                            "Email"       => $dadosCliente['email'],
                            "RedeSocial"  => $dadosCliente['redesocial'],
                            "Site"        => $dadosCliente['site'],
                            "PalavrasChave" => $palavrasChave,
                            "Ramos"       => $ramos,
                            "Logradouro"  => trim($dadosEndereco['logradouro']),
                            "Bairro"      => trim($dadosEndereco['bairro']),
                            "Cidade"      => trim($dadosEndereco['cidade']),
                            "Cep"         => trim($dadosEndereco['cep']),
                            "Estado"      => trim($dadosEndereco['estado']),
                            "Complemento" => trim($dadosEndereco['complemento']),
                            "Latitude"    => $dadosCliente['longitude'],
                            "Longitude"   => $dadosCliente['altitude']
                            );

                    //$retornoScript[] = $retorno;
                    echo json_encode($retorno);
                }
}
    
asked by anonymous 04.03.2018 / 21:51

2 answers

1

The bug was because of the charset :( boba haha .. When giving a var_dump I noticed that the charset was in trouble Correcting it, json compiled Thanks!

For demonstration purposes only, I added charset to the connection

mysqli_set_charset($conn,"utf8");

And in json's encode I did

echo json_encode($retornoScript, JSON_UNESCAPED_UNICODE);
    
05.03.2018 / 19:48
0

The declaration of the variable $ branches in your code can be undefined depending on the result of the execution, generating a possible error, so the code seems to be ok. I edited its code by adding a $ data variable that gets the content to be transformed to json, and I changed the declaration location of the variable $ branches, and at the end of everything json_encode ($ data) where it is empty will print a json "[]" and otherwise assigned content. Hope it helps!

$buscaClientes = mysqli_query($conn, "SELECT * FROM clientes WHERE status = 1 AND data_alteracao BETWEEN date('{$dataSQL}') AND date('{$dataHJ}') LIMIT {$inicio}, {$fim}");
$dados = [];

if(mysqli_num_rows($buscaClientes) != 0){
    //$retornoScript = array();

    while($dadosCliente = mysqli_fetch_array($buscaClientes)){
        //Busca Atividades
        //Verifica se vem da integração ou da importacao
        if($dadosCliente['integracao'] == 1){
            //Busca Atividades
            $sqlAtividadesCliente = mysqli_query($conn, "SELECT cc.id_cliente, cat.nome AS nome_categoria, cat.url FROM categorias cat INNER JOIN cliente_categorias cc ON cat.id_sistema_ls = cc.id_categoria AND cat.status = 1 INNER JOIN clientes cli ON cli.id_ls = cc.id_cliente AND cli.status = 1 AND cli.id_ls = {$dadosCliente['id_ls']} GROUP BY nome_categoria");
        }else{
            //Busca Atividades
            $sqlAtividadesCliente = mysqli_query($conn, "SELECT cc.id_cliente, cat.nome AS nome_categoria, cat.url FROM categorias cat INNER JOIN cliente_categorias cc ON cat.id_ls = cc.id_categoria AND cat.status = 1 INNER JOIN clientes cli ON cli.id_ls = cc.id_cliente AND cli.status = 1 AND cli.id_ls = {$dadosCliente['id_ls']} GROUP BY nome_categoria");
        }

        $countAtividades = mysqli_num_rows($sqlAtividadesCliente);

        //Endereços do Cliente
        $sqlEnderecosCliente = mysqli_query($conn, "SELECT * FROM endereco_cliente WHERE id_cliente = {$dadosCliente['id']}");

        //Telefones do Cliente
        $sqlTelefonesCliente   = mysqli_query($conn, "SELECT * FROM telefone_cliente WHERE id_cliente = {$dadosCliente['id']}");


        //Endereço Mapa
        $sqlEndereco = mysqli_query($conn, "SELECT * FROM endereco_cliente WHERE id_cliente = {$dadosCliente['id']} ORDER BY id_ls ASC LIMIT 1");
        $dadosEndereco = mysqli_fetch_array($sqlEndereco);

        //PalavrasChave
        $palavras    = $dadosCliente['palavras_chave'];
        $palavra     = explode(",", $palavras);
        $numPalavras = count($palavra);

        //Palavras Chave para o Google
        $palavrasChave = array();
        for ($i = 0; $i <= $numPalavras; $i++) {
            $palavrasChave[] = $palavra[$i];
        }

        $telefones = array();
        while($dadosFone = mysqli_fetch_array($sqlTelefonesCliente)){
            $telefones[] = array("Wpp" => (int) $dadosFone['whatsapp'], "Fone" => $dadosFone['telefone']);
        }

        //Atividades
        $ramos = array();
        if($countAtividades != 0){

            while($dadosAtividade = mysqli_fetch_array($sqlAtividadesCliente)){
                $ramos[] = $dadosAtividade['nome_categoria'];
            }
        }

        //Retorna Array jSON
        $retorno = array("IdClienteLS"    => (int) $dadosCliente['id_ls'],
            "Nome"        => $dadosCliente['nome'],
            "Anuncio"     => $dadosCliente['imagem'],
            "Telefones"   => $telefones,
            "Email"       => $dadosCliente['email'],
            "RedeSocial"  => $dadosCliente['redesocial'],
            "Site"        => $dadosCliente['site'],
            "PalavrasChave" => $palavrasChave,
            "Ramos"       => $ramos,
            "Logradouro"  => trim($dadosEndereco['logradouro']),
            "Bairro"      => trim($dadosEndereco['bairro']),
            "Cidade"      => trim($dadosEndereco['cidade']),
            "Cep"         => trim($dadosEndereco['cep']),
            "Estado"      => trim($dadosEndereco['estado']),
            "Complemento" => trim($dadosEndereco['complemento']),
            "Latitude"    => $dadosCliente['longitude'],
            "Longitude"   => $dadosCliente['altitude']
        );

        $dados[] = $retorno;
    }
}

echo json_encode($dados);
    
05.03.2018 / 15:41