Jump to content

is not valid json


John Hebert Trindade
Go to solution Solved by Cerzedelo,

Recommended Posts

adaptei o projeto abaixo em meu projeto:

https://youtu.be/m49I783h_9s?si=xmEknj6biQexrGJh

só que devolve seguinte erro, penso que o erro esteja no javascript:

Uncaught (in promise) SyntaxError: Unexpected token '<', "
<!DOCTYPE "... is not valid JSON
await (assíncrono)
onkeyup @ index:215

meu java esta assim:

async function searchProdutos(registo){

  // Receber a URL do HTML
  const urlAdm = document.getElementById('url-adm').getAttribute('data-url-adm');

  //recebe o valor que o usuário digitar
  const codigoBarras = document.querySelector('#codigo_barras'+registo);

  //Recebe o value da const codigoBarras
  const valueCodigoBarras = codigoBarras.value;

  // Verificar se o campo tem 7 digitos
  if (valueCodigoBarras.length == 7) {
    //faz a requisição ao file add-receber-encomenda.php
    const response = await fetch(urlAdm + 'add-receber-encomenda/index?searchCodigo=' + valueCodigoBarras);

    //Ler os dados retornado do PHP
    const data = await response.json();
    if(data['erro']) {
        document.getElementById('adms_produto_id').innerHTML = data['msg'];
    }else{
    document.getElementById("adms_produto_id").innerHTML = "";
    document.getElementById("adms_produto_id").value = data['response'].produto;
    }
  }
}

na controler tenho:

//Receber o codigo de barras do produto
    $searchCodigo = filter_input(INPUT_GET, "searchCodigo", FILTER_SANITIZE_NUMBER_INT);

if (!empty($searchCodigo)) {
      $listProduct = new \App\adms\Models\stock\AdmsAddReceberEnc();
      $listProduct->searchProduto($searchCodigo);
      $retorna = ['erro' => false, 'dados' => $listProduct];
    } else {
      $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger'>Nenhum Produto encontrado!</div>"];
    }

na model tenho:


  public function searchProduto($codigoBarras = null)
  {
    $this->data['codigo_barras'] = $codigoBarras;
    
    $listProduto = new \App\adms\helpers\AdmsRead();
    $listProduto->fullRead("SELECT id, produto, codigo_barras, venda, stock
                    FROM adms_produtos
                    WHERE codigo_barras =:codigo_barras
                    LIMIT :limit", "codigo_barras={$this->data['codigo_barras']}&limit=1");

    $this->resultBd = $listProduto->getResult();
    
    if ($this->resultBd) {
      $retorna = ['erro' => false, 'dados' => $this->resultBd];
    } else {
      $retorna = ['erro' => true, 'msg' => "<p style='color: #f00'>Erro: Nenhum Produto encontrado!</p>"];
    }
  }

 

Link to comment
Share on other sites

Em 06/02/2024 às 19:09, John Hebert Trindade disse:

adaptei o projeto abaixo em meu projeto:

https://youtu.be/m49I783h_9s?si=xmEknj6biQexrGJh

só que devolve seguinte erro, penso que o erro esteja no javascript:

Uncaught (in promise) SyntaxError: Unexpected token '<', "
<!DOCTYPE "... is not valid JSON
await (assíncrono)
onkeyup @ index:215

meu java esta assim:

async function searchProdutos(registo){

  // Receber a URL do HTML
  const urlAdm = document.getElementById('url-adm').getAttribute('data-url-adm');

  //recebe o valor que o usuário digitar
  const codigoBarras = document.querySelector('#codigo_barras'+registo);

  //Recebe o value da const codigoBarras
  const valueCodigoBarras = codigoBarras.value;

  // Verificar se o campo tem 7 digitos
  if (valueCodigoBarras.length == 7) {
    //faz a requisição ao file add-receber-encomenda.php
    const response = await fetch(urlAdm + 'add-receber-encomenda/index?searchCodigo=' + valueCodigoBarras);

    //Ler os dados retornado do PHP
    const data = await response.json();
    if(data['erro']) {
        document.getElementById('adms_produto_id').innerHTML = data['msg'];
    }else{
    document.getElementById("adms_produto_id").innerHTML = "";
    document.getElementById("adms_produto_id").value = data['response'].produto;
    }
  }
}

na controler tenho:

//Receber o codigo de barras do produto
    $searchCodigo = filter_input(INPUT_GET, "searchCodigo", FILTER_SANITIZE_NUMBER_INT);

if (!empty($searchCodigo)) {
      $listProduct = new \App\adms\Models\stock\AdmsAddReceberEnc();
      $listProduct->searchProduto($searchCodigo);
      $retorna = ['erro' => false, 'dados' => $listProduct];
    } else {
      $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger'>Nenhum Produto encontrado!</div>"];
    }

na model tenho:


  public function searchProduto($codigoBarras = null)
  {
    $this->data['codigo_barras'] = $codigoBarras;
    
    $listProduto = new \App\adms\helpers\AdmsRead();
    $listProduto->fullRead("SELECT id, produto, codigo_barras, venda, stock
                    FROM adms_produtos
                    WHERE codigo_barras =:codigo_barras
                    LIMIT :limit", "codigo_barras={$this->data['codigo_barras']}&limit=1");

    $this->resultBd = $listProduto->getResult();
    
    if ($this->resultBd) {
      $retorna = ['erro' => false, 'dados' => $this->resultBd];
    } else {
      $retorna = ['erro' => true, 'msg' => "<p style='color: #f00'>Erro: Nenhum Produto encontrado!</p>"];
    }
  }

 

Verifique se de facto está a retornar um JSON, veja nas ferramentas de programador do seu browser, o erro é explícito o response não é um JSON válido, logo ou existe um erro no JSON, aquele símbolo '<', ou o retorno não é um ficheiro JSON, parece mais ser um HTML. 

Se está a fazer uma busca dos registos na BD, é pouco provável que venham no formato JSON, se necessitar nesse formato antes de os chamar no javascript tem de fazer o encode dos mesmos para json.

Link to comment
Share on other sites

mas se digito directo na URL aparece me isso:

custom_adms.js:1024 
Response {type: 'basic', url: 'http://swaf.pt/add-receber-encomenda/index?searchCodigo=5600001', redirected: false, status: 200, ok: true, …}
body: (…)
bodyUsed: true
headers: Headers {}
ok: true
redirected: false

status: 200
statusText: "OK"
type:"basic"
url:"http://swaf.pt/add-receber-encomenda/index?searchCodigo=5600001"
[[Prototype]]: Response

e acho que o status 200 é porque deu certo, ou estou errado?

Link to comment
Share on other sites

  • Solution
Em 08/02/2024 às 21:10, John Hebert Trindade disse:

mas se digito directo na URL aparece me isso:

custom_adms.js:1024 
Response {type: 'basic', url: 'http://swaf.pt/add-receber-encomenda/index?searchCodigo=5600001', redirected: false, status: 200, ok: true, …}
body: (…)
bodyUsed: true
headers: Headers {}
ok: true
redirected: false

status: 200
statusText: "OK"
type:"basic"
url:"http://swaf.pt/add-receber-encomenda/index?searchCodigo=5600001"
[[Prototype]]: Response

e acho que o status 200 é porque deu certo, ou estou errado?

A resposta da requisição até pode ser bem sucedida, dando o código 200, mas a resposta pode não ser um Json. No javascript está a dizer que a resposta é um Json, mas o que vem do php, provavelmente não é um json, mas sim texto. Esta situação dará erro, de invalid json.

Nas ferramentas de programador do seu browser, suponhamos no caso do firefox, vá à aba rede, e verifique qual o tipo da requisição, se é html, json, js, etc. Se a requisição que indicou devolver o codigo 200 e o tipo for json, então o erro estará na apresentação dos dados, caso contrário, se o tipo for outro, significa que não pode dizer ao javascript que o response é um json.

O que normalmente é feito, no php como no exemplo, em que atribui os resultados da pesquisa a uma variável dados, imediatamente após é feito um json_encode desses dados e então é enviado esse json para a solicitação.

  • Vote 1
Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.