Отключить дату, когда текущее количество дат равно 8 в ajax, php, mysql - PullRequest
2 голосов
/ 17 июня 2020

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

<input type="date" name="mass_date" id="txtDate" required="required" /></div>

<script>  
         $(document).ready(function() {
            $('#txtDate').change(function(){
                var selectedDate = $(this).val();
                $.ajax({
                    type: 'GET',
                    url: "http://localhost/check_date.php?selectedDate=" +selectedDate, 
                    success: function(data) {
                        var status= JSON.parse(data);
                        if((status=="SUCCESS")) {
                            $('#submitButton').prop('disabled', false);
                        } else {
                            alert('Opps! Booking is not available for this day');
                        }
                    }
                });
            });
        });
    </script>

check_date. php

<?php 
    error_reporting(E_ALL);
    include_once "db.php";
    $selectedDate = $_GET['selectedDate'];

    $query2=mysqli_query($con,"SELECT COUNT(*) as booking_count FROM shrine_mass WHERE mass_date='$selectedDate'") or die(mysqli_error($con));
    $row=mysqli_fetch_array($query2,MYSQLI_ASSOC);
    $count = $row['booking_count'];
    if($count < 8) {
        echo json_encode("SUCCESS");

    } else {
        echo json_encode("FAIL");
    }

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Насколько я понимаю ваш вопрос, вы хотите, чтобы пользователь не вводил заданную дату после того, как она была выбрана 8 раз другими пользователями. Используя ответ @Martin, вы полностью отключите ввод даты, и я не думаю, что это то, что вам нужно. Я полагаю, вы ищете решение, которое предотвратило бы ввод «полностью забронированной» даты, но не ввода других дат.

Я не думаю, что вы можете остановить выбор любой даты в типе = "дата" INPUT. Существуют атрибуты для ограничения ввода диапазоном дат, но не для ограничения определенных дат из этого диапазона.

Таким образом, единственное возможное решение должно включать проверку недавно введенной даты по некоторым данным, чтобы определить, может ли она используемый. В настоящее время вы делаете это во время звонка ajax, и, честно говоря, если ваше приложение доступно для нескольких пользователей одновременно, это единственный жизнеспособный подход. Любые данные, которые вы можете передать браузеру при загрузке страницы, могут быть отображены «устаревшими» через несколько секунд действиями другого пользователя.

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

0 голосов
/ 17 июня 2020

РЕДАКТИРОВАТЬ: Прокрутите вниз!

ПРЕДУПРЕЖДЕНИЕ Вы широко открыты для SQL инъекций (атак SQLI). Пожалуйста, используйте Подготовленные операторы и параметризованные запросы .

С учетом сказанного, я буду переписывать вашу PHP страницу в соответствии с рекомендациями для подготовленных операторов и параметризованных запросов.

Что касается части вашего вопроса jQuery, я считаю, что вы ищете функцию property , .prop("disabled", true);. Вы уже использовали его для своего submitButton , за исключением того, что вы включаете кнопку, задав для свойства значение false .

jQuery Пример с использованием вашего кода :

 $(document).ready(function() {
    $('#txtDate').change(function(){
        var selectedDate = $(this).val();
        $.ajax({
            type: 'GET',
            url: "http://localhost/check_date.php?selectedDate=" +selectedDate, 
            success: function(data) {
                var status= JSON.parse(data);
                if((status=="SUCCESS")) {
                    $('#submitButton').prop('disabled', false);
                } else {
                    $('#txtDate').prop("disabled", true);
                }
            }
        });
    });
});

Ваша страница PHP с использованием Подготовленного оператора и параметризованного запроса:

<?php
// Your input GET variable
$selectedDate = $_GET['selectedDate'];

// DB variables
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if($conn->connect_error){
  die("Connection failed: " . $conn->connect_error);
}

// Declare the query
$sql = "SELECT COUNT(*) as booking_count FROM shrine_mass WHERE mass_date = ?";

// Prepare and bind
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $selectedDate);

// Execute the query
$stmt->execute();

// Bind result variable and fetch value
$stmt->bind_result($booking_count);
$stmt->fetch();

// Close connection
$stmt->close();
$conn->close();

if($booking_count < 8) {
    echo json_encode("SUCCESS");

} else {
    echo json_encode("FAIL");
}
?>

Пример фрагмента, отображающий .prop("disabled", true); в действии:

 $(document).ready(function() {
	$('#txtDate').prop("disabled", true);
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row d-flext justify-content-center">
	<div class="col-md-4">
		<input type="date" name="mass_date" id="txtDate" class="form-control" required="required" />
	</div>
</div>

Пример кода здесь .

РЕДАКТИРОВАТЬ:

Поскольку вы хотел отключить конкретную дату c, в частности, в зависимости от количества этой даты в вашей базе данных, тогда я бы рекомендовал использовать либо jQuery datepicker , либо Bootstrap datepicker . Я буду двигаться дальше, используя jQuery datepicker .

Подробнее о jQuery datepicker здесь .

Сначала вам нужно будет запросить вашу базу данных для дат, к которым применяется ваш logi c, т.е. когда дата встречается более 8 раз.

Пример:

SELECT
    mass_date
FROM
    mass_table
GROUP BY
    mass_date
HAVING
    COUNT(*) > 8;

DB Fiddle здесь .

Идея состоит в том, что вы создаете массив JavaScript, содержащий даты, которые вы хотите отключить. Затем вы хотите заполнить этот массив датами, соответствующими вашему logi c.

Вот как может выглядеть ваша главная страница:

<?php
// DB variables
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if($conn->connect_error){
  die("Connection failed: " . $conn->connect_error);
}

// Declare the query
$sql = "SELECT mass_date FROM mass_table GROUP BY mass_date HAVING COUNT(*) > 8";

// Prepare
$stmt = $conn->prepare($sql);

// Execute the query
$stmt->execute();

// Get result of query
$result = $stmt->get_result();

// Close connection
$stmt->close();
$conn->close();
?>

<script>
// The array containing the dates to be disabled in the datepicker
let disabledDates = [];

<?php
// Loop through our query results
while($data = $result->fetch_assoc()) {
    ?>
    // Push the dates into the disabledDates array
    disabledDates.push("<?php $data['mass_date']; ?>");
    <?php
}
?>

// jQuery datepicker function
$('#txtDate').datepicker({
    beforeShowDay: function(date){
        var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
        return [ disabledDates.indexOf(string) == -1 ]
    }
});
</script>

<div class="row d-flext justify-content-center">
    <div class="col-md-4">
        <input type="date" name="mass_date" id="txtDate" class="form-control" required="required" />
    </div>
</div>

Codepen Пример jQuery дат отключенных датпикера здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...