Error receiving array from php in ajax

0

I have a script like 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 it to this PHP page, and returns the data. where it checks whether data.type=="add" or if it is data.type="edit" , unfortunately 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 error?

    
asked by anonymous 05.08.2017 / 20:11

2 answers

2

Here you have 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 be to use the isset ) :

note the comments I have 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 out corrected,

First and foremost if you have interest enter this website . which 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
]);
    
05.08.2017 / 20:25
-1

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

The date received by success: function (data) {} will be converted to object, if the answer is not a valid json, it will crash: function (xhr, status, error) {} to be handled by your 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);
    },
});
    
06.08.2017 / 22:55