Показване на респонса, който получава ajax-a от PHP-то

vinsbg

Registered
Здравейте,

Реших да пусна темата в PHP раздела въпреки, че може би е за HTML-а. Имам една таблица, която има опция за добавяне на нов ред и с ajax инсъртва в базата. Всичко работи перфектно с изключение на грешките от проверките, които излизат от страна на сървър сайда.

Ето какво имам в предвид. PHP:
Код:
	   if($phone < 4) { 
	    //$error = "phone missing";
	       echo "phone missing";
	       exit();
	   }
	   if($name < 4) { 
               echo 'please enter the name';
               exit(); 
           }
         ....
ако потребителя не въведе телефонен номер искам да изкарам съобщението. В developer console-та на хрома си виждам респонса нормално.

Тук е ajax-a
Код:
 $.ajax
 ({
  type:'post',
  url:'modify_records.php',
  data:{
   insert_row:'insert_row',
   
   phone_val:phone,
   name_val:name
  },
    success:function(response) {
                       if(response!="")
                       {
                           var id=response;
                           var table=document.getElementById("user_table");
                           var table_len=(table.rows.length)-1;
var row = table.insertRow(table_len).outerHTML="<tr id='row"+id+"'><td id='phone:"+id+"'>"+phone+"</td><td id='name:"+id+"'>"+name+"</td></tr>";

       
			        document.getElementById("new_phone").value="";
				document.getElementById("new_name").value="";
                          
                           $('#error').hide();
                       }else{

                       $('#error').html(response);
                       $('#error').show();
                   
                  }  
  
 });
}
И това добавих на страницата, където би трябвало да се покаже
Код:
<div id="error" style="display:none;"></div>

Пробвах и с alert(response)... window.alert... само в конзолата ги виждам..
 
Не ги пускай отговорите като plain text.

Направи нещо от сорта на
Код:
$errors = [];
и после:

Код:
json_encode(['success' => false, 'errors' => $errors);
(може да се наложи да настроиш header-ите да са application/json)

Код:
success: function(response) {
  var $error = $('#error');
  if (response.success) {
    //Success добавен е записа.
    //Кода ти е омешан, имаш и vanilla js и jquery.
    //По-скоро се спри на един вариант.
  } else {
    //response.errors е масив с грешки:
    $error.html('');
    for (var i = 0; i < response.errors.length; i++) {
      $error.append($('<p>' + response.errors[i] + '</p>'));
    }
    $error.show(); //Или като цяло може да махнеш display: none;
  }
}

А, когато няма грешки:
Код:
json_encode(['success' => true, 'errors' => null); //или може да махнеш errors като цяло
 
Благодаря, но пак не излизат на страницата. Иначе в конзолата виждам
Код:
{"success":false,"errors":"phone missing"}

А това
Код:
 else {
    
    $error.html('');
    for (var i = 0; i < response.errors.length; i++) {
      $error.append($('<p>' + response.errors[i] + '</p>'));
    }
    $error.show(); 
  }
В същия div ли ще трябва да се покаже или?
<div id="error"></div>
 
Да, ще вмъкне параграфи в дива. https://jsfiddle.net/b1rjgvue/

Това, което си дал, response.errors не е масив.
{"success":false,"errors":"phone missing"}

Направи го така:
Код:
(...)else {
    $("#error").html(response.errors);
}
https://jsfiddle.net/b1rjgvue/1/

Или си смени backend-a да е масив $errors:

Код:
$errors = [];
if ($phone < 4) {
    $errors[] = "phone missing";
}
if($name < 4) {
   $errors[] ='please enter the name';
}
echo    json_decode(['success' => count($errors) === 0, 'errors' => $errors]);
exit;

Също така, какви са ти response/request header-ите на този ajax. Може да го видиш в конзолата, под таба Network.
 
Fakeheal каза:
Или си смени backend-a да е масив $errors:

Код:
$errors = [];
if ($phone < 4) {
    $errors[] = "phone missing";
}
if($name < 4) {
   $errors[] ='please enter the name';
}
echo    json_decode(['success' => count($errors) === 0, 'errors' => $errors]);
exit;

Също така, какви са ти response/request header-ите на този ajax. Може да го видиш в конзолата, под таба Network.
Това е респонса
array(3) { ["insert_row"]=> string(10) "insert_row" ["name_val"]=> string(0) "" ["phone_val"]=> string(0) "" }
Warning: json_decode() expects parameter 1 to be string, array given
 
Сега всичко излиза коректно в конзолата, но на страницата нищо..
Код:
array(3) { ["insert_row"]=> string(10) "insert_row" ["name_val"]=> string(0) "" ["phone_val"]=> string(0) "" }

{"success":false,"errors":["phone missing","please enter the name"]}
 
Fakeheal каза:
След като се изпълни с ajax, какъв e content-a на div id="error". Провери го с DevTools-a.

Също така виж дали нямаш вече елемент с такова id. :)
Как да го видя, след като го няма на страницата :)
 
Fakeheal каза:
Я дай сегашния си код, който сглобихме досега?
ajax-a
Код:
 $.ajax
 ({
  type:'post',
  url:'modify_records.php',
  data:{
   insert_row:'insert_row',   
   phone_val:phone,
   name_val:name
  },

  
  success:function(response) {
     
  var $error = $('#erroor');
	  
  if (response.success) {
                           var id=response;
                           var table=document.getElementById("user_table");
                           var table_len=(table.rows.length)-1;
var row = table.insertRow(table_len).outerHTML="<tr id='row"+id+"'><td id='phone:"+id+"'>"+phone+"</td><td id='name:"+id+"'>"+name+"</td></tr>";

			        document.getElementById("new_phone").value="";
				document.getElementById("new_name").value="";
  } else {
	    	
	   	$error = $('#erroor');
		$error.html(response.errors);
		    for (var i = 0; i < response.errors.length; i++) {
		      $error.append($('<p>' + response.errors[i] + '</p>'));
		    }
	    	$error.show(); 
    }    
  }     

  
 });
php-то
Код:
	   $name=$_POST['name_val'];
	   $phone=$_POST['phone_val'];
$errors = [];
if ($phone < 4) {
    $errors[] = "phone missing";
}
if($name < 4) {
   $errors[] ='please enter the name';
}
echo    json_encode(['success' => count($errors) === 0, 'errors' => $errors]);
exit;
и на страницата
Код:
<div id="erroor"></div>
 
Сега нещо друго започна да излиза
Код:
for (var i = 0; i < errors.length; i++) {
}
излиза това:
Код:
Uncaught TypeError: Cannot read property 'length' of undefined
 
с error:
Код:
array(3) {
  ["insert_row"]=>
  string(10) "insert_row"
  ["phone_val"]=>
  string(0) ""
  ["name_val"]=>
  string(0) ""
}
{"success":false,"errors":["phone missing","please enter the name"]}
с success ... хм.. пак иска име въпреки, че се вижда, че го има..

Код:
array(3) {
  ["insert_row"]=>
  string(10) "insert_row"
  ["phone_val"]=>
  string(8) "32141324"
  ["name_val"]=>
  string(10) "testT name"
}
{"success":false,"errors":["please enter the name"]}

На страницата нищо не се вижда.

махнах проверката за име за тест само и ето отговора в конзолата:
Код:
array(3) {
  ["insert_row"]=>
  string(10) "insert_row"
  ["phone_val"]=>
  string(8) "13213213"
  ["name_val"]=>
  string(0) ""
}
Record added successfully{"success":true,"errors":[]}

btw това също продължава да хвърля същата грешка и така :)
Код:
for (var i = 0; i < response.errors.length; i++)
 
Защо не използвате това: http://stackoverflow.com/a/751387

като би трябвало response да ви го връща като вече json интерпретиран стринг.

Защото подозирам, че в момента грешката идва оттам, че response e стринг, на който се опитвате да му четете пропертите.

Ето за какво говоря:

$errors = [];
// ....
echo json_encode(['errors' => $errors, 'success' => empty($errors)]);

...

$.post(url, data, function (response) {
// сега вече response е json-decoded стринг
}, 'json'); //ето това тук казва на jquery да парсе стринга

И между другото, някъде изглежда имаш var_dump. Махни го, защото ще блокира парсването на outputa.
 
@anonimen това, което писахме трябва да работи. js-a ще провери какъв е хедъра и ще парсне резултата правилно.

@vinsbg Всъщност не си сложил хедъра да е application/json. Сега са "Content-Type:text/html; charset=utf-8"
 

Back
Горе