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]   

> Описание: Или - ужасное PHP-кодирование
DeepVarvar Супермодератор
Отправлено: 31 Января, 2013 - 20:09:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




.

Особенности написания кода новичками

Собственно, пока есть вдохновение, я попишу еще.

Заранее прошу прощения за некоторый негативчик.

В данной заметке мы с вами будем рассматривать не сам синтаксис php,
или какие-либо логические конструкции.
Мы рассмотрим тут несколько примеров "ужасного PHP-кодирования".
Некоторые из примеров будут являться следствием и/или дополнением предыдущих.

Вот рассматриваемый нами код:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3.   <title>Абырвалг</title>
  4. </head>
  5. <body>
  6. <?
  7. // Соединяемся с сервером базы данных
  8. require '../blocks/bd.php';
  9. $query = 'SELECT id_cat, name_cat FROM categories ORDER BY id_cat';
  10. $res = mysql_query( $query );
  11. echo 'Категории: <select name="category" id="category">'."\n";
  12. echo '<option value="0">Выберите</option>'."\n";
  13. while ( $ctg = mysql_fetch_array( $res ) ) {
  14.  echo '<option value="'.$ctg['id_cat'].'">'.$ctg['name_cat'].'</option>'."\n";
  15. }
  16. echo '</select><br/>'."\n";
  17.        while($res = mysql_fetch_assoc($result)) {
  18.  
  19.                $price_all = $res['price'] * $_SESSION['basket'][$res['id']]; // второй параметр - ранее записанное количество товара
  20.  
  21.                echo "</br></br><h1>".$res['price']."</h1>";
  22.  
  23.                echo "Полная цена (цена на количество): {$price_all}";
  24.  
  25.                            echo '<form action="cart.php?act=obn" method="post"><input type="text" size="2" maxlength="5" name="count[]" value="'.$_SESSION['cart'][$res['id']].'" /></td><input type="submit" class="ibutton" value="Пересчитать" />';
  26.  
  27.        }
  28.  
  29. ?>
  30. </body>
  31. </html>


Скажите, люди, почему вы пишете вот так?
Вы с головой дружите?

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

На форуме всплывают темы вида "Почему у меня на денвере все работало, а на хостинге вываливаются какие-то Deprecated?"
Вы не знаете что означает это слово? Попросите перевести гугла.

-----------------

Теперь поехали разбираться.

Во первых - никакой редирект не возможен если вы уже вывели на страницу хотябы один символ, или даже пробел!.

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

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

Отсюда же вытекает, что для устранения копипасты нужно написать себе нормальную обертку для запросов к базе.
Вы не знаете ООП? А функциями умеете? Ну так в чем проблема?
PHP:
скопировать код в буфер обмена
  1. function DbQuery($query) {
  2.   $result = mysql_query($query) or die("Ошибка в запросе: " . mysql_error());
  3.   $arr = array();
  4.   while ($row = mysql_fetch_assoc($result)) {
  5.     $arr[] = $row;
  6.   }
  7.   return $arr;
  8. }

И вызывайте её спокойно где оно надо.
Цитата:
Если параметр link_identifier опущен, используется последнее открытое соединение

Одной строкой, а не этими бешеными циклами!

Отсюда вытекает, что нельзя использовать циклы do { ... } while (); при выборке из базы.
Потому, что такой цикл выполняется как минимум один раз! Вне зависимости от того есть ли хоть какой-то результат
.

Не поняли как правильно сделать все описанное? Вот так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // НИКАКОГО ВЫВОДА ПОЛЬЗОВАТЕЛЮ,
  3. // ТОЛЬКО РАБОТА СКРИПТА!!!
  4.  
  5.  
  6. function DbQuery($query) {
  7.   $result = mysql_query($query) or die("Ошибка в запросе: " . mysql_error());
  8.   $arr = array();
  9.   while ($row = mysql_fetch_assoc($result)) {
  10.     $arr[] = $row;
  11.   }
  12.   return $arr;
  13. }
  14.  
  15. // Соединяемся с сервером базы данных
  16. require '../blocks/bd.php';
  17.  
  18. // получаем категории
  19. $categories = DbQuery("SELECT id_cat, name_cat FROM categories ORDER BY id_cat");
  20.  
  21. // получаем корзину
  22. $listIds = array_keys($_SESSION['basket']);
  23. $basket = DbQuery("SELECT * FROM tovar WHERE id IN (" . join(',' , $listIds) . ")");
  24.  
  25. // все данные получили?
  26. // ну тогда подключаем шаблон!
  27. require 'template.html';

Вот шаблон template.html:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3.   <title>Абырвалг</title>
  4. </head>
  5. <body>
  6.   Категории:
  7.   <select name="category" id="category">
  8.     <option value="0">Выберите</option>
  9.     <?php foreach ($categories as $ctg) { ?>
  10.       <option value="<?=$ctg['id_cat']?>"><?=$ctg['name_cat']?></option>
  11.     <?php } ?>
  12.   </select>
  13.   <br/>
  14.  
  15.   <?php
  16.  
  17.    $price_all = 0;
  18.    foreach ($basket as $item) {
  19.      $price_all = $item['price'] * $_SESSION['basket'][$item['id']];
  20.      $v = $_SESSION['basket'][$item['id']];
  21.  ?>
  22.         </br>
  23.         </br>
  24.         <h1><?=$item['price']?></h1>
  25.         Полная цена (цена на количество): <?=$price_all?>
  26.         <form action="cart.php?act=obn" method="post">
  27.           <input type="text" size="2" maxlength="5" name="count[]" value="<?=$v?>" />
  28.           <input type="submit" class="ibutton" value="Пересчитать" />
  29.         </form>
  30.  
  31.     <?php } ?>
  32.  
  33. </body>
  34. </html>

Неужели это все так трудно делать для собственного удобства?
 
 Top
KingStar
Отправлено: 31 Января, 2013 - 20:44:47
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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





DeepVarvar видимо чей-то магазин ковыряет Радость Радость Радость


-----
То что программа работает, не означает что она написана правильно!
 
 Top
DeepVarvar Супермодератор
Отправлено: 31 Января, 2013 - 20:49:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Упаси боже! Ха-ха
 
 Top
imya
Отправлено: 31 Января, 2013 - 20:53:21
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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




Красота!) Повеселил, спасибо))

Попова уже сам ненавижу, всё чаще задают вопросы в его стиле Радость


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 31 Января, 2013 - 20:59:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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





Но к заметке, товаристч Попов имеет самое отдаленное отношение.
Я конечно же понял что этот комментарий к моей подписи.
 
 Top
DelphinPRO
Отправлено: 31 Января, 2013 - 22:44:43
Post Id



Активный участник


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


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





DeepVarvar пишет:
// Соединяемся с сервером базы данных
require '../blocks/bd.php';

завязывай с этим Улыбка а то так и будут везде одни бидэ Улыбка


Заметка правильная. Будем ссылки на нее кидать при случае.

(Отредактировано автором: 31 Января, 2013 - 22:46:07)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DlTA
Отправлено: 04 Февраля, 2013 - 15:42:31
Post Id



Постоянный участник


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


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




хе хе,
по поводу того что надо все получить и только потом выводить,

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

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

ну а для тех кто любит "посвинячить" ob_start() и т.д.

с остальным согласен.
 
 Top
EuGen Администратор
Отправлено: 04 Февраля, 2013 - 15:52:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




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

- а не поясняющий характер. Иными словами, написано - что делать, но не сказано - почему так нужно делать.
DeepVarvar пишет:
нельзя использовать циклы do { ... } while (); при выборке из базы.

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

Свой велосипед, право же - не всегда лучше общеизвестного. Да, оно, конечно, написано собственноручно, но у обкатанного все же круглые, а не квадратные, колеса, и едет он вперед, а не наискосок. Это образно. Смысл в том, что доносить идею об обертке - верно, но вот о том, чтобы её писать самостоятельно - я бы посомневался.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 04 Февраля, 2013 - 16:15:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




EuGen пишет:
красным шрифтом
А темно-красный слишком тёмен, и на ЖК практически не виден.. Огорчение
EuGen пишет:
написано - что делать, но не сказано - почему
Я и не задавался целью объяснять, т.к. думаю что те, кто поймет или примет на веру данные "заметки", рано или поздно зададут вопрос "почему", вот тогда они будут готовы узнать.
EuGen пишет:
Свой велосипед

Считать обкатанным способ копипасты циклов внутри хтмл-кода - это плохо.
Тут я хотел донести удобство получения результата запроса в одну строку.
Что писать лучше не самому - то совсем не будет двигаться вперед.
И года через 2 не научившись писать круглые колеса, впилит в серьезный проект свое чудо техники - и последствия будут очень бОльными.
Лучше пусть сейчас тренируются и ошибаются - сами.
И поэтому тоже я тут больше рекомендую, чем объясняю.

DlTA пишет:
проще а иногда и удобней делать расчет вместе с выводом
Есть отличная фраза (слышал в контексте сочинения музыки, но сюда оно тоже подходит)
Цитата:
Для того, чтобы иметь возможность нарушать правила, их нужно сперва все выучить.
Т.е. тут снова всплывает вопрос осознанности поступка.
 
 Top
EuGen Администратор
Отправлено: 04 Февраля, 2013 - 16:20:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




DeepVarvar пишет:
Считать обкатанным способ копипасты циклов внутри хтмл-кода - это плохо.

Речь все же была об обертке. Хорошим подспорьем будет взять что-то готовое (из фреймворка, к примеру), чем писать свой вариант, который будет наверняка намного хуже. Это к тому же породит необходимость разобраться, хотя бы в начальном варианте, почему там сделано именно так, как сделано. Это к слову о том, что
DeepVarvar пишет:
рано или поздно зададут вопрос "почему", вот тогда они будут готовы узнать.
- и чем раньше, тем лучше. Слепое следование рекомендациям почти всегда приводит к непонимании проблематики, желание же узнать причины - порождает необходимость понять. Здесь я, правда, отталкиваюсь от того, что люди, которые пытаются программировать для веб - должны быть знакомы с основами. Собственно, Ваша статья и является доказательством обратного. Однако этот ход - снятие симптома, а не решение причины такой проблемы. Согласитесь, что если бы веб-программисты сначала изучали инструменты, с помощью которых им нужно работать, а не бездумно их применяли, таких вопросов бы не возникало.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 04 Февраля, 2013 - 16:33:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




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

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

Например, очень в кратце вниз:
Браузер -> сервер -> интерпретатор -> ОС -> процессор -> ТТЛ -> транзистор -> реле -> физика пятого класса..
 
 Top
EuGen Администратор
Отправлено: 04 Февраля, 2013 - 16:43:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Зона ответственности программиста закончится на шаге "интерпретатор", хорошего программиста - на шаге "ОС", архитектора - на шаге "процессор". Дальнейшее - пусть и имеет непосредственное отношение к программированию и компьютерному железу, но оно имеет ту же степень связи, как, например, квантовая физика и медицина (все мы - суть атомы, а, значит, кванты, мезоны и бозоны, однако же классному врачу это знать не обязательно для того, чтобы спасти жизнь человеку).
В Вашей схеме еще упущены такие вещи, как транспортный уровень (если быть детальным, то одного только перехода стрелкой здесь мало, в свою очередь этот уровень так же раскрывается на подуровни - начиная от протоколов уровня приложений к стеку TCP/IP и ниже до канального и физического уровней), а так же уровни фронтенд/бекенд серверов (как то - веб-сервер).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 04 Февраля, 2013 - 17:03:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




EuGen пишет:
...уровень так же раскрывается на подуровни...
Да-да, именно поэтому "очень вкратце и одним вектором без ветвлений". А вот по поводу как глубоко вниз нужно уйти.. Я бы сказал что не нужно ниже (глубже), чем описано в книге Стивена Леви "Хакеры: Герои компьютерной революции".
По крайней мере, после прочтения можно будет блеснуть знанием истории развития компьютерной техники ))
Да и вообще, книжечка то - зачетная ))
Цитата:
IBM 704, стоимость которого составляла несколько миллионов долларов, занимал целую комнату, требовал постоянного внимания персонала, состоявшего из профессиональных операторов ЭВМ. Ему также требовалось специальное кондиционирование, чтобы раскаленные вакуумные лампы внутри этого сооружения не нагрелись до температур, уничтожающих данные. Когда кондиционирование выходило из строя, а это было достаточно частым явлением, то звучал громкий гонг, после чего из близлежащего офиса пулей неслись три инженера. С машины очень быстро снимались кожухи, так чтобы ее внутренности не успели расплавиться. Все эти люди отвечали за перфорацию карт, их подачу в считыватели, нажатие кнопок и щелканье переключателями на машине. Они представляли собой Высшую Касту Жрецов, а те, кто был достаточно привилегирован, чтобы представить свои данные перед ликом Высших Жрецов являлись их официальными помощниками. Сама процедура загрузки программ фактически была ритуальным обрядом.

Помощник:

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

Жрец (от имени машины):

Мы попробуем. Мы ничего не обещаем.
 
 Top
MAXUS
Отправлено: 19 Февраля, 2013 - 19:50:04
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


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




DlTA пишет:
хе хе,
по поводу того что надо все получить и только потом выводить,

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

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

ну а для тех кто любит "посвинячить" ob_start() и т.д.

с остальным согласен.


Согласен. Вывод в цикле иногда ощутимо шустрее и если нет задачи писать для других, то вполне, на мой взгляд, оправдан.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Февраля, 2013 - 19:55:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




MAXUS пишет:
Вывод в цикле иногда ощутимо шустрее
Что есть "ощутимо"? Можно увидеть в микросекундах?
 
 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