Ответ AJAX на дублирующуюся запись MYSQL

#php #jquery #mysql #ajax

#php #jquery #mysql #ajax

Вопрос:

Я добился того, что мой код работает хорошо, вводя информацию в базу данных, а затем отображая ее непосредственно в таблице, но я хотел добавить сообщение, чтобы показать, что могут быть возможные дубликаты.

Ниже приведен мой AJAX-код, который, как вы можете видеть, при «успешном выполнении» добавляет новую строку в конец. Однако это нарушается, если мой PHP-скрипт возвращает сообщение «дубликат найден», поскольку оно не соответствует схеме таблицы, поэтому, когда я отправляю новую запись, новая запись теперь не отображается в конце таблицы.

Я предполагаю, что это было бы как-то связано с вызовом json_encode для отправки ошибки обратно и запуска события, но я не могу найти много ссылок на его использование

По сути, то, что я хочу сделать, это запустить сообщение, чтобы оно не нарушало $(«.global_table tr:nth-last-child(2)»).after(ответ); часть, когда я добавляю еще одну строку. взгляните на booking.everythingcreative.co.uk для рабочего примера

 $("#insert_record").click(function (e) {
        e.preventDefault();
        if($("#insert_firstname").val()==='')
        {
            alert("Please enter firstname");
            return false;
        }
        if($("#insert_surname").val()==='')
        {
            alert("Please enter surname");
            return false;
        }
        if($("#insert_email").val()==='')
        {
            alert("Please enter email address");
            return false;
        }

        $("#insert_record").hide(); //hide submit button
        $(".global_loading").show(); //show loading image

        //var myData = 'content_txt='  $("#contentText").val(); //build a post data structure
        var firstname = $("#insert_firstname").val(); //build a post data structure
        var surname = $("#insert_surname").val(); //build a post data structure
        var email = $("#insert_email").val(); //build a post data structure
        var dates = $("#insert_dates").val(); //build a post data structure
        jQuery.ajax({
        type: "POST", // HTTP method POST or GET
        url: "assets/scripts/ajax.php", //Where to make Ajax calls
        dataType:"text", // Data type, HTML, json etc.
        data: {firstname: firstname, surname: surname, email: email, dates: dates}, //Form variables
        success:function(response){
            $(".global_table tr:nth-last-child(2)").after(response);
            $("#insert_firstname").val(''); //empty text field on successful
            $("#insert_surname").val(''); //empty text field on successful
            $("#insert_email").val(''); //empty text field on successful
            $("#insert_record").show(); //show submit button
            $(".global_loading").hide(); //hide loading image

        },
        error:function (xhr, ajaxOptions, thrownError){
            $("#insert_record").show(); //show submit button
            $(".global_loading").hide(); //hide loading image
            alert(thrownError);
        }
        });
});
  

Вот мой код ответа из моего PHP-скрипта, но он срабатывает как «успешный» для кода выше

 <div id="global_duplicate_container">
<div id="global_duplicate">
<div class="header">Duplicate Entry</div>
<table width="100%" border="0" cellpadding="0" class="global_table">
  <tr>
    <td>Candidate Information</td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_firstname"]; ?></td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_surname"]; ?></td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_email"]; ?></td>
  </tr>
  <tr>
    <td><?php echo date('l dS F, Y', strtotime($training_info['training_datetime'])) ?></td>
  </tr>
  <tr>
    <td><a class="button_live" href="#">More Infomation</a>amp;nbsp;amp;nbsp;<a class="button_live close_window" href="#">Close</a></td>
  </tr>
</table>
</div>
</div>
  

Редактировать:

Пока что это то, что происходит при отправке формы: — Используя AJAX, скрипт проверяет базу данных на предмет того, является ли запись дубликатом — Если он находит дубликат, скрипт должен сообщить пользователю о дубликате и остановить скрипт

Однако в настоящее время происходит следующее: — ajax.php скрипт отправляет обратно некоторый HTML, который javascript классифицирует как успешный, и код в виде дополнительной строки внизу, однако затем это прерывается при повторном запуске скрипта, поскольку теги теперь разбиты тегом.

Что мне нужно сделать, так это сообщить javascript, что форма не была успешной, и запустить div где-нибудь еще на странице, например, так:

  if($duplicate == true) { 
//tell hidden message to appear with details from php script
} else { //run standard ajax success code
  

Вот мой PHP:

 //Check that fields have been filled *NEEDS UPDATING*
if(isset($_POST["firstname"]) amp;amp; strlen($_POST["firstname"])>0) {

    //$contentToSave = filter_var($_POST["firstname"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); 
    $insert_datetime = date('Y-m-d H:i:s');
    $insert_training = filter_var($_POST["dates"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); 
    $insert_firstname = filter_var($_POST["firstname"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); 
    $insert_surname = filter_var($_POST["surname"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); 
    $insert_email = filter_var($_POST["email"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);

    //Check database for possible duplicate
    $database_check = mysqli_query($mysqli,"SELECT * FROM booking_customer WHERE customer_firstname='$insert_firstname' AND customer_surname='$insert_surname' AND customer_email='$insert_email'");
    $check_info = mysqli_fetch_assoc($database_check);
    $check_count = mysqli_num_rows($database_check);
    if($check_count >= 1) {

    // Connect to all training dates to attain training day
    $database_training = mysqli_query($mysqli,"SELECT * FROM training_dates WHERE training_id='$insert_training'");
    $training_info = mysqli_fetch_assoc($database_training);

        ?>
        <div id="global_duplicate_container">
<div id="global_duplicate">
<div class="header">Duplicate Entry</div>
<table width="100%" border="0" cellpadding="0" class="global_table">
  <tr>
    <td>Candidate Information</td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_firstname"]; ?></td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_surname"]; ?></td>
  </tr>
  <tr>
    <td><?php echo $check_info["customer_email"]; ?></td>
  </tr>
  <tr>
    <td><?php echo date('l dS F, Y', strtotime($training_info['training_datetime'])) ?></td>
  </tr>
  <tr>
    <td><a class="button_live" href="#">More Infomation</a>amp;nbsp;amp;nbsp;<a class="button_live close_window" href="#">Close</a></td>
  </tr>
</table>
</div>
</div>
<?php
        exit;

    } else {

    // Insert sanitize string in record
    $insert_row = $mysqli->query("INSERT INTO booking_customer(customer_added_datetime, customer_added_by, customer_training_table, customer_firstname, customer_surname, customer_email) VALUES('$insert_datetime', '0','$insert_training','$insert_firstname','$insert_surname','$insert_email')");

    if($insert_row)
    {

    // Connect to all training dates to attain training day
    $database_training = mysqli_query($mysqli,"SELECT * FROM training_dates WHERE training_id='$insert_training'");
    $training_info = mysqli_fetch_assoc($database_training);

    // Connect to customer details
    $database_customer = mysqli_query($mysqli,"SELECT * FROM booking_customer WHERE customer_firstname='$insert_firstname' AND customer_surname='$insert_surname' AND customer_email='$insert_email'");
    $customer_info = mysqli_fetch_assoc($database_customer);

         //Record was successfully inserted, respond result back to index page
          $my_id = $mysqli->insert_id; //Get ID of last inserted row from MySQL
   //echo "</tr>";
   echo "<tr id="customer_".$customer_info['customer_id']."">";
   echo "<td>".$insert_firstname."</td>";
   echo "<td>".$insert_surname."</td>";
   echo "<td>".$insert_email."</td>";
   echo "<td>".date('l dS F, Y', strtotime($training_info['training_datetime']))."</td>";
   echo "<td><a class="confirmation button_live" href="tcpdf/PDF/testPDF.php?id=".$customer_info['customer_id']."amp;version=email">Send Invitation</a></td>";
   echo "<td><a class="confirmation button_live" href="tcpdf/PDF/testPDF.php?id=".$customer_info['customer_id']."amp;version=download">Download</a></td>";
   echo "<td>???????</td>";
   echo "<td><a href="#" id="delete_".$customer_info['customer_id']."" class="button_delete">Remove</a></td>";

          $mysqli->close(); //close db connection

    }else{

        //header('HTTP/1.1 500 '.mysql_error()); //display sql errors.. must not output sql errors in live mode.
        header('HTTP/1.1 500 Looks like mysql error, could not insert record!');
        exit();
    }

    }

}
  

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

1. не совсем ясно, какова цель при обнаружении дубликата или что вы в данный момент возвращаете, когда это

2. Извините, что я хочу сделать, это запустить сообщение, чтобы оно не нарушало $(«.global_table tr:nth-last-child(2)»).after(ответ); часть, когда я добавляю еще одну строку. взгляните на booking.everythingcreative.co.uk для рабочего примера

3. следует обновить вопрос, чтобы он был понятен всем, а не просто комментарий

4. Я добавил комментарий

5. Все еще не совсем ясно, что именно должно произойти для дубликатов. Это следует уточнить подробнее. Что возвращается? что должно произойти в пользовательском интерфейсе?

Ответ №1:

Мне удалось решить эту проблему с помощью json_encode, как было предложено eithedog, используя следующий код

 success:function(response){
                var outcome = $.parseJSON(response);
                if(outcome['duplicate'] == "true") {
                    $('#duplicate_firstname').html(outcome['firstname']);
                    $('#duplicate_surname').html(outcome['surname']);
                    $('#duplicate_email').html(outcome['email']);
                    $('#duplicate_training_date').html(outcome['training']);
                    $("#global_duplicate_container").fadeIn();
                } else {
                    var record =    '<tr id="customer_'  outcome['id']  '">
                                    <td>'  outcome['firstname']  '</td>
                                    <td>'  outcome['surname']  '</td>
                                    <td>'  outcome['email']  '</td>
                                    <td>'  outcome['training']  '</td>
                                    <td><a class="confirmation button_live" href="tcpdf/PDF/testPDF.php?id='  outcome['id']  'amp;version=email">Send Invitation</a></td>
                                    <td><a class="confirmation button_live" href="tcpdf/PDF/testPDF.php?id='  outcome['id']  'amp;version=download">Download</a></td>
                                    <td>???????</td>
                                    <td><a href="#" id="delete_'  outcome['id']  '" class="button_delete">Remove</a></td>';
                    $(".global_table tr:nth-last-child(2)").after(record);
                }
            },