Как вызвать оповещение внутри AJAX с помощью jquery?

#javascript #php #jquery

Вопрос:

Я новичок в веб — разработке. Я довольно долго застрял в этой проблеме, связанной с вызовом предупреждения внутри моего AJAX. Все, что я хочу сделать, это показать предупреждение пользователю, если в моей базе данных не найдено записей. Мой код выглядит следующим образом:

Язык JavaScript:

 function get_types() {

    let $select = $("#colony_type");

    $.ajax({
      url: 'server.php',
      type: 'POST',
      data: { "input": "types",
              "name": $("#colony_name").val() }, 
      dataType: 'json',

      success: function(response) {
        let selectedValue = $select.val();
        let html = response.filter((e, i, a) => a.indexOf(e) === i).map(item => `<option value="${item}">${item}</option>`);
        $select.html(html).val(selectedValue);
      },

      complete: function() {}
    });
}
 

PHP:

 <?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');

    $server="localhost";
    $username="root";
    $pass="";

    $con=mysqli_connect($server,$username,$pass);
    $connection=mysqli_select_db($con,"electric billing system");

    if($_POST["input"] == "types"){

            if(!$connection)
                    echo "Connection to database failed! Please try again";
            else{
                    $codes=array();
                    $sql = "SELECT * from colony_master WHERE Colony_name='".$_POST["name"]."'";
                    $result = $con->query($sql);
                    if ($result->num_rows > 0) {
                            while($row = $result->fetch_assoc()) {
                                $code=$row["Colony_code"];
                            }
                            $sql = "SELECT * from quarter_master_entry WHERE Colony_code='".$code."'";
                            $result = $con->query($sql);
                            if ($result->num_rows > 0) {
                                while($row = $result->fetch_assoc()) {
                                    array_push($codes,$row["Qtr_type"]);
                                }
                                echo json_encode($codes);
                            }
                            else
                               echo "No colony type information found"; //I want to show this message as alert if no records are found
                            
                    }
                   
            }
        }

        $con->close();
 ?>
 

HTML:

 <p id="cln_type"><b>Type</b> :<br><select name="colony_type" id="colony_type" onclick="get_types()">
                <option value="default" selected="selected_type">Select your colony type</option>
</select></p>
 

Если я получаю пустой массив с сервера, то он должен показывать предупреждение. Как мне это сделать? Пожалуйста, помогите мне.


ПРАВКА: Я пытался показать предупреждающее сообщение, используя этот код в своем else заявлении на php, но все еще не работает:

 $message = "No colony type information found";
echo "<script type='text/javascript'>alert('$message');</script>";
 

Комментарии:

1. Вы никогда не получите пустой массив. Вы получите строку "No colony type information found"

2. Быстрое исправление: В success , if(typeof(response)=="string"){alert(response)}

3. В одном else квартале вам, вероятно, следует JSON.parse(response) это сделать …

4. Сложность здесь в том, что ваш запрос может оказаться в JSON или строке. Лучше исправьте серверную часть, чтобы она всегда выводила один и тот же тип ответа. Это первый шаг к тому, чтобы быть чистым.

Ответ №1:

Исправьте ответ на стороне сервера, чтобы он всегда отвечал с помощью jsonified массива

 if ($result->num_rows > 0) {
  while($row = $result->fetch_assoc()) {
    array_push($codes,$row["Qtr_type"]);
  }
  //echo json_encode($codes);
}else{
  $error=array();
  $error['error'] = "No colony type information found";
  array_push($codes,$error);
}
echo json_encode($codes);
 

Затем в «аяксе» success :

 success: function(response) {
  let selectedValue = $select.val();
  
  response = JSON.parse(response); // Possibly useless... Just as a note. 

  if(response.error){
    alert(response.error)
    return
  }
  
  let html = response.filter((e, i, a) => a.indexOf(e) === i).map(item => `<option value="${item}">${item}</option>`);
  $select.html(html).val(selectedValue);
},
 

Непроверено… Но вы должны понять суть. 😉

Комментарии:

1. Вероятно, потребуется присоединиться() к массиву html-строк. html() отлично работает с массивом элементов или объектами jq, но сомневаюсь, что он будет работать со строковым массивом без нежелательных ,

2. Мехх… Это просто предложение указать направление. Не идеальное решение. Поздняя субботняя вещь 😉

3. Это показывает ошибку: Unexpected token o in JSON at position 1 в строке response=JSON.parse(response);

4. Хорошо, тогда просто удалите эту строку. маркер o , безусловно, относится к o «объекту»… Поскольку вы указали dataType: 'json', , что Ajax уже выполнил синтаксический анализ. 😉

5. Теперь он отображается [Object object] , когда я нажимаю на него. Тем не менее, оповещения по-прежнему нет