Как получить данные из базы данных mysql php на сайт
Для получения данных в MySQL применяется команда SELECT . Например, получение всех данных из таблицы Users:
SELECT * FROM Users
Рассмотрим получение данных на примере таблицы Users, созданной в прошлых, которая имеет следующее определение:
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)
Объектно-ориентированный стиль
При выполнении команды SELECT метод query() объекта mysqli возвращает набор полученных строк, который мы можем перебрать с помощью цикла. Например, перебор с помощью цикла foreach :
$sql = "SELECT * FROM Users"; if($result = $conn->query($sql)) < foreach($result as $row)< $userid = $row["id"]; $username = $row["name"]; $userage = $row["age"]; >>
Здесь $result представляет набор строк. Каждый его элемент, который передается в переменную $row , хранит данные отдельной строки в виде ассоциативного массива, где ключи элементов — названия столбцов.
Вместо цикла foreach также можно использовать другие виды циклов. Например, применение цикла while :
$sql = "SELECT * FROM Users"; if($result = $conn->query($sql))< while($row = $result->fetch_array()) < $userid = $row["id"]; $username = $row["name"]; $userage = $row["age"]; >>
В данном случае метод $result->fetch_array() выбирает текущую строку из набора в переменную $row и переходит к следующей. Когда строк не останется, метод возвратит false , и произойдет выход из цикда. Полученное значени $row опять же представляет строку в виде ассоциативного массива.
После окончания работы с полученным набором строк мы можем очистить отведенную для него память с помощью метода free() :
$result->free();
Теперь посмотрим на примере. Определим скрипт index.php , которая будет выводить значения из таблицы Users:
METANIT.COM Список пользователей
connect_error)< die("Ошибка: " . $conn->connect_error); > $sql = "SELECT * FROM Users"; if($result = $conn->query($sql))< $rowsCount = $result->num_rows; // количество полученных строк echo "Получено объектов: $rowsCount
"; echo "
| Id | Имя | Возраст |
|---|---|---|
| " . $row["id"] . " | "; echo "" . $row["name"] . " | "; echo "" . $row["age"] . " | "; echo "
Таким образом, при обращении к скрипту index.php браузер отобразит список данных, полученных из БД:
Дополнительно стоит отметить, что с помощью свойства $result->num_rows мы можем получить количество строк, извлеченных из БД.
Процедурный стиль
При процедурном стиле функция mysqli_query() при успешном выполнении команды SELECT возвращает набор строк, который можно перебрать с помощью цикла:
$sql = "SELECT * FROM Users"; if($result = mysqli_query($conn, $sql)) < foreach($result as $row)< $userid = $row["id"]; $username = $row["name"]; $userage = $row["age"]; >>
Как и при объектно-ориентированном подходе, полученные строки представляют ассоциативные массивы, где ключи элементов — названия столбцов.
Пример перебоа с помощью цикла while :
$sql = "SELECT * FROM Users"; if($result = mysqli_query($conn, $sql)) < while($row = mysqli_fetch_array($result))< $userid = $row["id"]; $username = $row["name"]; $userage = $row["age"]; >>
Функция mysqli_fetch_array() выбирает текущую строку из набора в переменную $row и переходит к следующей. Когда строк не останется, метод возвратит false , и произойдет выход из цикла.
После окончания работы с полученным набором строк мы можем очистить отведенную для него память с помощью функции mysqli_free_result() , в которую передается полученный набор строк:
mysqli_free_result($result);
METANIT.COM Список пользователей
$sql = "SELECT * FROM Users"; if($result = mysqli_query($conn, $sql))< $rowsCount = mysqli_num_rows($result); // количество полученных строк echo "Получено объектов: $rowsCount
"; echo "
| Id | Имя | Возраст |
|---|---|---|
| " . $row["id"] . " | "; echo "" . $row["name"] . " | "; echo "" . $row["age"] . " | "; echo "
Вывод данных из MySql на PHP

Первое, что нам следует сделать для того, чтобы получить данные из таблицы базы данных, — установить соединение с БД.
Извлечь данные из таблицы MySql
После того, как мы установили соединение с БД, c помощью запроса можно получить данные из любой таблицы. А с помощью цикла while их вывести.
: рублей
"; > ?>
Теперь давайте разберем функции, которые мы использовали для вывода данных из MySql.
mysqli_connect
mysqli_connect(, , , ) — устанавливает соединение с базой данных.
mysqli_query
mysqli_query(, ) — выполняет запрос к БД, написанный на языке SQL.
mysqli_fetch_array
mysqli_fetch_array() — поочередно возвращает по одной строке из результата запроса.
Вывод переменной врутри строки
Заметьте, что если вы выводите строку оператором echo и строка заключена в двойные кавычки (именно двойные), то внутрь строки можно вставлять переменные в фигурных скобках и они будут подставленны в этот шаблон. Круто, да?
Понравилась или помогла статья? Самое лучшее, что ты можешь сделать — это поделиться ею в любой из своих соцсетей (даже если ты поделишься в твиттере или google+, которыми ты не пользуешься — это очень поможет развитию моего блога). Спасибо! А если ты еще и оставишь любой комментарий снизу в обсуждениях, то это будет двойное СПАСИБО!
Урок 21: Выборка из БД и вывод на экран
Правила безопасного кода достаточно простые — это применять нужные функции в нужном месте. При этом нет смысла впадать в безумие и применять их даже когда не надо. Допустим если мы пишем: $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']);
Лично я проверяю безопасность следующим образом — ввожу во все поля строчку:
`'"text
Если 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 тестов, которые помогут Вам закрепить пройденный материал.
Один из тестов будет развивать Вашу логику и интеллект!
Чтобы получить доступ к тестам — авторизируйтесь!
Взаимодействие PHP и MySQL
После установки и настройки базы данных MySQL можно приступать к написанию сценариев PHP для взаимодействия с базой данных. В настоящей статье приведено описание всех основных функций, позволяющих передавать данные в прямом и обратном направлениях от веб-сайта к базе данных. Информация, касающаяся создания базы данных MySQL, приведена в предыдущей статье «Проектирование базы данных», в примерах ниже мы будем использовать созданные таблицы тестовой базы users (если не хотите прорабатывать примеры из предыдущей статьи можете воспользоваться дампом базы данных users).
Неважно, насколько простые или сложные у вас сценарии, если они общаются с базой данных, они начинаются с одних и тех же нескольких действий:
- Подключение к установленной базе данных MySQL.
- Использование команды USE в отношении нужной базы данных MySQL.
- Отправка SQL базе данных.
- Получение результатов.
- Обработка результатов.
Действия 3, 4 и 5 будут изменяться в зависимости от характера выполняемой работы. Сценарий, создающий таблицы, немного отличается от сценария, который ведет поиск в существующих таблицах. Но первые два действия — подключение к MySQL и использование нужной базы данных — всегда одни и те же, независимо от предназначения сценария.

Расширения mysql и mysqli
PHP предлагает на выбор разработчику два расширения для работы с базами данных MySQL. Расширение mysql предоставляет процедурный интерфейс и предназначено для использования с MySQL версии 4.1.3 или более ранними версиями. Его также можно использовать и с более свежими версиями СУБД, но в этом случае многие возможности сервера, появившиеся после версии 4.1.3, будут недоступны программисту.
Расширение mysqli, или как его еще называют улучшенное (improved) MySQL расширение, было разработано, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL сервера версий 4.1.3 и выше. Расширение mysqli включается в поставку PHP версий 5 и выше. mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:
- Объектно-ориентированный интерфейс;
- Поддержка подготавливаемых запросов;
- Поддержка мультизапросов;
- Поддержка транзакций;
- Улучшенные возможности отладки;
- Поддержка встроенного сервера.
Наравне с объектно-ориентированным расширение предоставляет и процедурный интерфейс. В последующих примерах я буду использовать расширение mysqli, т.к. mysql является устаревшим.

Подключение к базе данных MySQL
Сначала нужно сообщить вашему PHP-сценарию, как нужно подключиться к базе данных. Этот процесс, по сути, сообщает PHP, что нужно делать то же самое, что вы выполняли, начиная работу со своим клиентом командной строки MySQL. Чтобы подключиться к базе данных, PHP нужно будет передать следующую информацию: имя хоста вашей базы данных, имя пользователя, пароль и имя базы данных.
Запустите свой текстовый редактор и создайте новый сценарий, назвав его connect.php. Сценарий должен быть как можно проще, потому что вам нужно всего лишь подключиться к своей базе данных, воспользоваться с помощью команды USE необходимой базой данных и запустить пробный SQL-запрос, чтобы убедиться, что все работает. Введите в сценарий следующие строки:
'.mysqli_connect_errno().' - '.mysqli_connect_error().''); > echo "Вы подключились к MySQL!
";
Если база данных запускается на той же машине, на которой находятся PHP и файлы обслуживания сети, хост-именем базы данных будет, как правило, localhost, которое означает «локальная машина». После создания этого файла его удобно будет подключать на страницах сайта:
Основы PHP и MySQL
Вот так все просто! И хотя здесь есть несколько новых для вас команд, вы, наверное, уже знаете почти все, что происходит в этом сценарии. Сначала в нем используется новая команда: mysqli_connect. Она просто получает имя хоста базы данных, имя пользователя, пароль, имя базы данных и осуществляет подключение. Происходит все то же самое, как и при запуске окна командной строки mysql и подключении к удаленной базе данных. В случае успешного выполнения этой команды она возвращает ресурс, содержащий ссылку на подключение к базе данных; если установить подключение не удалось функция mysqli_connect() возвращает значение false — мы проверяем это в условном операторе и, если соединения нет, прекращаем дальнейшее выполнение сценариев и выводим сообщение об ошибке.
Функция mysqli_connect_errno() возвращает код ошибки, а mysqli_connect_error() — текст ошибки. Если инструкция mysqli_connect сумела создать подключение без всяких проблем, она возвращает это подключение, PHP пропустит строку с инструкцией die, а затем выведет строку «Вы подключились к MySQL!».

Выбор кодировки
Довольно часто встречается ситуация, когда сайт создается в одной кодировке, а база данных использует другую, например в базе данных установлена кодировка utf8_general_ci, а на сайте — utf8. Получается, что содержимое (в том числе и навигация сайта выводится в кодировке utf8, а информация из базы данных — в utf8_general_ci). В результате одновременно прочитать вывод из базы данных и страницу сайта не удастся, кодировки-то разные. В качестве примера добавьте к исходной странице следующий сценарий (все дополнительные функции которые здесь используются будут описаны ниже):
В моем случае вывод окажется следующем:

В этом случае нужно установить требуемую кодировку для базы данных. Это можно сделать с помощью следующего запроса, который должен быть первым запросом после подключения к базе данных (измените файл connect.php):
'.mysqli_connect_errno().' - '.mysqli_connect_error().''); > mysqli_query($link, "SET NAMES utf8"); echo "Вы подключились к MySQL!
";
В результате будет получен корректный вывод данных:


Вывод SQL-результатов
После подключения к нужной базе данных вы должны увидеть, с чем именно можно работать. В качестве примера создадим простой сценарий для для просмотра таблиц, доступных в вашей базе данных:
Здесь используется еще одна новая для вас функция перехода от PHP к MySQL: mysqli_query(). При выполнении команды mysqli_query() фактически происходит выборка данных из базы данных и передача интерпретатору PHP своего рода квитанции, содержащей информацию о состоянии выполнения операции. К этому моменту данные передаются во временное хранилище, которое не является непосредственно доступным ни из среды MySQL, ни из среды PHP; это хранилище можно рассматривать как своего рода промежуточную область. Необходимые данные уже на месте, но ожидают того момента, когда поступит команда на их передачу пользователю. Чтобы данные стали полностью доступными в среде PHP, требуется одна из функций выборки с префиксом mysqli_fetch:
| Функция | Описание |
|---|---|
| mysqli_fetch_row() | Возвращает строку в виде массива с числовым индексом. |
| mysqli_fetch_object() | Возвращает строку в виде объекта. |
| mysqli_fetch_array() | Возвращает строку в виде ассоциативного массива. |
В нашем примере мы использовали функцию mysqli_fetch_row() позволяющую осуществить выборку из базы данных информации, содержащейся в указанных строках, таким образом, чтобы каждая строка вывода содержала данные из одной строки или информацию, связанную с уникальным идентификатором (если таковой имеется). Для доступа к элементам массива с числовым индексом применяются обозначения в виде целых чисел в квадратных скобках, называемых смещениями полей. Следует помнить, что такие смещения всегда начинаются с целочисленного нуля. А если в ходе доступа отсчет начат с единицы, то будет пропущено значение из первого столбца.

Объектно-ориентированный интерфейс mysqli
В представленном выше примере мы использовали процедурный стиль программирования с использованием расширения mysqli. Однако, одним из главных его преимуществ является то, что он поддерживает объекты, которые позволяют легко сгруппировать функции по цели их применения. В следующей таблице представлены все объекты расширения mysqli:
| Класс | Описание |
|---|---|
| mysqli | Представляет связь между PHP и базой данных MySQL |
| mysqli_driver | Позволяет выполнять остановку-запуск встроенного сервера |
| mysqli_result | Представляет результирующий набор, полученный из запроса в базу данных |
| mysqli_sql_exception | Специальный класс исключений mysqli |
Эти классы содержат огромное количество свойств и методов которые вы можете изучить по приведенной ссылке — MySQLi Summary. Я же перепишу предыдущий пример с выводом таблиц в объектно-ориентированном стиле (немного усложним этот пример и выведем данные таблиц):
connect_error) < die(''.$link->connect_errno.' - '.$link->connect_error.'
'); > $link->query("SET NAMES utf8"); echo "Вы подключились к MySQL!
";
Исходный файл
> ?>Основы PHP и MySQL /* Стилизация таблиц */ table < border-collapse:separate; border:none; border-spacing:0; margin:8px 12px 18px 6px; line-height:1.2em; margin-left:auto; margin-right:auto; overflow: auto >table th < font-weight:bold; background:#666; color:white; border:1px solid #666; border-right:1px solid white >table th:last-child < border-right:1px solid #666 >table caption < font-style:italic; margin:10px 0 20px 0; text-align:center; color:#666; font-size:1.2em >tr < border:none >td < border:1px solid #666; border-width:1px 1px 0 0 >td, th < padding:15px >tr td:first-child < border-left-width:1px >tr:last-child tdquery('SHOW TABLES'); // В случае неудачного запроса генерируем исключение if (!$result) throw new MySQL_Exception($link->error); // Пример вставки данных в таблицу $link->query("INSERT INTO customers VALUES (NULL, 'Андрей', 'Петров', '+7-920-555-55-55')"); // Отображаем результаты echo 'Таблицы, имеющиеся в базе данных:
'; while ($row = $result->fetch_row()) < // Усложним задачу отобразив структуру таблиц echo "'; > > catch (Exception $ex) < echo 'Ошибка при работе с MySQL: '.$ex->getMessage().''; > ?>
"; // Получить названия столбцов $result1 = $link->query("SELECT * FROM "); if (!$result1) throw new MySQL_Exception($link->error); for($i = 0; $i < $link->field_count; $i++) < $field_info = $result1->fetch_field(); echo " '; // Получить данные while ($row1 = $result1->fetch_row()) < echo 'name> "; > echo ''; foreach($row1 as $_column) < echo ""; > echo " "; > echo '
