Перейти к содержимому

Фотография
- - - - -

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


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 10

#1 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 05 Август 2018 в 09:47

Добрый день! Я пишу сайт для стоматологического кабинета. Есть форма для записи пациента к врачу, и нужно вставить пациента и дату приёма, а при отправке формы вывести модальное окно с ответом от сервера. У меня вопрос: почему мой файл 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 'Данные не получены!';
}
?>

 

Прикрепленные изображения

  • screen-1.jpg
  • screen-2.jpg

Прикрепленные файлы

  • Прикрепленный файл  stomkab.zip   3,9МБ   2 Количество загрузок:
  • Прикрепленный файл  sql.zip   119,07К   2 Количество загрузок:

  • 0

Спонсор

#2 Volly

Volly

    Увлеченный

  • Участник
  • 110
    562 сообщ.

Отправлено 05 Август 2018 в 12:56

В таком длинном коде навряд ли кто-то будет разбираться. Попробуйте убрать не относящееся к проблеме.

Это не ошибки, а информация о попытке использовать необъявленные переменные $_POST['phone_number'] и др.


  • 0

#3 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 05 Август 2018 в 14:01

Я уже даже переименовал поля формы и индексы элементов массива 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'];

Как принудительно объявить эти переменные?


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

Прикрепленные изображения

  • screen-4.jpg

  • 0

#4 Volly

Volly

    Увлеченный

  • Участник
  • 110
    562 сообщ.

Отправлено 05 Август 2018 в 18:25

в 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"


  • 0

#5 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 05 Август 2018 в 23:31

Добрый вечер! Оказывается, плагин 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'");
?>

Вот рисунок:

Прикрепленные изображения

  • screen-4.jpg

  • 0

#6 Volly

Volly

    Увлеченный

  • Участник
  • 110
    562 сообщ.

Отправлено 06 Август 2018 в 00:00

Попробуйте строку 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");


  • 0

#7 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 06 Август 2018 в 08:06

Скорее всего, такое может быть, при передаче даты или времени, если кто-то введёт месяц больше 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?

Прикрепленные изображения

  • screen-2.jpg
  • screen-4.jpg
  • screen-4.jpg
  • screen-5.jpg
  • screen-6.jpg

  • 0

#8 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 06 Август 2018 в 09:25

Я подключил 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?


  • 0

#9 BaNru

BaNru

    Пацифизжу

  • суперМодератор
  • 1015
    3 690 сообщ.

Отправлено 06 Август 2018 в 17:15

У Вас есть архивы jquery-3.3.1-min.zip?

Скачать именно 3.3.1 можно на оф.сайте
Если откроется код, то можно сделать "сохранить как" и сохранить под нужным названием, с расширением JS, после чего можно будет подключить его в проект.
Или даже можно указать путь до их файла

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

А jQuery 2.2.4 уже поддерживает HTML5?

Вообще даже для jQ первой ветки всё это не проблема - читать INPUT. Он был ещё до JQuery.
Вероятно вы не так читаете.
 
Самая простая отладка пост запросов:
На стороне сервера, где принимается и обрабатывается ПОСТ можно сделать

print_r($_POST);

А на стороне клиента, в ответе на пост написать:

...
success: function(result){
    console.log(result)
}
...

И смотреть что придёт в консоли браузера, так будет видно, что приходит на сервер.
 

Скорее всего, такое может быть, при передаче даты или времени

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


  • 0

#10 VladimirBuzin

VladimirBuzin

    Прохожий

    Топикстартер
  • Участник
  • 0
    19 сообщ.

Отправлено 07 Август 2018 в 21:08

Наконец-то переход на 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, :otchestvo, :telephone, :pozhta)");
$statement->bindParam(':patnum', $new_pat_id);
$statement->bindParam(':lastname', $familija);
$statement->bindParam(':firstname', $imja);
$statement->bindParam(':otchestvo', $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? На новую библиотеку я переходить не решился.


  • 0

#11 BaNru

BaNru

    Пацифизжу

  • суперМодератор
  • 1015
    3 690 сообщ.

Отправлено 08 Август 2018 в 06:55

Можно и 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 (для старых браузеров необходимо будет подключать полифил)
  • 0



Похожие темы Свернуть

Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей