Получить возвращаемое значение из php в ajax

#php #ajax #sweetalert #sweetalert2

Вопрос:

Я использую SweetAlert для подтверждения, и у меня возникли проблемы с получением возвращаемых данных с моего php на ajax

Вот что я делаю

мой серверный php

 //Add A voucher
public function AddVoucher ($voucher_name, $quantity, $discount) 
{
    try
    {
            $stmt2 = $this->db->prepare("SELECT * FROM vouchers WHERE voucher_name=:voucher_name");
            $stmt2->bindParam(":voucher_name", $voucher_name,PDO::PARAM_STR);
            $stmt2->execute();
            $stmt2->fetchAll(PDO::FETCH_ASSOC);

            if($stmt2->rowCount())
            {
                return "Failed";
            }
            else
            {
            $discount /= 100;
            //name doesn't exist so proceed to registration
            $stmt = $this->db->prepare("INSERT INTO vouchers (voucher_name,quantity,discount) 
            VALUES(:voucher_name, :quantity, :discount)");
            $stmt->bindParam(":voucher_name", $voucher_name,PDO::PARAM_STR);
            $stmt->bindParam(":quantity", $quantity,PDO::PARAM_STR);
            $stmt->bindParam(":discount", $discount,PDO::PARAM_INT);
            $stmt->execute();
    
            return $stmt;
        }
    }
    catch(PDOException $ex)
    {
        echo $ex->getMessage();
    }
}

 

моя модель php

 <?php
require_once '../database/database.php';

$voucher_name = $_POST['voucher_name'];
$quantity = $_POST['quantity'];
$discount = $_POST['discount'];

$result =  $user->AddVoucher($voucher_name,$quantity,$discount);

if($result == "Failed"):
    return false;
else:
    return true;
endif

?>
 

а теперь мой интерфейс, где существует мой ajax

 function SwalConfirm()
{
  
  Swal.fire({
    title: 'Are you sure?',
        text: "You will an a voucher . Do you wish to proceed",
        type: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#3085d6',
        cancelButtonColor: '#d33',
        confirmButtonText: 'Yes, Proceed',
        cancelButtonText: 'No, cancel!',
        confirmButtonClass: 'btn bg-gradient-primary w-30',
        cancelButtonClass: 'btn bg-gradient-secondary w-30',
        buttonsStyling: false,
        preConfirm: function()
        {
            return new Promise(function(resolve){
                $.ajax({
                    url: '../model/voucher_add.php',
                    type: 'POST',
                    data:
                    {
                        voucher_name: $('#a_voucher_name').val(),
                        quantity: $('#a_quantity').val(),
                        discount: $('#a_discount').val()
                        
                    },
                    success: function(data)
                    {
                      if(!data)
                      {
                        Swal.fire('Opps!', 'Voucher Name Already Exists. Please Edit the current voucher instead','warning').then(function(){
                          location.reload();
                        });
                      }
                      else
                      {
                        Swal.fire('Success!', 'You have successfully added a voucher.','success').then(function(){
                            location.reload();
                        });
                      }
                    }
                })
                // .done(function(response)
                // {
                      // Swal.fire('Opps!', 'Voucher Name Already Exists. Please Edit the current voucher instead','warning').then(function(){
                      //     location.reload();
                      // });
                // })
                .fail(function(){
                    Swal.fire('Oppss!', 'There was something wrong declining this request.','success')
                })
            });
        }
  });
}

 

Что я пытаюсь здесь сделать, так это то, что если текущий ваучер уже существует, то не продолжайте и не показывайте сообщение об ошибке, используя sweetalert вместо сообщения об успешном выполнении

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

1. используя return wont ничего не делать, вам нужно повторить 1 или 0 или ответить с помощью json и настроить вызов ajax для обработки с помощью dataType: 'json'

2. также имейте в виду, echo $ex->getMessage(); что это приведет к его разрыву или будет выглядеть как true, функция не должна перехватывать эхо и возвращать значение null, вместо этого она всегда должна возвращать значение true или false, массив нового ваучера или пустой массив. Вы можете перехватить брошенное исключение при его вызове.

3. нп, не знаю, я не вижу никаких проблем с вашим вопросом

4. Не могли бы вы записать свой ответ? На самом деле это было решено сейчас только echo '0'; за неудачу

Ответ №1:

Для тех, кто может столкнуться с подобной проблемой, решение этой проблемы заключается именно в этом

 
if($stmt2->rowCount())
{
    echo "0";
}

 

тогда поймай его на себе, аякс, вот так

 if(data == 0)
{
    Swal.fire('Opps!', 'Voucher Name Already Exists. Please Edit the current voucher instead','warning').then(function(){
        location.reload();
     });
}

 

просто что-то в этом роде . Но также следуйте тому, что сказал Лоуренс о том, как поймать нуль

Ответ №2:

Модель php:

 <?php

require_once '../database/database.php';

$voucher_name = $_POST['voucher_name'];
$quantity = $_POST['quantity'];
$discount = $_POST['discount'];

$result =  $user->AddVoucher($voucher_name,$quantity,$discount);

if($result == "Failed"):
    return json_encode(false);
else:
    return json_encode(true);
endif

?>
 

Он вернет результат json_encoded в ajax