Вставка записей из формы в базу данных через jQuery-AJAX

Статус
Закрыто для дальнейших ответов.

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Добрый день! Я пишу сайт для стоматологического кабинета. Есть форма для записи пациента к врачу, и нужно вставить пациента и дату приёма, а при отправке формы вывести модальное окно с ответом от сервера. У меня вопрос: почему мой файл PHP не смог считать номер телефона пациента, его e-mail, а также дату и время приёма и сослался на ошибки:

Notice: Undefined index: phone_number in C:\xampp\htdocs\stomkab\insert.php on line 10

Notice: Undefined index: email in C:\xampp\htdocs\stomkab\insert.php on line 11

Notice: Undefined index: appointment_date in C:\xampp\htdocs\stomkab\insert.php on line 16

Notice: Undefined index: appointment_time


Почему данные из этих полей не ушли на сервер? Я перепроверил названия полей в атрибуте name и индексы элементов массива POST, на вид они совпадают, но почему при пересылке данных из этих полей пошли ошибки? Сможете указать ошибки в моём коде и в комментариях предложить возможные варианты решения?

Файл stomkab-main.html

<div class="page-wrapper">
<!--Тело сайта-->
<div class="container" id="yak1">
<form id="InsertForm" action="#" method="POST" class="checkout">
<div class="checkout-header">
<h1 class="checkout-title">

Записаться на приём
<span class="checkout-price">GO!</span>

</h1>

</div>
<p>
<input type="text" name="surname" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Фамилия" title="Введите фамилию на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="name" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Имя" title="Введите имя на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="patronymic" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{7,30}" placeholder="Отчество" title="Введите отчество на русском языке, от 7 до 30 символов" maxlength="30" required>
<input type="tel" name="phone_number" size="30" class="checkout-input checkout-name" pattern="\+([0-9]{1,3})(\([0-9]{2,5}\))([0-9]{5,7})" placeholder="Номер телефона" title="Введите номер телефона в формате +<код страны>(<код региона/оператора>)<номер телефона>. Код страны содержит от 1 до 3 цифр, код региона/оператора - от 2 до 5 цифр, а номер телефона - от 5 ддо 7 цифр" maxlength="30" required>
</p>

<p>

<input type="email" name="email" size="80" class="checkout-input checkout-name" pattern="([A-z0-9_.-]{1,})@([A-z0-9_.-]{1,}).([A-z]{2,8})" placeholder="mail@example.com" maxlength="80" required>

<select name="med_spec" id="med_spec" class="checkout-input checkout-name" required>
<option value="0">Выберите область медицины</option>
<option value="1">Терапия</option>
<option value="2">Хирургия</option>
<option value="3">Ортопедия</option>
<option value="4">Ортодонтия</option>
<option value="5">Пародонтология</option>
</select>

<select name="services" id="services" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите услугу</option>
</select>

<select name="doctors" id="doctors" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите врача</option>
</select>

</p>

<p>
<input type="date" name="appointment_date" class="checkout-input checkout-name" min="1920-01-01" max="2075-01-01" placeholder="Дата приёма" required>
<input type="time" name="appointment_time" class="checkout-input checkout-name" min="8:00" max="20:00" placeholder="Время приёма" list="time-list" required>
<datalist id="time-list">
<option value="08:00">
<option value="08:49">
<option value="09:38">
<option value="10:27">
<option value="11:16">
<option value="12:05">
<option value="13:43">
<option value="14:32">
<option value="15:21">
<option value="16:10">
<option value="16:59">
<option value="17:48">
<option value="19:26">
</datalist>
</p>

<p>
<input type="submit" value="Записаться" class="checkout-btn">

</p>

</form>
</div>
<!--Тело сайта-->
</div>
<!--Модальное окно-->
<div class="modal-wrapper">

<div class="modal">

<div class="head">

<a class="btn-close trigger" href="#">

<i class="fa fa-times" aria-hidden="true"></i>

</a>

</div>

<div class="content">

<div class="good-job">

<i class="fa fa-thumbs-o-up" aria-hidden="true"></i>

<h1></h1>

</div>

</div>

</div>

</div>

Файл selects.js

$(document).ready(function () {
$('#med_spec').change(function () {
var med_spec = $(this).val();
if (med_spec == '0') {
$('#services').html('<option>Выберите услугу</option>');
$('#services').attr('disabled', true);
$('#doctors').html('<option>Выберите врача</option>');
$('#doctors').attr('disabled', true);
return(false);
}
$('#services').attr('disabled', true);
$('#services').html('<option>Загрузка...</option>');

var url = 'get_services.php';

$.post(
url,
"med_spec=" + med_spec,
function (result) {
if (result.type == 'error') {
alert('Ошибка!');
return(false);
}
else {
var options = '';

$(result.services).each(function() {
options += '<option value="' + $(this).attr('service_id') + '">' + $(this).attr('service_name') + '</option>';
});

$('#services').html('<option value="0">Выберите услугу</option>'+options);
$('#services').attr('disabled', false);
$('#doctors').html('<option>Выберите врача</option>');
$('#doctors').attr('disabled', true);

}
},
"json"
);
});

$('#services').change(function () {
var med_spec = $('#med_spec').val();
var services = $(this).val();
if (services == '0') {
$('#doctors').html('<option>Выберите врача</option>');
$('#doctors').attr('disabled', true);
return(false);
}
$('#doctors').attr('disabled', true);
$('#doctors').html('<option>Загрузка...</option>');

var url = 'get_doctor.php';

$.post(
url,
"med_spec=" + med_spec,

function (result) {
if (result.type == 'error') {
alert('Ошибка!');
return(false);
}
else {
var options = '';
$(result.doctors).each(function() {
options += '<option value="' + $(this).attr('doctor_id') + '">' + $(this).attr('doctor_surname') + ', ' + $(this).attr('doctor_name') + '</option>';

});
$('#doctors').html('<option value="0">Выберите врача</option>'+options);
$('#doctors').attr('disabled', false);
}
},
"json"
);
});

$('#InsertForm').submit(function(e) {
e.preventDefault();
$.ajax({
type: $(this).attr('method'),
url: 'insert.php',
data: $(this).serialize(),
success: function(result){
$('.modal-wrapper').toggleClass('open');

$('.page-wrapper').toggleClass('blur-it');

$('div.modal-wrapper > div.modal > div.content > div.good-job > h1').html(result);
return false;
}
});
});
});

Файл insert.php

Код:
<?php
include_once 'connect.php';
if (!empty($_POST)) {
$familija=$_POST['surname'];
$familija = str_replace(' ', '', $familija);
$imja=$_POST['name'];
$imja = str_replace(' ' ,'', $imja);
$otchestvo=$_POST['patronymic'];
$otchestvo = str_replace(' ' ,'', $otchestvo);
$phone=$_POST['phone_number'];
$e_mail=$_POST['email'];
$e_mail = str_replace(' ', '', $e_mail);
$medspec_id = @intval($_POST['med_spec']);
$services = @intval($_POST['services']);
$doctors = @intval($_POST['doctors']);
$date=$_POST['appointment_date'];
$time=$_POST['appointment_time'];
$time_query=mysqli_query($link, "SELECT * FROM appointment WHERE date = $date AND time = $time");
if (strcmp($date, date("Y-m-d")) < 0) {
    echo 'Ошибка ввода даты!';
} elseif (((strcmp($date, date("Y-m-d")) === 0) && (strcmp($time, date("H:i")) <= 0)) || (strcmp($time, "08:00") < 0) || (strcmp($time, "20:00") >= 0)) {
    echo 'Ошибка ввода времени!';
} elseif ((date("l") == "Saturday") && (strcmp($time, "17:00") >= 0)) {
    echo 'Извините, но в этот день приём до 17:00!';
} elseif (date("l") == "Sunday") {
    echo 'Извините, но сегодня выходной день!';
} elseif (mysqli_num_rows($time_query) > 0) {
    echo 'Приём в указанные дату и время уже назначен!';
} else {
$regs=mysqli_query($link, "SELECT MAX(patient_id) AS pat_max FROM patient");
if (mysqli_num_rows($regs) != 0) {
    $row = mysqli_fetch_assoc($regs);
    $new_pat_id = $row['pat_max'] + 1;
} else {
    $new_pat_id = 0;
}
$pat_ins=mysqli_query($link, "INSERT INTO patient VALUES ($new_pat_id, $familija, $imja, $otchestvo, $phone, $e_mail)");
if($pat_ins) {
    echo 'Запись прошла успешно!'.'<br />';
} else {
    echo 'Ошибка в запросе!';
}
$app_regs=mysqli_query($link, "SELECT MAX(appointment_id) AS app_max FROM appointment");
if (mysqli_num_rows($app_regs) != 0) {
    $app_row = mysqli_fetch_assoc($app_regs);
    $new_app_id = $app_row['app_max'] + 1;
} else {
    $new_app_id = 0;
}
$app_ins=mysqli_query($link, "INSERT INTO appointment VALUES ($new_app_id, $new_pat_id, $doctors, $date, $time, $services)");
if($pat_ins) {
    $price_query=mysqli_query($link, "SELECT price FROM service WHERE service_id=$services");
    $price_row = mysqli_fetch_assoc($price_query);
    $price = $price_row['price'];
    echo 'Цена за обслуживание составляет '.$price.' рублей';
} else {
    echo 'Ошибка в запросе!';
}
}
} else {
echo 'Данные не получены!';
}
?>
 

Вложения

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
831
В таком длинном коде навряд ли кто-то будет разбираться. Попробуйте убрать не относящееся к проблеме.
Это не ошибки, а информация о попытке использовать необъявленные переменные $_POST['phone_number'] и др.
 

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Я уже даже переименовал поля формы и индексы элементов массива POST, не помогло, всё те же ошибки выскакивают. Предложите пожалуйста другие варианты решения этой проблемы. Как вписать эти недостающие 4 поля? Переменные были объявлены, в PHP они объявляются автоматически, не надо предварительно писать char phone, char date, char time.

<form id="InsertForm" action="#" method="POST" class="checkout">
<div class="checkout-header">
<h1 class="checkout-title">

Записаться на приём
<span class="checkout-price">GO!</span>

</h1>

</div>
<p>
<input type="text" name="surname" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Фамилия" title="Введите фамилию на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="name" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Имя" title="Введите имя на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="patronymic" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{7,30}" placeholder="Отчество" title="Введите отчество на русском языке, от 7 до 30 символов" maxlength="30" required>
<input type="tel" name="nomer_telefona" size="30" class="checkout-input checkout-name" pattern="\+([0-9]{1,3})(\([0-9]{2,5}\))([0-9]{5,7})" placeholder="Номер телефона" title="Введите номер телефона в формате +<код страны>(<код региона/оператора>)<номер телефона>. Код страны содержит от 1 до 3 цифр, код региона/оператора - от 2 до 5 цифр, а номер телефона - от 5 ддо 7 цифр" maxlength="30" required>
</p>

<p>

<input type="email" name="pochta" size="80" class="checkout-input checkout-name" pattern="([A-z0-9_.-]{1,})@([A-z0-9_.-]{1,}).([A-z]{2,8})" placeholder="mail@example.com" maxlength="80" required>

<select name="med_spec" id="med_spec" class="checkout-input checkout-name" required>
<option value="0">Выберите область медицины</option>
<option value="1">Терапия</option>
<option value="2">Хирургия</option>
<option value="3">Ортопедия</option>
<option value="4">Ортодонтия</option>
<option value="5">Пародонтология</option>
</select>

<select name="services" id="services" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите услугу</option>
</select>

<select name="doctors" id="doctors" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите врача</option>
</select>

</p>

<p>
<input type="date" name="data_priema" class="checkout-input checkout-name" min="1920-01-01" max="2075-01-01" placeholder="Дата приёма" required>
<input type="time" name="vremya_priema" class="checkout-input checkout-name" min="8:00" max="20:00" placeholder="Время приёма" list="time-list" required>
<datalist id="time-list">
<option value="08:00">
<option value="08:49">
<option value="09:38">
<option value="10:27">
<option value="11:16">
<option value="12:05">
<option value="13:43">
<option value="14:32">
<option value="15:21">
<option value="16:10">
<option value="16:59">
<option value="17:48">
<option value="19:26">
</datalist>
</p>

<p>
<input type="submit" value="Записаться" class="checkout-btn">

</p>

</form>

Код:
$familija=$_POST['surname'];
$familija = str_replace(' ', '', $familija);
$imja=$_POST['name'];
$imja = str_replace(' ' ,'', $imja);
$otchestvo=$_POST['patronymic'];
$otchestvo = str_replace(' ' ,'', $otchestvo);
$phone=$_POST['nomer_telefona'];
$e_mail=$_POST['pochta'];
$e_mail = str_replace(' ', '', $e_mail);
$medspec_id = @intval($_POST['med_spec']);
$services = @intval($_POST['services']);
$doctors = @intval($_POST['doctors']);
$date=$_POST['data_priema'];
$time=$_POST['vremya_priema'];
Как принудительно объявить эти переменные?

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

Вложения

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
831
VladimirBuzin сказал(а):
в PHP они объявляются автоматически
Какие элементы из формы придут, такие элементы массива $_POST автоматом объявятся. Если ничего не придёт, то и массива $_POST не будет совсем.

Можно делать как-то так:
if (isset($_POST['name'])) $name = $_POST['name']: else $name = ''; // две одинарные кавычки

И ещё посмотрите в справочнике про типы input, например для тех, с которыми проблема:
<input type="tel" name="phone_number"
<input type="email" name="email"
<input type="date" name="appointment_date"
<input type="time" name="appointment_time"
 

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Добрый вечер! Оказывается, плагин jQuery, который установлен на моём сайте, не поддерживает атрибуты тега input из HTML5. Заменил на "text" и навесил паттерны, и всё заработало.



<p>
<input type="text" name="surname" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Фамилия" title="Введите фамилию на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="name" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Имя" title="Введите имя на русском языке, от 2 до 30 символов" maxlength="30" required>
<input type="text" name="patronymic" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{7,30}" placeholder="Отчество" title="Введите отчество на русском языке, от 7 до 30 символов" maxlength="30" required>
<input type="text" name="nomer_telefona" size="30" class="checkout-input checkout-name" pattern="\+([0-9]{1,3})(\([0-9]{2,5}\))([0-9]{5,7})" placeholder="Номер телефона" title="Введите номер телефона в формате +<код страны>(<код региона/оператора>)<номер телефона>. Код страны содержит от 1 до 3 цифр, код региона/оператора - от 2 до 5 цифр, а номер телефона - от 5 до 7 цифр" maxlength="30" required>
</p>

<p>

<input type="text" name="pochta" size="80" class="checkout-input checkout-name" pattern="([A-z0-9_.-]{1,})@([A-z0-9_.-]{1,}).([A-z]{2,8})" placeholder="E-mail" title="Введите адрес электронной почты в формате <имя_пользователя>@<Название_сайта>.<домен_государства>. Имя пользователя и название сайта содержат не менее 1 символа, а домен государства - от 2 до 8 букв" maxlength="80" required>

<select name="med_spec" id="med_spec" class="checkout-input checkout-name" required>
<option value="0">Выберите область медицины</option>
<option value="1">Терапия</option>
<option value="2">Хирургия</option>
<option value="3">Ортопедия</option>
<option value="4">Ортодонтия</option>
<option value="5">Пародонтология</option>
</select>

<select name="services" id="services" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите услугу</option>
</select>

<select name="doctors" id="doctors" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите врача</option>
</select>

</p>

<p>
<input type="text" name="data_priema" class="checkout-input checkout-name" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}" placeholder="Дата приёма" title="Введите дату приёма пациента в формате <ГГГГ>-<ММ>-<ДД>" maxlength="10" required>
<select name="vremya_priema" class="checkout-input checkout-name" required>
<option>Выберите время приёма</option>
<option value="08:00">8:00</option>
<option value="08:49">8:49</option>
<option value="09:38">9:38</option>
<option value="10:27">10:27</option>
<option value="11:16">11:16</option>
<option value="12:05">12:05</option>
<option value="13:43">13:43</option>
<option value="14:32">14:32</option>
<option value="15:21">15:21</option>
<option value="16:10">16:10</option>
<option value="16:59">16:59</option>
<option value="17:48">17:48</option>
<option value="19:26">19:26</option>
</select>

</p>

<p>
<input type="submit" value="Записаться" class="checkout-btn">
</p>


Но, избавившись от первого "камня преткновения", я получил две другие ошибки:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\stomkab\insert.php on line 28

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\stomkab\insert.php on line 32

В чём могут быть проблемы с функцией mysqli_num_rows?

<?php
include_once 'connect.php';
if (!empty($_POST)) {
$familija=$_POST['surname'];
$familija = str_replace(' ', '', $familija);
$imja=$_POST['name'];
$imja = str_replace(' ' ,'', $imja);
$otchestvo=$_POST['patronymic'];
$otchestvo = str_replace(' ' ,'', $otchestvo);
$phone=$_POST['nomer_telefona'];
$phone = str_replace(' ', '', $phone);
$e_mail=$_POST['pochta'];
$e_mail = str_replace(' ', '', $e_mail);
$medspec_id = @intval($_POST['med_spec']);
$services = @intval($_POST['services']);
$doctors = @intval($_POST['doctors']);
$date=$_POST['data_priema'];
$time=$_POST['vremya_priema'];
$time_query=mysqli_query($link, "SELECT * FROM appointment WHERE date = $date AND time = $time");
if (strcmp($date, date("Y-m-d")) < 0) {
echo 'Ошибка ввода даты!';
} elseif (((strcmp($date, date("Y-m-d")) === 0) && (strcmp($time, date("H:i")) <= 0)) || (strcmp($time, "08:00") < 0) || (strcmp($time, "20:00") >= 0)) {
echo 'Ошибка ввода времени!';
} elseif ((date("l", strtotime($date)) == "Saturday") && (strcmp($time, "17:00") >= 0)) {
echo 'Извините, но в этот день приём до 17:00!';
} elseif (date("l", strtotime($date)) == "Sunday") {
echo 'Извините, но этот день - выходной!';
} elseif (mysqli_num_rows($time_query) > 0) {
echo 'Приём в указанные дату и время уже назначен!';
} else {
$regs=mysqli_query($link, "SELECT MAX(patient_id) AS pat_max FROM patient");
if (mysqli_num_rows($regs) != 0) {
$row = mysqli_fetch_assoc($regs);
$new_pat_id = $row['pat_max'] + 1;
} else {
$new_pat_id = 0;
}
$pat_ins=mysqli_query($link, "INSERT INTO patient VALUES ($new_pat_id, $familija, $imja, $otchestvo, $phone, $e_mail)");
if($pat_ins) {
echo 'Ваши личные данные сохранены!'.'<br />';
} else {
echo 'Ошибка! Некорректный ввод личных данных!'.'<br />';
}
$app_regs=mysqli_query($link, "SELECT MAX(appointment_id) AS app_max FROM appointment");
if (mysqli_num_rows($app_regs) != 0) {
$app_row = mysqli_fetch_assoc($app_regs);
$new_app_id = $app_row['app_max'] + 1;
} else {
$new_app_id = 0;
}
$app_ins=mysqli_query($link, "INSERT INTO appointment VALUES ($new_app_id, $new_pat_id, $doctors, $date, $time, $services)");
if($pat_ins) {
$price_query=mysqli_query($link, "SELECT price FROM service WHERE service_id=$services");
$price_row = mysqli_fetch_assoc($price_query);
$price = $price_row['price'];
echo 'Запись на приём оформлена!'.'<br />'.'Ваша цена составляет '.$price.' рублей';
} else {
echo 'Ошибка! Некорректный ввод данных о приёме!';
}
}
} else {
echo 'Данные не получены!';
}
?>

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

Есть ли эквиваленты mysqli_num_rows? Единственный вариант - переделать весь сайт в PDO, но я боюсь к сентябрю все долги не закрыть.

connect.php

<?php
$host='localhost'; //Хост
$db='stomat'; //Имя БД
$user_mysql='root'; //Имя пользователя БД
$pass_mysql=''; //Пароль пользователя БД
$link = mysqli_connect($host, $user_mysql, $pass_mysql, $db) or die("<center><h1>Подключение не удалось!</h1></center>");
mysqli_query($link, "set character_set_client='utf8'");
mysqli_query($link, "set character_set_results='utf8'");
mysqli_query($link, "set collation_connection='utf8_general_ci'");
?>

Вот рисунок:
 

Вложения

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
831
Попробуйте строку if (mysqli_num_rows($regs) != 0) {
заменить на if (mysqli_num_rows($regs) !== 0) {
или на if (mysqli_num_rows($regs) > 0) {
но это метод "тыка на угад".
Хорошо бы проверить что возвращает mysqli_query($link, "SELECT MAX(patient_id) AS pat_max FROM patient");
 

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Скорее всего, такое может быть, при передаче даты или времени, если кто-то введёт месяц больше 12 или число больше 31, а также часы больше 23 или минуты больше 59. Но я всё вводил правильно, на дату наложил паттерн для формата ГГГГ-ММ-ДД, а время сделал выпадающим списком:

<input type="text" name="data_priema" class="checkout-input checkout-name" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}" placeholder="Дата приёма" title="Введите дату приёма пациента в формате <ГГГГ>-<ММ>-<ДД> без пробелов" maxlength="10" required>
<select name="vremya_priema" class="checkout-input checkout-name" required>
<option>Выберите время приёма</option>
<option value="08:00">8:00</option>
<option value="08:49">8:49</option>
<option value="09:38">9:38</option>
<option value="10:27">10:27</option>
<option value="11:16">11:16</option>
<option value="12:05">12:05</option>
<option value="13:43">13:43</option>
<option value="14:32">14:32</option>
<option value="15:21">15:21</option>
<option value="16:10">16:10</option>
<option value="16:59">16:59</option>
<option value="17:48">17:48</option>
<option value="19:26">19:26</option>
</select>


Попытался выводить, сработал ли запрос или нет, но сервер почему-то стал ругаться на echo. Как мне по-другому узнать, свободны ли день и время приёма, или пациент уже записан? Какие версии jQuery уже поддерживают атрибуты HTML5 для INPUT?

$time_query=mysqli_query($link, "SELECT * FROM appointment WHERE date = $date AND time = $time");
f($time_query) {echo "TRUE";} else {echo "FALSE";}
if (strcmp($date, date("Y-m-d")) < 0) {
echo 'Ошибка ввода даты!';
} elseif (((strcmp($date, date("Y-m-d")) === 0) && (strcmp($time, date("H:i")) <= 0)) || (strcmp($time, "08:00") < 0) || (strcmp($time, "20:00") >= 0)) {
echo 'Ошибка ввода времени!';
} elseif ((date("l", strtotime($date)) == "Saturday") && (strcmp($time, "17:00") >= 0)) {
echo 'Извините, но в этот день приём до 17:00!';
} elseif (date("l", strtotime($date)) == "Sunday") {
echo 'Извините, но этот день - выходной!';
} elseif (mysqli_num_rows($time_query) > 0) {
echo 'Приём в указанные дату и время уже назначен!';
}


Сам того не заметя, я "запоролся" на условном операторе, но всё равно, Вы не знаете, какие версии jQuery поддерживают INPUT-TYPE для HTML5, чтобы не было проблем с датой и временем приёма пациента?

Первый запрос действительно не выполнился из-за ошибки в этих двух инпутах:

$time_query=mysqli_query($link, "SELECT * FROM appointment WHERE date = $date AND time = $time");
if($time_query) {echo "TRUE";} else {echo "FALSE";}
if (strcmp($date, date("Y-m-d")) < 0) {
echo 'Ошибка ввода даты!';
} elseif (((strcmp($date, date("Y-m-d")) === 0) && (strcmp($time, date("H:i")) <= 0)) || (strcmp($time, "08:00") < 0) || (strcmp($time, "20:00") >= 0)) {
echo 'Ошибка ввода времени!';
} elseif ((date("l", strtotime($date)) == "Saturday") && (strcmp($time, "17:00") >= 0)) {
echo 'Извините, но в этот день приём до 17:00!';
} elseif (date("l", strtotime($date)) == "Sunday") {
echo 'Извините, но этот день - выходной!';
} elseif (mysqli_num_rows($time_query) > 0) {
echo 'Приём в указанные дату и время уже назначен!';
}

Со всеми ли версиями jQuery такие же проблемы, и какие версии уже перешли на html5?
 

Вложения

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Я подключил jQuery 3.3.1 через CDN и вернул все атрибуты INPUT-TYPE обратно, но проблемы возникли со связанными выпадающими списками, где я использовал метод $.post(). Я слышал что в третьих версиях jQuery изменилась сигнатура:
$.post([settings]);
Как использовать метод $.post() в версиях 3.1.1 и выше? Или параметры нужно передавать в виде массива, а не в виде строки? А jQuery 2.2.4 уже поддерживает HTML5?

Как скачать jQuery? Я использовал IE-11, но при нажатии на ссылку он всего лишь выдал код, а загрузка файла не началась. У Вас есть архивы jquery-3.3.1-min.zip?
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
VladimirBuzin сказал(а):
У Вас есть архивы jquery-3.3.1-min.zip?
Скачать именно 3.3.1 можно на оф.сайте
Если откроется код, то можно сделать "сохранить как" и сохранить под нужным названием, с расширением JS, после чего можно будет подключить его в проект.
Или даже можно указать путь до их файла

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

VladimirBuzin сказал(а):
А jQuery 2.2.4 уже поддерживает HTML5?
Вообще даже для jQ первой ветки всё это не проблема - читать INPUT. Он был ещё до JQuery.
Вероятно вы не так читаете.

Самая простая отладка пост запросов:
На стороне сервера, где принимается и обрабатывается ПОСТ можно сделать

print_r($_POST);
А на стороне клиента, в ответе на пост написать:

...
success: function(result){
console.log(result)
}
...
И смотреть что придёт в консоли браузера, так будет видно, что приходит на сервер.

VladimirBuzin сказал(а):
Скорее всего, такое может быть, при передаче даты или времени
Дату надо передавать в полном формате, типа 2004-02-12T15:19:21+00:00 и в запросе SQL уже конвертировать в необходимый формат: DATETIME, DATE и TIMESTAMP, в зависимости от формата колонки.
 

VladimirBuzin

Member
Регистрация
18.03.2018
Сообщения
19
Наконец-то переход на PDO решил все проблемы:

connect_pdo.php

<?php
$host='localhost';
$db='stomat';
$user_mysql='root';
$pass_mysql='';
try {
$connection = new PDO("mysql:host=$host;dbname=$db", $user_mysql, $pass_mysql);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $connection->query("set character_set_client='utf8'");
$statement = $connection->query("set character_set_results='utf8'");
$statement = $connection->query("set collation_connection='utf8_general_ci'");
} catch (PDOException $e) {
die( 'Ошибка! Всё. Приехали... '.$e->getMessage() );
}
?>

insert.php

<?php
include_once 'connect_pdo.php';
if (!empty($_POST)) {
$familija=$_POST['surname'];
$familija = str_replace(' ', '', $familija);
$imja=$_POST['name'];
$imja = str_replace(' ' ,'', $imja);
$otchestvo=$_POST['patronymic'];
$otchestvo = str_replace(' ' ,'', $otchestvo);
$phone=$_POST['nomer_telefona'];
$phone = str_replace(' ', '', $phone);
$e_mail=$_POST['pochta'];
$e_mail = str_replace(' ', '', $e_mail);
$services = @intval($_POST['services']);
$doctors = @intval($_POST['doctors']);
$date=@date("Y-m-d", strtotime($_POST['data_priema'])) or die("Ошибка! Некорректный ввод даты приёма!");
$time=@date("H:i", strtotime($_POST['vremya_priema'])) or die("Ошибка! Некорректный ввод времени приёма!");
$statement = $connection->prepare("SELECT COUNT(*) FROM appointment WHERE date = :date_of_appointment AND time = :time_of_appointment");
$statement->bindParam(':date_of_appointment', $date);
$statement->bindParam(':time_of_appointment', $time);
$statement->execute();
if (strcmp($date, date("Y-m-d")) < 0) {
echo 'Ошибка ввода даты!';
} elseif (((strcmp($date, date("Y-m-d")) === 0) && (strcmp($time, date("H:i")) <= 0)) || (strcmp($time, "08:00") < 0) || (strcmp($time, "20:00") >= 0)) {
echo 'Ошибка ввода времени!';
} elseif ((date("l", strtotime($date)) == "Saturday") && (strcmp($time, "17:00") >= 0)) {
echo 'Извините, но в этот день приём до 17:00!';
} elseif (date("l", strtotime($date)) == "Sunday") {
echo 'Извините, но этот день - выходной!';
} elseif ($statement->fetchColumn() > 0) {
echo 'Приём в указанные дату и время уже назначен!';
} else {
$statement = $connection->query('SELECT COUNT(*) FROM patient');
$new_pat_id = $statement->fetchColumn() + 1;
$statement = $connection->prepare("INSERT INTO patient VALUES :)patnum, :lastname, :firstname, :eek:tchestvo, :telephone, :pozhta)");
$statement->bindParam(':patnum', $new_pat_id);
$statement->bindParam(':lastname', $familija);
$statement->bindParam(':firstname', $imja);
$statement->bindParam(':eek:tchestvo', $otchestvo);
$statement->bindParam(':telephone', $phone);
$statement->bindParam(':pozhta', $e_mail);
$statement->execute();
if($statement->rowCount() > 0) {
echo 'Ваши личные данные сохранены!'.'<br />';
} else {
echo 'Ошибка! Некорректный ввод личных данных!'.'<br />';
}
$statement = $connection->query('SELECT COUNT(*) FROM appointment');
$new_app_id = $statement->fetchColumn() + 1;
$statement = $connection->prepare("INSERT INTO appointment VALUES :)id_app, :id_pat, :id_doc, :date_of_appointment, :time_of_appointment, :usluga)");
$statement->bindParam(':id_app', $new_app_id);
$statement->bindParam(':id_pat', $new_pat_id);
$statement->bindParam(':id_doc', $doctors);
$statement->bindParam(':date_of_appointment', $date);
$statement->bindParam(':time_of_appointment', $time);
$statement->bindParam(':usluga', $services);
$statement->execute();
if($statement->rowCount() > 0) {
$statement = $connection->prepare("SELECT price FROM service WHERE service_id = :services");
$statement->bindParam(':services', $services);
$statement->execute();
$price_row = $statement->fetch(PDO::FETCH_ASSOC);
$price = $price_row['price'];
echo 'Запись на приём оформлена!'.'<br />'.'Ваша цена составляет '.$price.' рублей';
} else {
echo 'Ошибка! Некорректный ввод данных о приёме!';
}
}
} else {
echo 'Данные не получены!';
}
?>

stomkab-main.html

<form id="InsertForm" action="#" method="POST" class="checkout">
<div class="checkout-header">
<h1 class="checkout-title">

Записаться на приём
<span class="checkout-price">GO!</span>

</h1>

</div>
<p>
<input type="text" name="surname" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Фамилия" title="Введите фамилию на русском языке, от 2 до 30 букв без пробелов" maxlength="30" required>
<input type="text" name="name" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{2,30}" placeholder="Имя" title="Введите имя на русском языке, от 2 до 30 букв без пробелов" maxlength="30" required>
<input type="text" name="patronymic" size="30" class="checkout-input checkout-name" pattern="[А-Яа-яЁё]{7,30}" placeholder="Отчество" title="Введите отчество на русском языке, от 7 до 30 букв без пробелов" maxlength="30" required>
<input type="text" name="nomer_telefona" size="30" class="checkout-input checkout-name" pattern="\+([0-9]{1,3})(\([0-9]{2,5}\))([0-9]{5,7})" placeholder="Номер телефона" title="Введите номер телефона в формате +<код страны>(<код региона/оператора>)<номер телефона> без пробелов. Код страны содержит от 1 до 3 цифр, код региона/оператора - от 2 до 5 цифр, а номер телефона - от 5 ддо 7 цифр" maxlength="30" required>
</p>

<p>

<input type="text" name="pochta" size="80" class="checkout-input checkout-name" pattern="([A-z0-9_.-]{1,})@([A-z0-9_.-]{1,}).([A-z]{2,8})" placeholder="E-mail" title="Введите адрес электронной почты в формате <имя_пользователя>@<Название_сайта>.<домен_государства> без пробелов. Имя пользователя и название сайта содержат не менее 1 символа, а домен государства - от 2 до 8 букв" maxlength="80" required>

<select name="med_spec" id="med_spec" class="checkout-input checkout-name" required>
<option value="0">Выберите область медицины</option>
<option value="1">Терапия</option>
<option value="2">Хирургия</option>
<option value="3">Ортопедия</option>
<option value="4">Ортодонтия</option>
<option value="5">Пародонтология</option>
</select>

<select name="services" id="services" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите услугу</option>
</select>

<select name="doctors" id="doctors" class="checkout-input checkout-name" disabled required>
<option value="0">Выберите врача</option>
</select>

</p>

<p>
<input type="text" name="data_priema" class="checkout-input checkout-name" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}" placeholder="Дата приёма" title="Введите дату приёма пациента в формате <ГГГГ>-<ММ>-<ДД> без пробелов" maxlength="10" required>
<select name="vremya_priema" class="checkout-input checkout-name" required>
<option>Выберите время приёма</option>
<option value="08:00">8:00</option>
<option value="08:49">8:49</option>
<option value="09:38">9:38</option>
<option value="10:27">10:27</option>
<option value="11:16">11:16</option>
<option value="12:05">12:05</option>
<option value="13:43">13:43</option>
<option value="14:32">14:32</option>
<option value="15:21">15:21</option>
<option value="16:10">16:10</option>
<option value="16:59">16:59</option>
<option value="17:48">17:48</option>
<option value="19:26">19:26</option>
</select>
</p>

<p>
<input type="submit" value="Записаться" class="checkout-btn">
</p>

</form>

Но мне по-прежнему непонятна новая сигнатура метода $.post в jQuery выше 3.0.0 Судя по документации, атрибут settings - это ассоциативный массив типа PlanObject, а это значит, нужно писать

$.post({url: $(this).action(), data: $(this).serialize(), dataType: 'json'}).done(success);

вместо

$.post($(this).action(), $(this).serialize(), success, 'json');

Или фигурные скобки и индексы массива можно опустить, но использовать done вместо success? На новую библиотеку я переходить не решился.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
Можно и done() и {success}.
Это равнозначные функции и можно писать оба варианта.
Только разный тип записи.
(грубо говоря, сильно притянув за уши) success удобен кто привык по старинке писать на callback, а done - это в стиле промисов или лапшевидный.

НО, есть именно устаревшие функции в стиле промисов
Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.
Переход на лапшевидные стиль - это в целом изначальная тенденция JQ, а теперь и всего JS. На сайте JQ есть пример, почему это удобно - можно разделять код на фрагменты
Код:
var menuId = $( "ul.nav" ).first().attr( "id" );
var request = $.ajax({
  url: "script.php",
  method: "POST",
  data: { id : menuId },
  dataType: "html"
});

request.done(function( msg ) {
  $( "#log" ).html( msg );
});

request.fail(function( jqXHR, textStatus ) {
  alert( "Request failed: " + textStatus );
});

Если вы используете jQuey только ради ajax, то вам стоит начать смотреть в сторону чистого XHR или ещё лучше в сторону современного Fetch (для старых браузеров необходимо будет подключать полифил)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ