$30 off During Our Annual Pro Sale. View Details »

Epic PHP #6

Roma
March 17, 2014

Epic PHP #6

Слайды к шестому занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: работа с файлами, даты и время, безопасность

Roma

March 17, 2014
Tweet

More Decks by Roma

Other Decks in Programming

Transcript

  1. file_get_contents() Считывает все содержимое файла в виде строки. ! <?php

    $dataString = file_get_contents(‘uploaded_file.csv’); var_dump($dataString); ! $habr = file_get_contents('http://habrahabr.ru/'); echo $habr;
  2. file_put_contents() Пишет строку в файл. ! <?php $file = 'secretes.txt';

    $current = file_get_contents($file); $current .= "Santa Claus does not exist!\n"; file_put_contents($file, $current);
  3. Как правило • $fp = fopen(‘somedata.txt’, ‘w’); • fread($fp ,

    1024 ); • fwrite($fp , ‘hello’); • fclose($fp);
  4. Режимы • r — только чтение • r+ — одновременно

    чтение и запись • w — создание нового пустого файла • w+ — r+ и w вместе • a — запись в конец файла • a+ — еще и создаст, если что
  5. Пишем в файл <?php $fp = fopen("shfile.txt", "a"); $mytext =

    "Строку эту допишем мы в файл.\r\n"; $test = fwrite($fp, $mytext); if ($test) { echo 'Данные добавлены! Уиии!'; } else { echo 'Что-то не круто.'; } fclose($fp);
  6. Читаем из файла <?php $handle = fopen("/data/superHeros.txt", "r"); if ($handle)

    { while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer; } if (!feof($handle)) { echo "Error: unexpected fgets() fail\n"; } fclose($handle); }
  7. file() Считываем весь файл в массив. ! <?php $lines =

    file('orders.csv'); ! foreach ($lines as $line_num => $line) { echo "Line #<b>{$line_num}</b> : " . $line . "<br />\n"; } ! $html = implode('', file('https://news.ycombinator.com/'));
  8. Функции. CSV $row = 1; if (($handle = fopen("test.csv", "r"))

    !== false) { while (($data = fgetcsv($handle, 1000, ",")) !== false) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row++; for ($c=0; $c < $num; $c++) { echo $data[$c] . "<br />\n"; } } fclose($handle); }
  9. Функции. CSV $list = array ( array('aaa', 'bbb', 'ccc', 'dddd'),

    array('123', '456', '789'), ); ! $fp = fopen('file.csv', 'w'); ! foreach ($list as $fields) { fputcsv($fp, $fields); } ! fclose($fp);
  10. Важно • Проверки файлов на существование • Проверки на отработку

    функций чтения и записи • Проверки проверок на проверки проверок • Ошибок при работе файлов обычно много
  11. Задание На сайте http://chuckipsum.com/ берем текст и сохраняем в файл

    chuck.txt в дереве нашего проекта. Далее все результаты пишем в новый файл result.txt. ! 1. Переставить абзацы в тексте в обратном порядке 2. Заменить каждое вхождение “Chuck Norris” на “Чебурашка”. А если скучно, то только каждое второе. 3. Удалить каждую третюю строку.
  12. Задание Делаем простой импорт данных в БД. index.php: форма с

    файловым полем import.php: сохраняем файл в каталог data, каждую строчку файла сохраняем в табличку messages(id, row) в базе epicphp, делаем редирект обратно на index.php. Если при обработке была ошибка, сохраняем ее в сессию и выводим на index.php после редиректа.
  13. Даты и время • Нужны очень часто • И очень

    важны • В контексте бизнес-логики приложений (время транзакций, подсчеты, ...) • В контексте сопутствующей информации (логи, метки данных, ...)
  14. time() Возвращает текущее абсолютное время. Это число равно количеству секунд,

    которое прошло с полуночи 1 января 1970 года (с начала эпохи UNIX). ! Значение не зависит от часового пояса (UTC).
  15. time() <?php $tomorrow = time() + (24 * 60 *

    60); ! echo 'Tomorrow: '. date('Y-m-d', $tomorrow) ."\n";
  16. date() // Monday echo date("l"); ! // Monday 8th of

    August 2005 03:12:46 PM echo date('l jS \of F Y h:i:s A'); ! // July 1, 2000 is on a Saturday echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
  17. date() • второй параметр — абсолютное время (timestamp) • если

    timestamp не указан, по умолчанию time() • Лучше в строке формата не вставляйте дополнительных слов и символов — без правильной обработки вывод может быть неожиданным
  18. mktime() Генерит timestamp для конкретной даты. ! <?php echo date("M-d-Y",

    mktime(0, 0, 0, 12, 32, 1997)); echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997)); echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998)); echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
  19. strtotime() Конвертит английское строковое представление времени в timestamp. Отличается умом

    и сообразительностью. ! <?php echo strtotime("now"), "\n"; echo strtotime("10 September 2000"), "\n"; echo strtotime("+1 day"), "\n"; echo strtotime("+1 week"), "\n"; echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; echo strtotime("next Thursday"), "\n"; echo strtotime("last Monday"), "\n";
  20. Проблемы работы с датами и временем • Часовые пояса •

    Переходы на летнее/зимнее время • Локализация • Разница форматов
  21. Локализация // выводит названия дней на разных языках // локали

    должны быть установлены в системе ! setlocale(LC_TIME, "fi_FI"); echo strftime(" in Finnish is %A,"); setlocale(LC_TIME, "fr_FR"); echo strftime(" in French %A and"); setlocale(LC_TIME, "de_DE"); echo strftime(" in German %A.\n");
  22. DateTime <?php $raw = '22. 11. 1968'; $start = \DateTime::createFromFormat('d.

    m. Y', $raw); ! echo 'Start date: ' . $start->format('m/d/Y') . "\n"; ! $now = new \DateTime(); echo 'Time to change your life is: ' . $now->format('H:i:s d.m.Y') . "\n";
  23. DateInterval <?php // создаем копию $start и прибавляем 1 месяц

    и 6 дней $end = clone $start; $end->add(new \DateInterval('P1M6D')); ! $diff = $end->diff($start); echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n"; // Difference: 1 month, 6 days (total: 37 days)
  24. DateInterval • Не пишите код, которые полагается на фиксированне число

    секунд в каждом дне. Часовые пояса и перевод времени все вам сломают. • Используйте промежутки времени
  25. DatePeriod <?php // Выводим все четверги между $start и $end

    $periodInterval = \DateInterval::createFromDateString('first thursday'); $periodIterator = new \DatePeriod( $start, $periodInterval, $end, \DatePeriod::EXCLUDE_START_DATE ); foreach ($periodIterator as $date) { // выводим все даты за период echo $date->format('m/d/Y') . ' '; }
  26. Даты и БД • НЕ ИСПОЛЬЗУЙТЕ VARCHAR! • TIMESTAMP •

    проблема Y2K38 (32-bit integer) • DATETIME • DATE, TIME, YEAR
  27. Задание Определите сколько дней осталось до 14 июля, 31 декабря,

    до вашего дня рождения. ! Сколько часов осталось до конца дня? ! Вывести дату 15 дней назад. Вывести дату на 5 месяцев вперед. ! По возможности сделайте это и с помощью функций, и с помощью DateTime.
  28. Концепции • Plan for failure • Fail early • Принцип

    минимальных привилегий • Фильтрация • Экранирование
  29. Конфиги Храните конфиги там, где их нельзя посмотреть напрямую. И

    основной код желательно тоже. ! ├── src │ ├── App │ ├── config.php │ └── views ├── web │ └── index.php
  30. Валидация • Данным от пользователей доверять нельзя ($_GET, $_POST, файлы,

    куки...) • Валидируйте данные сразу, не оставляйте на потом • Сообщайте пользователям, что пошло не так, сразу • Whitelist vs Blacklist
  31. Ситуации • Пользователь ввел данные, которые требовалось и в нужном

    формате • Пользователь ввел что-то не так, не разобравшись в ваших требованиях • Пользователь проверяет вашу систему на прочность неправильными данными
  32. strip_tags <?php $text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other

    text</a>'; echo strip_tags($text); echo "\n"; ! // Allow <p> and <a> echo strip_tags($text, '<p><a>');
  33. htmlspecialchars & htmlentities <?php $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); echo

    $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt; ! $str = "A 'quote' is <b>bold</b>"; ! // A 'quote' is &lt;b&gt;bold&lt;/b&gt; echo htmlentities($str); ! // A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt; echo htmlentities($str, ENT_QUOTES);
  34. Валидация <?php $email_a = '[email protected]'; $email_b = 'someshittydata'; ! if

    (filter_var($email_a, FILTER_VALIDATE_EMAIL)) { echo "This (email_a) email address is considered valid."; } if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) { echo "This (email_b) email address is considered valid."; }
  35. Очистка $email = '([email protected])'; ! $sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL); if

    (filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) { echo "This (c) sanitized email address is considered valid.\n"; echo "Before: $email\n"; echo "After: $sanitized_email\n"; }
  36. Загрузка файлов • Проверять тип файла PHP функциями • Выключить

    вывод списков файлов для директорий загрузки и возможность выполнять файлы в них • Можно располагать директории загрузок вне Document root