Error when receiving php array in ajax

Asked

Viewed 865 times

0

I have a script as following code:

$("#submit").click(function(){

       var dataString ={
		nome : $("#nome").val(),
		status : $("#status").val(),
		id : $("#id").val()
	   };
                   
        $.ajax({
            type: "POST",
            url: "../vendors/php/ins_salvar_menu.php",
            data: dataString,
            cache : false,
            success: function(data){
			  console.log(data.nome);
			  console.log(data);
              if(data.type == 'add'){
                 $("#menu-id").append(data.menu);
              } else if(data.type == 'edit'){
                 $('#nome_show'+data.id).html(data.nome);
                 $('#status_show'+data.id).html(data.status);
              }
              $('#nome').val('');
              $('#status').val('');
              $('#id').val('');
			  

            } ,error: function(xhr, status, error) {
              alert(error);
            },
        });
    });

That sends the data to a PHP page whose content is as follows:

<?php 
include "../../seguranca/banco/conexao_banco.php";
include "operacaobd_php.php";
date_default_timezone_set ("America/Sao_Paulo");
$data_criacao = date('Y-m-d H:m:s');
$data_modificacao = date('Y-m-d H:m:s');
if($_POST['id'] != ''){
	$tabela="categorias";
	$dados = array(
		'nome' => $_POST['nome'],
		'status' => $_POST['status'],
		'data_modificacao'=> $data_modificacao
	);	
	$condicao = array(
		'id' => $_POST['id']
	);
	$sql_upd_categorias_resultado = alterar($tabela, $condicao, $dados);
	
	
	$arr['type']  = 'edit';
	$arr['nome'] = $_POST['nome'];
	$arr['status']  = $_POST['status'];
	$arr['id']    = $_POST['id'];
}else{
	$tabela="categorias";
	$dados = array(
		'nome' => $_POST['nome'],
		'status' => $_POST['status'],
		'data_criacao'=> $data_criacao,
		'data_modificacao'=> $data_modificacao
	);
	$sql_ins_categorias_resultado = adicionar($tabela, $dados);

	$arr['type'] = 'add';
	$arr['menu'] = '<li class="dd-item dd3-item" data-id="'.$conexaobd->lastInsertId().'" >
                    <div class="dd-handle dd3-handle">Drag</div>
                    <div class="dd3-content"><span id="nome_show'.$conexaobd->lastInsertId().'">'.$_POST['nome'].'</span> 
                        <span class="span-right">/<span id="status_show'.$conexaobd->lastInsertId().'">'.$_POST['status'].'</span> &nbsp;&nbsp; 
                            <a class="edit-button" id="'.$conexaobd->lastInsertId().'" nome="'.$_POST['nome'].'" status="'.$_POST['status'].'" ><i class="fa fa-pencil"></i></a>
                            <a class="del-button" id="'.$conexaobd->lastInsertId().'"><i class="fa fa-trash"></i></a></span> 
                    </div>';
}
return json_encode($arr);

?>

The add function:

function adicionar($adc_tabela, $adc_dados){

// Armazenas os dados do array
$adc_campos = array_keys($adc_dados);
print_r($adc_campos);
// contagem dos campos existentes
$adc_n_campos = count($adc_dados);
// Inicia a sintaxe
$adc_sintaxe = "INSERT INTO ".$adc_tabela." (";
//monta o resto da estrutura
for($adc_aux=0; $adc_aux<$adc_n_campos; $adc_aux++){
    $adc_sintaxe.= $adc_campos[$adc_aux].", ";
}
//retira a ultima virgula
$adc_sintaxe = substr($adc_sintaxe, 0, -2);
// fecha os campos e adciona o VALUES na sintaxe
$adc_sintaxe .= ") VALUES (";
//adiciona os valores na sintaxe
for($adc_aux=0; $adc_aux<$adc_n_campos; $adc_aux++){
    $adc_sintaxe.= ":".$adc_campos[$adc_aux].", ";
}
// Retira a ultima virgula
$adc_sintaxe = substr($adc_sintaxe, 0, -2);
// Fim da sintaxe
$adc_sintaxe .= ")";
// chama a função global para fazer conexão com o Banco de dados
global $conexaobd;
// prepara a sintaxe
$adc_preparado = $conexaobd->prepare($adc_sintaxe);
// seta os valores de cada campo
for($adc_aux=0; $adc_aux<$adc_n_campos; $adc_aux++){
    /*if((!$adc_dados[$adc_campos[$adc_aux]]) AND (!$adc_dados[$adc_campos[$adc_aux]]=="0")){
        $adc_dados[$adc_campos[$adc_aux]] = NULL;
    }
    OBS.: o IF acima buga com o 0, então se algum dos dados for ==0 ele atribui NULL, então o IF acima corrige o problema com o 0
    */
    if(!$adc_dados[$adc_campos[$adc_aux]]){
        if($adc_dados[$adc_campos[$adc_aux]] == "0" ){
            $adc_dados[$adc_campos[$adc_aux]] = 0;
        }else{
            $adc_dados[$adc_campos[$adc_aux]] = NULL;
        }
    }
    $adc_preparado -> BindValue(":".$adc_campos[$adc_aux], $adc_dados[$adc_campos[$adc_aux]]);
    /*
     print_r($adc_dados[$adc_campos[$adc_aux]]);
     echo"<br>";
    */
}
  return $adc_preparado->execute();
}

The problem itself:

In the JS file it sends to this PHP page, and returns the data. where it checks if data.type=="add" or if it is data.type="edit", unfortunately while giving a console.log(data.type) the message is Undefined, and a console.log(data) returns an array that should not be returning, which in this case is:

Array(
    [0] => nome
    [1] => status
    [2] => data_criacao
    [3] => data_modificacao
)

what would be the mistake?

  • 1

    @13dev where did this method you added to the question come from? This type of editing should be avoided, especially since the author does not mention any of this excerpt or in deleted posts. Always choose to direct the author himself to edit the question.

  • 1

    @Cuncuno understood, my mistake, this method is the author’s own, where in the answer I asked this same method, but when asking the author to edit the answer ( I was wrong to ask, I meant question ).

2 answers

2


Here’s the code with some changes and better habits for your programming.

To be direct your code is bad, here is the possible solution that would use the function isset():

Pay attention to the comments I’ve left

<?php 
include "../../seguranca/banco/conexao_banco.php";
include "operacaobd_php.php";

date_default_timezone_set ("America/Sao_Paulo");
$data_criacao = date('Y-m-d H:m:s');
$data_modificacao = date('Y-m-d H:m:s');
$tabela = "categorias";

// começa sempre a verificar pela negatividade
// ou seja nega sempre a condição só no final é que retornas o pretendido
// usa função isset para verificares se a variável existe
if(!isset($_POST['id'])){

    $dados = array(
        'nome' => $_POST['nome'],
        'status' => $_POST['status'],
        'data_criacao'=> $data_criacao,
        'data_modificacao'=> $data_modificacao
    );

    $sql_ins_categorias_resultado = adicionar($tabela, $dados);

    $arr['type'] = 'add';

    // nunca deves retornar html em ajax é má pratica!
    // tenta retornar so um array com os dados necessários
    // e com jquery ou js tratas os dados retornados pela requisição ajax
    $arr['menu'] = '<li class="dd-item dd3-item" data-id="'.$conexaobd->lastInsertId().'" >
                    <div class="dd-handle dd3-handle">Drag</div>
                    <div class="dd3-content"><span id="nome_show'.$conexaobd->lastInsertId().'">'.$_POST['nome'].'</span> 
                        <span class="span-right">/<span id="status_show'.$conexaobd->lastInsertId().'">'.$_POST['status'].'</span> &nbsp;&nbsp; 
                            <a class="edit-button" id="'.$conexaobd->lastInsertId().'" nome="'.$_POST['nome'].'" status="'.$_POST['status'].'" ><i class="fa fa-pencil"></i></a>
                            <a class="del-button" id="'.$conexaobd->lastInsertId().'"><i class="fa fa-trash"></i></a></span> 
                    </div>';

    return json_encode($arr);

}
// se o id esta definido
// verifica se os dados neste caso o POST EXISTE não podes confiar no utilizador
$dados = array(
    'nome' => $_POST['nome'],
    'status' => $_POST['status'],
    'data_modificacao'=> $data_modificacao
);  

//porque guardas o retorno se não esta a usa-lo (codigo apresentado na resposta)
//variavel com nome tão grande!
$sql_upd_categorias_resultado = alterar($tabela,  array( 'id' => $_POST['id'] ), $dados);

$arr['type']    = 'edit';

// verifica se os dados existem, não deves confiar no utilizador
$arr['nome']    = (isset($_POST['nome'])) ? $_POST['nome']  : '';
$arr['status']  = (isset($_POST['status'])) ? $_POST['status'] : '';
$arr['id']      = (isset($_POST['id']) && is_numeric($_POST['id'])) ? $_POST['id']  : null;

return json_encode($arr);

?>

EDIT: Here is the code with the defects I pointed fixed,

first of all if you have interest in this website that will give you good ways to program in PHP.

<?php 
// minha opiniao: funções que alteram configuração do php eu meto sempre no topo
date_default_timezone_set ("America/Sao_Paulo");

// se possivel usa ingles em nomes de ficheiros exemplo: ConnectDB.php
include "../../seguranca/banco/conexao_banco.php"; // sugestão: muda para OpenDatabase.php ou ConnectDB.php
include ("operacaobd_php.php"); // sugestão muda o nome do arquivo pois não é claro ex: OperationsDatabase.php


// tenta usar nome de variaveis em ingles
// assim todos que verem teu codigo saberá do que se trata
$createData = date('Y-m-d H:m:s');
$modificationData = date('Y-m-d H:m:s');
$table = "categorias";

//verifica se os indices do $_POST existe
$postName = (isset($_POST['nome'])) ? filter_var($_POST['nome'], FILTER_SANITIZE_STRING) : NULL;
$postStatus = (isset($_POST['status'])) ? filter_var($_POST['status'], FILTER_SANITIZE_STRING) : NULL;
$postID = (isset($_POST['id']) && is_numeric($_POST['id'])) ? $_POST['id'] : NULL;

// fiz tudo de uma vez mas faz separadamente
if(is_null($postName) || is_null($postStatus))
{
    return json_decode(['error' => 'algumas das variveis post não estao definidas']);
}

if($postID === NULL){

    $dados = [
        'nome' => $postName,
        'status' => $postStatus,
        'data_criacao'=> $createData,
        'data_modificacao'=> $modificationData,
        'type' => 'add'
    ];


    if(!adicionar($tabela, $dados)){
        return json_encode(['error' => 'Erro ao adicionar a base de dados por favor tente novamente']);
    }

    //$arr['menu'] = '<li class="dd-item dd3-item" data-id="'.$conexaobd->lastInsertId().'" ><div class="dd-handle dd3-handle">Drag</div><div class="dd3-content"><span id="nome_show'.$conexaobd->lastInsertId().'">'.$_POST['nome'].'</span> <span class="span-right">/<span id="status_show'.$conexaobd->lastInsertId().'">'.$_POST['status'].'</span> &nbsp;&nbsp;  <a class="edit-button" id="'.$conexaobd->lastInsertId().'" nome="'.$_POST['nome'].'" status="'.$_POST['status'].'" ><i class="fa fa-pencil"></i></a><a class="del-button" id="'.$conexaobd->lastInsertId().'"><i class="fa fa-trash"></i></a></span> </div>';

    // aqui adiciona os valores que estavas juntando ao HTML
    // no array acima ($arr['menu']) como exemplo ['data-id' => $conexaobd->lastInsertId()]
    return json_encode(['type' => 'add', 'error' => null]);

}

$dados = [
    'nome' => $postName,
    'status' => $postStatus,
    'data_modificacao'=> $modificationData
];  


if(!alterar($table, [ 'id' => $postID ], $dados)){
    return json_encode(['error' => 'Erro ao alterar na base de dados por favor tente novamente!']);
}

return json_encode([
        'type' => 'edit',
        'nome' => $postName,
        'status' => $postStatus,
        'id' => $postID,
        'error' => null
]);
  • having said that, if you want the script 'fixed' for the errors I mentioned just say to change the answer

  • thank you, I really agree with your correction actually this code is not entirely mine, it is an example taken on the internet, some things ai as function of Insert and update are mine. but thanks for the constructive criticism. If you can also post the corrected code will help me a lot!

  • yes and solved your problem this code ? a few minutes and already put the code with the defects I pointed out

  • solved, yes, actually it is bigger than that, oq postei is a part of the nestable plugin code.

  • reply edited with script in 'conditions'

  • Thanks, it was show. but when I give a console.log(data.type); it keeps returning Undefined. : C

  • ago console.log(data); and shows what returned

  • returns this: Array&#xA;(&#xA; [0] => nome&#xA; [1] => status&#xA; [2] => data_criacao&#xA; [3] => data_modificacao&#xA;)

  • the correct would not be to return what is inside json_encode?

  • edit the response and enter the code for this function: adicionar(), yes would be correct, but it’s not coming to that Return so the error may be in this function

  • Added, it is a function that I use throughout the site, I have it that is INSERT, I have UPDATE and DELETE

  • 'Cause you’re making a print_r($adc_campos) within the function add why is this to return you php and not json!

  • removes all debug code(print_r, var_dump, etc) and tests the application there

  • Then I removed, and nothing, ta returning empty now. Just to check there is an Else of $postid === NULL ?

  • Tries to debug line by line in the file, not because within this same condition has a Return, which means that it will stop the script there

  • Thanks for the help, I’ve been trying for a while here, I’ll keep trying if I can find this mistake....

  • 1

    13, I tested everything, only managed to change the return for print, and agr it ta receiving, I added tbm in the script o data=JSON.parse(data);

  • now that you’ve added data=JSON.parse(data); try using Return instead of print

  • appears the following: Uncaught SyntaxError: Unexpected end of JSON input&#xA; at JSON.parse (<anonymous>)&#xA; at Object.success (menu.js:55)&#xA; at i (jquery.min.js:2)&#xA; at Object.fireWith [as resolveWith] (jquery.min.js:2)&#xA; at z (jquery.min.js:4)&#xA; at XMLHttpRequest.<anonymous> (jquery.min.js:4)

  • checks if what comes from php file is converted to json

Show 15 more comments

-1

In $.ajax(); calls from jQuery, when you receive a json you can specify the dataType parameter: "json".

The date received by Success: Function(date){} will be converted to object, if the answer is not a valid json, it will fall into error: Function(xhr, status, error){} to be dealt with by its application.

$.ajax({
    type: "POST",
    url: "../vendors/php/ins_salvar_menu.php",
    data: dataString,
    dataType: "json",
    cache : false,
    success: function(data){
        console.log(data.nome);
        console.log(data);
        if(data.type == 'add'){
            $("#menu-id").append(data.menu);
        } else if(data.type == 'edit'){
            $('#nome_show'+data.id).html(data.nome);
            $('#status_show'+data.id).html(data.status);
        }
        $('#nome').val('');
        $('#status').val('');
        $('#id').val('');


    } ,error: function(xhr, status, error) {
        alert(error);
    },
});
  • I didn’t understand why they denied my answer, I just gave a hint to avoid using data=JSON.parse(data); implementing a dataType: "json"

Browser other questions tagged

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