May 13

Что будет если студенту дать спроектировать базу данных интернет-магазина ? Пусть студент будет сферический в вакууме, дабы никого не обидеть, но пример абсолютно жизненный.

Студент будучи хорошим учеником, спроектирует что-то вроде такой схемы:

products (id, name, price, quantity) -- для хранения товаров и остатков
users (id, name) -- для хранения пользователей
orders (id, date, sum) -- для хранения заказов

Потом студент свяжет эти таблицы, и будет прав, теория на его стороне:

users_orders (id_user, id_order)
orders_products (id_order, id_product)

Если студент был не просто хорош, а очень хорош, он навесит индексы, и foreign-keys.

Магазин начал работу, товары вносятся в базу, появились клиенты, пошл продажи. Все хорошо, убрали позиции старого ассортимента, добавили новые, пара клиентов забыли свои пароли и создали новые аккаунты. Тут начались чудеса – звонит клиент и просит найти старый заказ, а его нет. А если есть заказ, он оказывается пуст… В чем же ошибка ?

Ошибка в том что в эту сферически-вакуумную базу не были внесены некоторые неидеальности, чтобы учесть неидеальность реальности.

Заказ в интернет-магазине – это не просто список, это факт. Это – снимок реальности в каком то моменте времени. Поэтому таблица должна была выглядеть так:
orders_products (id_order, product_name, product_price, quantity, sum)

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

С foreign keys и каскадным удалением тоже шутить не надо – удаление плохого пользователя из таблицы users не должно удалять его заказы. Заказ – это факт свершенный, отрицать его или выкинуть ради красоты теории будет неверным.

Apr 24

Для лучшего понимания алгоритмов сортировки можно посмотреть анимацию их работыдиваниdistributed raman amplifier — нужно только кликнуть на нужный вид.

Feb 22

Добавим немного интерактива

AJAX, JavaScript, учеба, аффтар: Скакунов Александр 1 Comment »

Добавим немного интерактива с помощью JavaScript.

Для начала давайте не субмитить форму, если пользователь ничего не ввёл в поле ввода.

Для этого сначала нужно добавить полю ввода идентификатор, по которому можно к этому полю обращаться и с ним работать, в этой строке приписываем атрибут id:

<input id="server" name="server" style="width:300px"
value="<?=$_GET["server"]?>"/>

Теперь мы можем обращаться с этим полем ввода как с объектом, находя его по ID:

var inp = document.getElementById('server');

Вот теперь можно по нажатию кнопки проверять наличие текста в этой строке ввода:

<input name="submit" type="Submit" value="Submit"
onclick="var inp = document.getElementById('server');
if(!inp.value) {alert('Введите адрес сервера.'); return false;}"/>

Вообще, если кнопки типа submit в обработчике нажатия возвращает FALSE, то субмита формы не происходит — этим мы и воспользовались.

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

Feb 20

Пробуем силы на PHP

PHP, учеба, аффтар: Скакунов Александр 1 Comment »

Итак, у вас уже есть установленный веб-сервер. Давайте теперь напишем, наконец, немного кода.

Стоит отметить, что в чистом виде РНР-скрипты (без примесей HTML) встречаются только в особенных случаях:

  • на чистом РНР оформляются отдельные классы (эдакие готовые подпрограммы) — так повышается степень их повторного использования: скопировал в новый проект и используешь
  • консольные приложения — бывает надо пройтись по дереву папок и что-то по ним посчитать, тогда запуск из браузера необязателен, можно пускать скрипт прямо из консоли, а там HTML не нужен
  • в современных фреймворках используется паттерн MVC (Model – View – Controller) — так разделяется бизнес-логика (как вообще работает приложение, на высоком уровне), представление (как данные отображаются) и контроллер (обработчик действий пользователя, связующий бизнес-логику и представление). Так вот там HTML используется только в представлении, и то не всегда.

Но мы доберёмся до всего этого немного позже. Сегодня у нас два примера на РНР — детсадовский и для детей постарше.

Скрипт №1. Создаём на нашем локальном сервере файл 1.php и пишем в него следующий код:

<?
echo 'Let\'s count: ' . (2 + 2);

Запускаем скрипт через браузер (заходим на наш локальный сервер и дописываем имя файла 1.php), в итоге в броузере появится фраза:

Let's count: 4

Что видно из этого примера:

  1. PHP-код начинается с тэга <? — если не сработает, попробуйте <?php , это потом можно будет настроить в конфиге php.ini
  2. Для вывода текста используется команда echo
  3. Экранированием кавычки является обратный слэш
  4. Конкатенация строк (склеивание) происходит через точку (не сильно привычно, понимаю)
  5. Сложение как было, так и осталось — хоть какое-то постоянство в мире
  6. Закрывающий тэг иногда можно не закрывать — вот как в нашем случае

Скрипт №2. Пишем веб-форму, которая будет возращать IP-адрес для указанного доменного имени.

<html>
<head>
  <title>gethostbyname</title>
</head>

<body bgcolor="#eeeeee">
  <form method="get">
    <input name="server" style="width:300px" value="<?=$_GET["server"]?>"/>
    <input name="submit" type="Submit" value="Submit"/>
  </form>
<?
if($_GET["server"]!="")
  echo "<hr/>".$_GET["server"]." : ".gethostbyname($_GET["server"])
?>

</body>
</html>

Поиграйтесь с ним.

Введите iwannabedeveloper.com — чтобы получить 208.77.209.127. Обратите внимание, как быстры повторные запросы — это помогает кэш DNS.

У вас в руках мощное оружие. Будем учиться использовать его оптимально.

Feb 14

Установка сервера

Apache, PHP, учеба, аффтар: Скакунов Александр 2 Comments »

Короткий, но ёмкий пост: чтобы установить сервер для дальнейшей работы, вам нужно прочитать два ранее опубликованных здесь поста, написанные моим коллегой Родионом Быковым. Тогда вы сможете ставить веб-эксперименты прямо на своей рабочей машине.

Итак, читаем по порядку:

  • Знакомство с Apache — начинаем с установки веб-сервера, собственно обрабатывающего запросы, например, от вашего браузера.
  • Установка PHP как модуль Apache — если вам нужно что-то посложнее раздачи статических страничек (динамика), то без PHP не обойтись. Учимся инсталлировать.

Эти шаги надо сделать всего один раз, так что потерпите.


Georgia Health Insurance