Урок 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 тестов, которые помогут Вам закрепить пройденный материал.
Один из тестов будет развивать Вашу логику и интеллект!
Чтобы получить доступ к тестам — авторизируйтесь!
Как вывести данные из MySQL при помощи PHP?
Есть таблица news , в ней 5 полей id, text, title, author, date . Необходимо вывести на странице эти данные. У меня никак не получается это сделать: все время какие-либо ошибки. Пробовал использовать функцию mysql_fetch_assoc , но что-то, как ее применять, я не очень понял постоянно — одна и та же ошибка expects parameter 1 to be resource, boolean . Я, конечно, понимаю, что это значит, но вот как исправить — нет.
$news = mysql_query("SELECT * FROM `news` "); while ($row = mysql_fetch_assoc($news, MYSQL_ASSOC)) < foreach ($row as $col_value) < print "\t\t$col_value \n"; > >
Отслеживать
1,695 2 2 золотых знака 23 23 серебряных знака 47 47 бронзовых знаков
задан 16 авг 2012 в 11:31
45 1 1 золотой знак 2 2 серебряных знака 6 6 бронзовых знаков
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Вообще-то все очень просто, функций для работы с MySQL из PHP много (смотрите документацию). Вот небольшой пример вывода данных:
$db_host=''; // ваш хост $db_name=''; // ваша бд $db_user=''; // пользователь бд $db_pass=''; // пароль к бд mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);// включаем сообщения об ошибках $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name); // коннект с сервером бд $mysqli->set_charset("utf8mb4"); // задаем кодировку $result = $mysqli->query('SELECT * FROM `table_name`'); // запрос на выборку while($row = $result->fetch_assoc())// получаем все строки в цикле по одной < echo 'Запись id'].'. Текст: '.$row['text'].'
';// выводим данные >
Как вывести данные из объединенной таблицы в php?
В уроке 60 было задание убрать столбец с описанием из таблицы в отдельную, затем объединить 3 таблицы и вывести данные из объединенной через PHP, с SQL запросом все получилось, но когда я пытаюсь вывести данные в php он мне выдает ошибку Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in C:\xampp\htdocs\kinomonster\index.php on line 183. Подскажите, где я ошибся. Код прилагается.
$mysqli->set_charset('utf8'); $query = $mysqli->query("SELECT * FROM 'movie' INNER JOIN descriptions ON descriptions.id = movie.description_id INNER JOIN categories ON categories.id = movie.category_id"); while ( $row = mysqli_fetch_assoc($query)) < echo $row['year']." ". $row[name]."
"; > ?>
Работа с MySQL в PHP
PHP поддерживает работу с базой данных MySQL. Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.
Что такое mysqli?
mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
- Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
- Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
- Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
- Убедиться, что запрос был выполнен успешно.
- Получить результат от СУБД в виде массива из записей.
- Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).
Функция mysqli connect: соединение с MySQL
Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД. В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
- Адрес сервера СУБД;
- Логин;
- Пароль.
Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’ , а при самостоятельной установке MySQL пароль вы задавали в одном из шагов мастера установки.
Базовый синтаксис функции mysqli_connect() :
mysqli_connect(, , , );
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным. Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвергать новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс. Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернёт логическое значение типа «ложь» — false . Хорошей практикой будет всегда проверять результат выполнения этой функции и сравнивать его с ложью.
Соединение с MySQL и проверка на ошибки:
else < print("Соединение установлено успешно"); >?>
Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: . . Вызовите эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента. Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
- Чтение информации (SELECT).
- Модификация (UPDATE, INSERT, DELETE).
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities .
Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.
Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.
Обратите внимание, что первым параметром для функции mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false , которое будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .
Функция insert id: как получить идентификатор добавленной записи
Следующим шагом будет добавление погодной записи для нового города. Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
Здесь пригодится функция mysqli_insert_id() . Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.
Теперь у нас есть всё необходимое, чтобы добавить погодную запись. Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
else < $sql = 'INSERT INTO cities SET name = "Санкт-Петербург"'; $result = mysqli_query($link, $sql); if ($result == false) < print("Произошла ошибка при выполнении запроса"); >else < $city_id = mysqli_insert_id($link); $sql = 'INSERT INTO weather_log SET city_id = ' . $city_id . ', day = "2017-09-03", temperature = 10, cloud = 1'; $result = mysqli_query($link, $sql); if ($result == false) < print("Произошла ошибка при выполнении запроса"); >> >
Чтение записей
Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT). Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.
В этом примере показано, как вывести все существующие города из таблицы cities :
В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result . В этой переменной находятся не данные из таблицы, а специальный тип данных — так называемая ссылка на результаты запроса.
Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку. Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.
Цикл while здесь используется для «прохода» по всем записям из полученного набора записей. Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.
Как получить сразу все записи в виде двумерного массива
Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет.
Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса. Перепишем пример с показом существующих городов с её использованием:
Как узнать количество записей
Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL-запрос. Это может помочь при организации постраничной навигации или просто в качестве информации. Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Вывод данных из MySql на PHP

Первое, что нам следует сделать для того, чтобы получить данные из таблицы базы данных, — установить соединение с БД.
Извлечь данные из таблицы MySql
После того, как мы установили соединение с БД, c помощью запроса можно получить данные из любой таблицы. А с помощью цикла while их вывести.
: рублей
"; > ?>
Теперь давайте разберем функции, которые мы использовали для вывода данных из MySql.
mysqli_connect
mysqli_connect(, , , ) — устанавливает соединение с базой данных.
mysqli_query
mysqli_query(, ) — выполняет запрос к БД, написанный на языке SQL.
mysqli_fetch_array
mysqli_fetch_array() — поочередно возвращает по одной строке из результата запроса.
Вывод переменной врутри строки
Заметьте, что если вы выводите строку оператором echo и строка заключена в двойные кавычки (именно двойные), то внутрь строки можно вставлять переменные в фигурных скобках и они будут подставленны в этот шаблон. Круто, да?
Понравилась или помогла статья? Самое лучшее, что ты можешь сделать — это поделиться ею в любой из своих соцсетей (даже если ты поделишься в твиттере или google+, которыми ты не пользуешься — это очень поможет развитию моего блога). Спасибо! А если ты еще и оставишь любой комментарий снизу в обсуждениях, то это будет двойное СПАСИБО!
mysql_list_fields
Данная функция объявлена устаревшей в PHP 5.4.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:
- SQL запрос: SHOW COLUMNS FROM sometable
Описание
mysql_list_fields ( string $database_name , string $table_name , resource $link_identifier = NULL ): resource
Возвращает информацию о таблице с переданным именем.
Эта функция устарела. Вместо неё рекомендуется использовать mysql_query() с SQL-запросом SHOW COLUMNS FROM table [LIKE ‘name’] .
Список параметров
Имя опрашиваемой базы данных.
Имя опрашиваемой таблицы.
Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect() . Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING .
Возвращаемые значения
Дескриптор результата ( resource ) в случае успешного выполнения, или false в случае возникновения ошибки.
Возвращаемый результат может быть обработан с помощью следующих функций: mysql_field_flags() , mysql_field_len() , mysql_field_name() и mysql_field_type() .
Примеры
Пример #1 Пример использования mysql_list_fields()
$result = mysql_query ( «SHOW COLUMNS FROM sometable» );
if (! $result ) echo ‘Ошибка при выполнении запроса: ‘ . mysql_error ();
exit;
>
if ( mysql_num_rows ( $result ) > 0 ) while ( $row = mysql_fetch_assoc ( $result )) print_r ( $row );
>
>
?>?php
Результатом выполнения данного примера будет что-то подобное:
Array ( [Field] => id [Type] => int(7) [Null] => [Key] => PRI [Default] => [Extra] => auto_increment ) Array ( [Field] => email [Type] => varchar(100) [Null] => [Key] => [Default] => [Extra] => )
Примечания
Замечание:
Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_listfields()
Смотрите также
- mysql_field_flags() — Возвращает флаги, связанные с указанным полем результата запроса
- mysql_info() — Возвращает информацию о последнем запросе
User Contributed Notes 7 notes
20 years ago
If you’re willing to use a lot of functions to get a little information about fields in a table, this function is for you. If you just want to get all the information you can find, you can use this:
// Taken from: http://ca.php.net/manual/en/function.mysql-field-flags.php
// Original by: amir at scrounch dot com
// Returns the name of the fields in the primary key for a table.
// Also keeps the fields in KEY order. Handy.
function getPrimaryKeyOf ( $table ) <
$keys = Array();
$query = sprintf ( «SHOW KEYS FROM `%s`» , $table );
$result = mysql_query ( $query ) or die( mysql_error ());
while ( $row = mysql_fetch_assoc ( $result )) if ( $row [ ‘Key_name’ ] == ‘PRIMARY’ )
$keys [ $row [ ‘Seq_in_index’ ] — 1 ] = $row [ ‘Column_name’ ];
>
// Returns a bunch of information about a table.
// The name of the auto-increment field, if any, fields in the
// primary key (using the function above), and all information
// about all fields.
function getTableInformationOf ( $table ) $information = array(
«auto» => «» ,
«primary» => array(),
«fields» => array()
);
$information [ ‘primary’ ] = $this -> getPrimaryKeyOf ( $table );
$result = mysql_query ( «DESC ` $table `» );
while ( $field = mysql_fetch_assoc ( $result ) ) $information [ ‘fields’ ][] = $field ;
if ( $field [ ‘Extra’ ] == «auto_increment» )
$information [ ‘auto’ ] = $field [ ‘Field’ ];
>
18 years ago
To make an array containing the names of a column from a table, you use the following simple script: (Note: using table1 with three columns)
$qColumnNames = mysql_query ( «SHOW COLUMNS FROM table1» , $db ) or die( «mysql error» );
$numColumns = mysql_num_rows ( $qColumnNames );
$x = 0 ;
while ( $x < $numColumns )
<
$colname = mysql_fetch_row ( $qColumnNames );
$col [ $colname [ 0 ]] = $colname [ 0 ];
$x ++;
>
/* it will have the following output
Array (
[firstcolumn] => firstcolumn
[secondcolumn] => secondcolumn
[thirdcolumn] => thirdcolumn
)
*/
?>
Or you can number the columns from zero. This help when using it in conjunction with mysql_fetch_row to get an array. You don’t have to remember which number of the array a certain column is.
$qColumnNames = mysql_query ( «SHOW COLUMNS FROM table1» , $db ) or die( «mysql error» );
$numColumns = mysql_num_rows ( $qColumnNames );
$x = 0 ;
while ( $x < $numColumns )
<
$colname = mysql_fetch_row ( $qColumnNames );
$col [ $colname [ 0 ]] = $x ;
$x ++;
>
/* it will have the following output
Array (
[firstcolumn] => 0
[secondcolumn] => 1
[thirdcolumn] => 2
)
*/
?>
To use it in conjuction with mysql_fetch_row:
$row = mysql_fetch_row ( «SELECT * from table1» , $db ) or die( «mysql error» );
?>
You can now call $row[col[firstcolumn]]. This becomes useful when you have a lot of columns.
11 years ago
Below script is used to get all coloumn indormation of an table.When we are working custome ORM then we need to match the coloumn name with array keys.
function getColoumn ( $table ) <
$result = mysql_query ( «SHOW COLUMNS FROM » . $table );
if (! $result ) <
echo ‘Could not run query: ‘ . mysql_error ();
>
$fieldnames =array();
if ( mysql_num_rows ( $result ) > 0 ) <
while ( $row = mysql_fetch_assoc ( $result )) <
$fieldnames [] = $row [ ‘Field’ ];
>
>
21 years ago
mysql_list_fields() retrieves information about the given table name but you can use something like mysql_fetch_field to retrieve the field names from a result source.
16 years ago
Every my html table output begins with heading row containing the field names. For that purpose I accepted the short combination of MySQL function, giving me a result similar to the mysql_fetch_array() for the row of values. The following example shows the basic idea. It should be adapted for the specific use:
//.
$field_names = array_keys ( mysql_fetch_array ( mysql_query ( $query , $link ), MYSQL_ASSOC ));
//.
?>
The advantage of this is, that it gives the names of the result, neither the field names of the whole table.
Please read the discussion about duplicate field names in SQL result carefully. The use, as shown in the example above, increments the pointer, hence some regular function, which does not, could be more useful 🙂
17 years ago
Note, using mysql_list_fields will change the currently selected database so subsequent mysql_query operations will be on the database in param 1 not the one selected with mysql_select_db
Работа с MySQL в PHP
PHP поддерживает работу с базой данных MySQL. Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.
Что такое mysqli?
mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
- Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
- Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
- Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
- Убедиться, что запрос был выполнен успешно.
- Получить результат от СУБД в виде массива из записей.
- Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).
Функция mysqli connect: соединение с MySQL
Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД. В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
- Адрес сервера СУБД;
- Логин;
- Пароль.
Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’ , а при самостоятельной установке MySQL пароль вы задавали в одном из шагов мастера установки.
Базовый синтаксис функции mysqli_connect() :
mysqli_connect(, , , );
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным. Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвергать новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс. Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернёт логическое значение типа «ложь» — false . Хорошей практикой будет всегда проверять результат выполнения этой функции и сравнивать его с ложью.
Соединение с MySQL и проверка на ошибки:
else < print("Соединение установлено успешно"); >?>
Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: . . Вызовите эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента. Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
- Чтение информации (SELECT).
- Модификация (UPDATE, INSERT, DELETE).
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities .
Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.
Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.
Обратите внимание, что первым параметром для функции mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false , которое будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .
Функция insert id: как получить идентификатор добавленной записи
Следующим шагом будет добавление погодной записи для нового города. Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
Здесь пригодится функция mysqli_insert_id() . Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.
Теперь у нас есть всё необходимое, чтобы добавить погодную запись. Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
else < $sql = 'INSERT INTO cities SET name = "Санкт-Петербург"'; $result = mysqli_query($link, $sql); if ($result == false) < print("Произошла ошибка при выполнении запроса"); >else < $city_id = mysqli_insert_id($link); $sql = 'INSERT INTO weather_log SET city_id = ' . $city_id . ', day = "2017-09-03", temperature = 10, cloud = 1'; $result = mysqli_query($link, $sql); if ($result == false) < print("Произошла ошибка при выполнении запроса"); >> >
Чтение записей
Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT). Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.
В этом примере показано, как вывести все существующие города из таблицы cities :
В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result . В этой переменной находятся не данные из таблицы, а специальный тип данных — так называемая ссылка на результаты запроса.
Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку. Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.
Цикл while здесь используется для «прохода» по всем записям из полученного набора записей. Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.
Как получить сразу все записи в виде двумерного массива
Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет.
Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса. Перепишем пример с показом существующих городов с её использованием:
Как узнать количество записей
Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL-запрос. Это может помочь при организации постраничной навигации или просто в качестве информации. Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Как вывести данные из MySQL при помощи PHP?
Есть таблица news , в ней 5 полей id, text, title, author, date . Необходимо вывести на странице эти данные. У меня никак не получается это сделать: все время какие-либо ошибки. Пробовал использовать функцию mysql_fetch_assoc , но что-то, как ее применять, я не очень понял постоянно — одна и та же ошибка expects parameter 1 to be resource, boolean . Я, конечно, понимаю, что это значит, но вот как исправить — нет.
$news = mysql_query("SELECT * FROM `news` "); while ($row = mysql_fetch_assoc($news, MYSQL_ASSOC)) < foreach ($row as $col_value) < print "\t\t$col_value \n"; > >
Отслеживать
1,695 2 2 золотых знака 23 23 серебряных знака 47 47 бронзовых знаков
задан 16 авг 2012 в 11:31
45 1 1 золотой знак 2 2 серебряных знака 6 6 бронзовых знаков
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Вообще-то все очень просто, функций для работы с MySQL из PHP много (смотрите документацию). Вот небольшой пример вывода данных:
$db_host=''; // ваш хост $db_name=''; // ваша бд $db_user=''; // пользователь бд $db_pass=''; // пароль к бд mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);// включаем сообщения об ошибках $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name); // коннект с сервером бд $mysqli->set_charset("utf8mb4"); // задаем кодировку $result = $mysqli->query('SELECT * FROM `table_name`'); // запрос на выборку while($row = $result->fetch_assoc())// получаем все строки в цикле по одной < echo 'Запись id'].'. Текст: '.$row['text'].'
';// выводим данные >
