Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сайт гостиницы.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Хочу получить критику по своему коду
Xenox
Отправлено: 03 Марта, 2015 - 21:11:53
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Доброго времени суток! Не пинайте слишком сильно)
Не давно возникла такая задача, требуется написать сайт для гостиницы.
С задачей я справился, но хотелось бы получить конструктивную критику, уверен что можно было бы как то проще сделать, если не сложно откликнитесь, не очень давно учусь php, учителей ни каких не было, поэтому хотелось бы услышать ваше мнение

Грубо говоря имеется 6 номеров и пользователь может заброниронировать себе номер, исходя из даты, он указывает дату заезда, и дату съезда, ну и соответственно мне нужно проверить какие номера свободны на эти даты. Предоставить пользователю выбор и записать его данные в БД.
создал БД с таблицами:
users - поля: id, name, surname и т.д.
oneRooms - поля: id, date1, date2, id_user, id number. (Просто предполагается что будут одно-двух-трехкомнатные номера, но пока написал для однокомнатных)
numbers - поля: id_number, adress, kvadrature, about_number (здесь просто храняться данные о каждом номере)
далее приступил к самой реализации:

функция которая проверяет попадает не пересекаются ли даты:
PHP:
скопировать код в буфер обмена
  1. function find_number($d1, $d2, $fd1, $fd2){
  2.        
  3.         $d1 = date('d-m-Y', strtotime($d1)); //Даты привожу к формату дд-мм-гггг
  4.         $d2 = date('d-m-Y', strtotime($d2));
  5.         $d1 = strtotime($d1); //перевожу для сравнения
  6.         $d2 = strtotime($d2);
  7.         $fd1 = strtotime($fd1);
  8.         $fd2 = strtotime($fd2);
  9.         if($d1 <= $fd1 && $fd1 <= $d2){  
  10.                 return false;
  11.         }elseif($d1 <= $fd2 && $fd2 <= $d2){
  12.                 return false;
  13.         }elseif ($fd1 <= $d1 && $d1 <= $fd2){
  14.                 return false;
  15.         }elseif ($fd1 <= $d2 && $d2 <= $fd2){
  16.                 return false;
  17.         }else return true;
  18.                                
  19.  
  20. }              
  21.        


затем

PHP:
скопировать код в буфер обмена
  1. function bron_form(){
  2.        
  3.         $query = mysql_query("SELECT * FROM onerooms");
  4.         $row = mysql_fetch_assoc($query);
  5.        
  6.         if (empty($_POST['date1']) && empty($_POST['date2'])){
  7.                
  8.                        
  9.                                        
  10.                                        
  11.                                        
  12.                                         //Вывожу форму ввода дат. Ссылаюсь на этуже страницу
  13.                                        
  14.                                        
  15.                                        
  16.                 }else{
  17.                         //Получаю все записи из таблицы
  18.                         $result = mysql_query("SELECT * FROM onerooms");
  19.                         $num_rows = mysql_num_rows($result);
  20.                         $i = 1;
  21.                         while($row = mysql_fetch_assoc($result)){
  22.                                 if (!find_number($row['date1'], $row['date2'], $_POST['date1'], $_POST['date2'])){
  23.                                         $zant[$i] = $row['id_number'];$i++;//Получаю массив занятых номеров
  24.                                 }
  25.                         }
  26.                         $dat = array('1', '2', '3', '4', '5', '6'); //создаю массив для сравнения
  27.                         $result = array_unique($zant); //удаляю дублирующиеся номера
  28.                         if(!empty($zant)){
  29.                                 $result = array_diff($dat, $zant); // Получаю массив свободных номеров
  30.                         }else{$result = $dat;}
  31.                        
  32.                        
  33.                        
  34.                         sort($result); //Сортирую его
  35.                
  36.                        
  37.                         //Ну и вывожу соответственно
  38.                         echo"<h3>Доступные номера:</h3><br>
  39.  
  40.                         <div class='info-one-Rooms'>   
  41.                         <h5>Однокомнатные:</h5>
  42.                                 <hr>
  43.                        
  44.                        
  45.                         ";  for($i = 1; $i <= sizeof($result); $i++){
  46.                                 print_number($i);} echo "
  47.                        
  48.  
  49.                 </div>  ";
  50.                
  51.                
  52.                 }      


ну и на последок функция вывода(она наверно не нужна, но пусть будет)

PHP:
скопировать код в буфер обмена
  1. function print_number($id_number){
  2.        
  3.         connect_db();
  4.         $query = mysql_query("SELECT * FROM Numbers WHERE id=$id_number");
  5.         $row = mysql_fetch_assoc($query);
  6.        
  7.         echo ("<div id='maindiv".$id_number."' class='maindiv'>
  8.                                
  9.                                 <div id='info".$id_number."' class='info' style='height:65px'>
  10.                                        
  11.                                         <a href='images/OneRooms/".$id_number."/1.png' class='example2'><img alt='' src='images/OneRooms/".$id_number."/1.png' align='left'/></a>
  12.                                         <p><form action='bron.php' method='POST'><input type='submit' value='Выбрать'><input type='hidden' value='".$id_number."' name='numberRoom'><input type='hidden' value='1' name='typeRoom'><input type='hidden' value='1' name='date1'><input type='hidden' value='1' name='date2'></form></p>
  13.                                         <p>".$row['adress']."</p>
  14.                                        
  15.                                         <p>".$row['price']."р.</p>
  16.                                        
  17.                                        
  18.                                         <div id='hide_info".$id_number."' class='hide_info'>
  19.                                        
  20.                                         <p>".$row['plas']."</p>
  21.                                         <p>".$row['text']."</p>
  22.                                                 <a href='images/OneRooms/".$id_number."/1.png' class='example2'><img alt='' src='images/OneRooms/".$id_number."/2.png' align='left'/></a>
  23.                                                 <a href='images/OneRooms/".$id_number."/1.png' class='example2'><img alt='' src='images/OneRooms/".$id_number."/3.png' align='left'/></a>
  24.                                         </div>
  25.                                
  26.                                        
  27.                                        
  28.                                 </div>
  29.                                 <span id='about".$id_number."' class='about' onclick=\"one_Rooms('#hide_info".$id_number."', '#maindiv".$id_number."', '#about".$id_number."')\">Подробнее</span>
  30.                         </div><br><br>
  31.                 <hr>");
  32.        
  33. }


все работает, я рад что получилось, но так же понимаю что это "все работает" до поры до времени, потому что в теории таблица будет oneRooms будет увеличиваться и при 1-100-1000 записях будет работать все медленнее,в планах сделать, что бы скрипт сравнивал и текущюю дату с датой сьезда, и если текущая дата больше, то удалял эту запись из БД. Ну вот вроде все) жду критики

(Отредактировано автором: 03 Марта, 2015 - 21:14:31)

 
 Top
exlant
Отправлено: 03 Марта, 2015 - 22:25:41
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




Я в код особо не вникал, это только то что сразу бросилось в глаза!

как только начал читать увидел
PHP:
скопировать код в буфер обмена
  1.  
  2.         $d1 = date('d-m-Y', strtotime($d1)); //Даты привожу к формату дд-мм-гггг
  3.         $d2 = date('d-m-Y', strtotime($d2));
  4.         $d1 = strtotime($d1); //перевожу для сравнения
  5.         $d2 = strtotime($d2);
  6.        
  7.  

вообще непонятно зачем с начало переводить в формат 'd-m-Y', используя притом функцию strtotime($d1), а потом нигде не использовав переменные переводить опять в timestamp, первые две строчки вообще не нужны!

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

SELECT * FROM вот так вот вообще не правильно писать! вместо * возьмите за правило писать имена столбцов, которые нужны, и вообще можно, даже я бы сказал нужно было все проверки занят/свободен, дублированные номера/не дублированные, сортировку и т.д. перенести в запрос к БД, а не дергать всю базу данных, а потом фильтровать ее средствами php!

потом не понятно зачем нужны первые вот эти две строчки
PHP:
скопировать код в буфер обмена
  1. $query = mysql_query("SELECT * FROM onerooms");
  2.         $row = mysql_fetch_assoc($query);

в function bron_form()! вернее сказать они там вообще не нужны так как не используются потом в функции

потом не понятно зачем постоянно дергать всю БД! Раз уже и дернули всю БД, то сохранили бы ее в каком то массиве, и передавали потом удобным вам способом!

И на последок библиотека mysql давно уже устарела, и в следующей версии php будет удалена! Так что если есть желание дальше изучать этот язык, то нужно переходить с mysql на mysqli или pdo!
 
 Top
Xenox
Отправлено: 04 Марта, 2015 - 01:16:49
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Спасибо большое! Буду исправляться!
Цитата:
потом читая дальше еще увидел, что и сама функция как бы не очень и нужна, так как ее функционал можно полностью переложить в запрос к БД.

Если не сложно хотелось бы увидеть как примерно должен выглядеть такой запрос, чисто для саморазвития.
Цитата:
вообще непонятно зачем с начало переводить в формат 'd-m-Y', используя притом функцию strtotime($d1), а потом нигде не использовав переменные переводить опять в timestamp, первые две строчки вообще не нужны!


за этот ответ отдельное спасибо) только сейчас понял, раньше думал для того что бы сравнить 2 даты их нужно привести к одинаковому формату т.е. d-m-Y и только потом перевести в метку времени Unix

(Отредактировано автором: 04 Марта, 2015 - 01:22:19)

 
 Top
exlant
Отправлено: 04 Марта, 2015 - 02:33:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




можно как то так, но это если date1,date2 храниться в формате date, и соответственно $_POST[date] тоже надо с начало проверить на корректность, а потом перевести в Y-m-d
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT o.*,n.* FROM onerooms o
  3. INNER JOIN Numbers n ON o.id = n.id_number WHERE (o.date1<=".$_POST['date2']." AND o.date2>=".$_POST['date2'].") OR (o.date2>=".$_POST['date1']." AND o.date1<=".$_POST['date1'].") OR (o.date1>=".$_POST['date1']." AND o.date2<=".$_POST['date1'].") GROUP BY n.id_number ORDER BY "поле по какому сортировать"
  4.  
  5.  



и вместо того что бы создавать таблицы на каждую oneRooms, можно было сделать колонку rooms, и указывать там количество комнат!

(Отредактировано автором: 04 Марта, 2015 - 02:36:38)

 
 Top
Xenox
Отправлено: 04 Марта, 2015 - 10:10:42
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Благодарствую!! Сам бы такой запрос не составил. Я просто подумал что стоит разбить на несколько таблиц, потому что если все в одной будет храниться то она будет слишком большая...
 
 Top
RickMan
Отправлено: 04 Марта, 2015 - 10:53:24
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)






1) echo "текст" а не echo ("текст")
2) Если нужно вывести html, то не выводите его через php (тоесть echo, print ...). Старайтесь не мешать html и php

Ну а вообще, для такое задачи модно было спокойно использовать к примеру тот же WordPress + соответствующий плагин.

(Отредактировано автором: 04 Марта, 2015 - 10:53:49)

 
 Top
Xenox
Отправлено: 04 Марта, 2015 - 11:18:28
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Спасибо за критику!
а по поводу wordrpess, тут сама суть была что бы не использовать CMS
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB