Урок 21: Выборка из БД и вывод на экран

План:

  • PHP + MySQLi + SELECT

Домашка:

Отсутствует. Данный урок является дополнением к 20-ому.

Дополнение к уроку:

Правила безопасного кода достаточно простые - это применять нужные функции в нужном месте. При этом нет смысла впадать в безумие и применять их даже когда не надо. Допустим если мы пишем: $x = 1; echo $x; , то тут подразумевается, что $x всегда будет равна 1, а значит ничего применять не надо. А вот данные, которые пришли из-вне, или в содержании которых Вы не уверены, тогда стоит действовать по следующим правилам. Данные могут прийти из сессии, из кук, из формы POST или адресной строки GET, или же вы пользуетесь сторонней библиотекой, которая должна вернуть определённые данные, всем им не стоит доверять! Правила защиты очень просты:
Для чисел мы применяем: (int), (float), вне зависимости добавляем ли мы эти числа в БД (База Данных MySQL), или выводим на экран. При добавлении в MySQL числа пишем без кавычек.
Для строк в MySQL: мы пишем в кавычках, а так же применяем mysqli_real_escape_string.
Для строк, которые выводим на экран: htmlspecialchars.
$res = mysqli_query($link,"
    SELECT *
    FROM `users`
    WHERE `login` = '".mysqli_real_escape_string($link,$_POST['login'])."'
      AND `age` = ".(int)$_POST['age']."
");
$row = mysqli_fetch_assoc($res);
echo (int)$row['age'];
echo htmlspecialchars($row['login']);

Лично я проверяю безопасность следующим образом - ввожу во все поля строчку:
`'"<b>text</b>

Если mysqli_real_escape_string забыли применить, то выходит ошибка MYSQL. Не забывайте проверить то, что я пишу, чтобы имели представление о чём я говорю. Если при выводе информации на экран выводится текст жирным, то значит Вы забыли прописать htmlspecialchars, если же вы его прописали, то на экран выведутся кавычки, знак меньше, b, знак больше, text, знак меньше, слэш, b, знак больше. :)
Ошибка в MySQL называется SQL-Inj (SQL-Injection), ошибка в HTML называют XSS-Inj (XSS-Injection).

теперь давайте разберёмся как работает fetch_assoc. Он выбирает следующую запись. Допустим у нас в таблице есть 10 пользователей и мы пишем следующий код:
$res = mysqli_query($link,"
    SELECT *
    FROM `users`
");
while($row = mysqli_fetch_assoc($res)) { // закончили на 11-ой записи
    echo $row['login'];
}
while($row = mysqli_fetch_assoc($res)) { // Не сработает, 12-ой не существует
    echo $row['id'];
}

В цикле мы вызываем функцию, пока она возвращает TRUE (любое содержание). Когда курсор среди выбранных записей передвигается на 11-ую позицию, то функция как бы отвечает "всё, записи закончились" и возвращает NULL, null как и false обрывает цикл, записей больше нет. Запуская второй цикл курсор до сих пор остаётся на 11-ой позиции и при вызове функции fetch_assoc у нас функция пытается выбрать следующую запись, а именно 12-ую, которой не существует, поэтому снова возвращает NULL и цикл не проходит ни одной итерации. Иду на опережение, в качестве академических знаний рассказываю, вернуть курсор на нулевую позицию можно при помощи функции mysqli_data_seek, в реальной же практике эта функция очень редко применяется и на протяжении этого курса она не нужна!

Если в форму ввести длинный текст без пробелом, то при выводе в DIV у нас появится горизонтальная прокрутка (не забудьте проверить, горизонтальная - это слева направо), так же текст уезжает за границу сайта вправо, исправляется это при помощи CSS свойства для DIV:
word-wrap:break-words;

Мы не верстаем таблицами, но в качестве академических знаний скажу, что break-words не работает для TD, если для таблицы не применять свойство table-layout:fixed;

Есть ещё функция nl2br, которую необходимо применять для textarea, когда человек вводит текст с переносами на новую строчку. При простом выводе его текста: echo $row['text'] переносы не будут работать, текст будет в одну строку выводиться, именно тут и надо применить nl2br функцию.

Под каждым уроком есть 10 тестов, которые помогут Вам закрепить пройденный материал.
Один из тестов будет развивать Вашу логику и интеллект!
Чтобы получить доступ к тестам - авторизируйтесь!


0%
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы