Отправка запросов к базе данных в PHP
В этой статье мы научимся отправлять запросы к базе данных через PHP. Данная статья очень важная, и её необходимо Вам обязательно понять. Однако, успокою Вас - материал очень простой, поэтому затруднений быть не должно.
Прежде, чем перейти к теме статьи, я заранее предупреждаю, что не буду подробно разбирать язык SQL. Вся необходимая информация разбирается в категории, посвящённой языку SQL, а здесь мы только работаем с MySQL через PHP.
Теперь переходим к отправке запросов к базе данных в PHP:
<?php
$mysqli = @new mysqli('localhost', 'Admin', 'pass', 'mybase');
if (mysqli_connect_errno()) {
echo "Подключение невозможно: ".mysqli_connect_error();
}
$mysqli->query('INSERT INTO mytable (name, email) VALUES ("MyName", "[email protected]")');
$mysqli->close();
?>
В данном примере мы подключились к базе данных, проверили успешность подключения, отправили запрос с помощью метода query(), а затем закрыли подключение. Как видите, всё очень просто. Для отправки любых SQL-запросов достаточно всего одного метода - query(), поэтому в данном случае всё безумно просто.
Теперь чуть-чуть усложним задачу. Давайте с Вами разберём запросы, которые возвращают result_set - результат. Самый популярный запрос, возврающающий result_set - это выборка данных из таблицы. В следующем примере мы с Вами сделаем выборку данных, а затем выведем результат:
<?php
$mysqli = @new mysqli('localhost', 'Admin', 'pass', 'mybase');
if (mysqli_connect_errno()) {
echo "Подключение невозможно: ".mysqli_connect_error();
}
$result_set = $mysqli->query('SELECT * FROM mytable');
while ($row = $result_set->fetch_assoc()) {
print_r($row);
echo "<br />";
}
$result_set->close();
$mysqli->close();
?>
Для начала немного поясню, что из себя представляет result_set. Result_set - это таблица с результатом. У этой таблицы есть набор записей (строки таблицы). И для вывода всех записей надо перебрать каждую строку таблицы и вывести её. А теперь поясняю пример: после отправки запроса у нас формируется result_set. Затем мы в цикле присваиваем переменной row значение очередной строки, то есть одномерный массив, который возвращает метод fetch_assoc(). Когда все строки закончатся, метод fetch_assoc() вернёт false, и будет произведён выход из цикла. Внутри цикла while мы просто выводим массив с использованием отладочной функции print_r(), хотя, безусловно, можно было бы вывести с использованием foreach, но сейчас это не нужно.
Давайте кратко подведём итог, как нужно работать с result_set:
- Получить result_set, отправив соответствующий запрос к базе данных.
- В цикле на каждой итерации присваивать следующую строку (запись) из result_set с использованием метода fetch_assoc() некоторой переменной row. Дальше Вы можете работать с этой переменной как с одномерным ассоциативным массивом, у которого ключи - это названия полей таблицы, а значения соответствуют текущей записи.
- Обязательно закройте result_set методом close(), чтобы осводить ресурсы.
Как Вы заметили, метод fetch_assoc() возвращает всегда следующую запись. То есть сначала 1-ю, потом 2-ю, потом 3-ю и так далее. Если у Вас есть неплохой опыт программирования, то Вы сразу догадаетесь, что это происходит благодаря внутреннему указателю, который Вы, разумеется, можете двигать. Где это используется? Например, это может использоваться, когда Вам необходимо поработать с result_set не 1, а 2 и более раз. Чтобы заново не формировать тот же запрос, можно просто передвинуть указатель в начало. И тогда можно снова заниматься перебором result_set с помощью метода fetch_assoc().
Для изменения положения указателя существует метод data_seek(), который принимает целое число от 0 до "количества записей - 1", соответственно указатель встаёт на соответствующую параметру запись:
<?php
$mysqli = @new mysqli('localhost', 'Admin', 'pass', 'mybase');
if (mysqli_connect_errno()) {
echo "Подключение невозможно: ".mysqli_connect_error();
}
$result_set = $mysqli->query('SELECT * FROM mytable');
$result_set->num_rows;
while ($row = $result_set->fetch_assoc()) {
print_r($row);
echo "<br />";
}
$result_set->data_seek(0);
while ($row = $result_set->fetch_assoc()) {
print_r($row);
echo "<br />";
}
$result_set->close();
$mysqli->close();
?>
В этом примере мы вывели количество записей в result_set с помощью свойства num_rows. А также познакомились с методом data_seek(). То есть мы перебрали весь результат, затем вернули указатель на 0-ю запись и вновь перебрали результат.
В этой статье мы с Вами повторили подключение к базе данных и закрытие подключения. А также узнали, как отправлять запросы к базе данных через PHP. Узнали, как получать result_set и как работать с ним. Это всё, что Вам необходимо знать для успешной работы с MySQL в PHP.
-
- Михаил Русаков
Комментарии (41):
А можно ли с пом. data_seek() перейти на одну позицию назад? Т.е. задать относительное значение?
Ответить
К сожалению, простого пути нет. Это реализуется путём подсчёта количества вызовов fetch_assoc() и последующим вызовом функции data_seek() с параметром "счётчик - 1". Это и будет предыдущая запись.
Ответить
только num_rows в скрипте никак не используется. а так - полезнейшая функция!
Ответить
Михаил, а есть разница - работать с объектом mysqli и пользоваться обычными php-функциями mysql_connect(), mysql_query() и т.д.?
Ответить
Никакой разницы нет, единственное, что через объекты работать более удобно (на мой взгляд, так как я уже давно привык к ООП).
Ответить
Михаил, при попытке вывести содержимое базы данных выдаёт такую штуку Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\marvel\www\marvel\index.php on line 7 Чё делать, шэф?
Ответить
Скорее всего, ошибка в запросе.
Ответить
Есть index.html. И есть index.php, который выводит содержимое базы данных (например). Как заставить index.php выводить информацию через index.html?
Ответить
Не должно быть 2 index-файла, это, как минимум, глупо.
Ответить
Ну предположим, что второй называется baza.php. Как работать то заставить?
Ответить
А первый как?
Ответить
baza.php выводит содержимое бд, а index.html - главная страница. Как сделать так, чтобы index.html выводил то, что выводит baza.php?
Ответить
Для этого он должен стать index.php, и вставить там: <?php require_once "baza.php"; ?>
Ответить
есть код <?php $mysqli = @new mysqli('localhost', 'Admin', 'admin', 'name'); if (mysqli_connect_errno()) { echo "Подключение невозможно: ".mysqli_connect_error(); } $result_set = $mysqli->query('SELECT * FROM pizza'); while ($row = $result_set->fetch_assoc()) { print_r($row); echo "<br />"; } $mysqli->close(); ?> Например будет так... при нажатии на одну из 4 кнопок должна вывести строка из база которая имеет этот номер. Я правильно понимаю что надо сделать?: 1.сделать это код функцией с переменной x например. 2. при нажатии на кнопку он будит посылать запрос к этой функции с каким то значением. Интересен вопрос как сделать чтобы код выдавал значение 1 pizza1 100 и так далее вместо Array ( [id] => 1 [name] => pizza1 [price] => 100 ) . И не важно куда он будет это выдавать?? или надо сделать например текстовое поле ? Или же вообще все не так и надо писать джава скрипт который будит посылать запрос к пшп и потом от туда принимать значения и выводить их тоже куда-то? Посоветуйте как подойти к вопросу.
Ответить
Я, помнится, Вам уже давал рекомендацию почитать про массивы. Вы почему её настойчиво игнорируете? Вы понятия не имеете, что это такое, забудьте о базе данных, рано ещё. Читайте про массивы, Вы не умеете с ними работать, отсюда и Ваши вопросы.
Ответить
Если вы сделали уже fetch_assoc(); то вам нужно просто при выводе делать так : echo<<<HERE $row[id] $row[name] HERE; // и так далее,тоесть подставлять в кавычки поля базы данных... Это просто пример вывода,дальше и я вам советую реально учиться работать с массивами(это очень просто,не бойтесь их учить,я их выучил когда увидел их пример и всё,и вам советую лазить по гуглу и смотреть примеры их написания и работы с ними...и не забудьте посмотреть их синтаксис,это очень важно) Я надеюсь что немного вам помог
Ответить
Не подскажите, как сделать так, что бы в базу заносились данные из переменных, а не названия переменных. При работе данного скрипта, у меня в базу попадает $fio вместо Иванов Иван Иванович. Пробовал без кавычек, вообще запись в базу не попадает тогда. Где я ошибся? <?PHP $fio = $_POST['fio']; $name = $_POST['name']; $mysqli = @new mysqli($server, $sql_user, $sql_pass, $sql_base); if (mysqli_connect_errno()) { echo "Подключение невозможно: ".mysqli_connect_error(); } else $mysqli->query('INSERT INTO `klients` (`id`, `fio`, `name`) VALUES (NULL, "$fio", "$name")'); $mysqli->close(); ?>
Ответить
Разобрался сам. Поменял одинарные кавычки на двойные, а двойные на одинарные. Всё заработало. $mysqli->query("INSERT INTO `klients` (`id`, `fio`, `name`) VALUES (NULL, '$fio', '$name')");
Ответить
Добрый день. На странице выполняется скрипт добавления записи в таблицу базы данных. Ну так вот. После добавления в браузере появляется надписьс дерективой из .htaccses: header("Content-Type: text/html;charset=utf-8"). Как сделать так, чтоб на странице оставалась HTML-форма и это окно не появлялось.
Ответить
После обработки формы сделать редирект на страницу с формой: header("Location: ".$_SERVER["HTTP_REFERER"]; exit;
Ответить
Мишаня! Допиши, не поленись! while ($row = $result_set->fetch_assoc()) { echo $row['name'] . ' '; echo $row['text_comment'] . ' '; echo "<br />"; }
Ответить
Если Вы про комментарии, то писать это бессмысленно, поскольку везде своя вёрстка и свой формат вывода. Вы вообще никакого форматирования не сделали, никто так не выводит вообще. print_r() - это классический универсальный пример вывода готового массива, который уже можно использовать, если обладать базовыми вещами о массивах. А уже как и кто будет выводить, зависит от конкретной задачи, которых бесконечное множество.
Ответить
Здравствуйте, Михаил. Помогите, пожалуйста с возникшей проблемой. Делаю выборку из таблицы: $mysqli->query("SELECT * FROM $table"); И когда $table ввожу вручную, все работает. А мне надо вставить переменную, как результат выборки из другой таблицы. Причем в $table содержится именно то имя таблицы, которое мне нужно. Но в результате - ошибка. Как здесь быть?
Ответить
Чудес не бывает, значит, что-то другое и содержится. Сделайте для начала echo "SELECT * FROM $table" и посмотрите.
Ответить
Дело в том, что если вместо $table я вставляю `cat1` (имя таблицы) всё в порядке. Если $table: echo $table - результат `cat1`... Но результат: "Call to a member function fetch_assoc() on a non-object". Может с кодировкой что не так, или с типом переменной?
Ответить
Так что выводится при echo?
Ответить
При echo вообще ничего. После выборки из первой таблицы получается набор переменных, в т. ч. и $table. но при переходе на новую выборку, $table теряется.
Ответить
Так вот и ищите, где $table теряется, в этом и вся проблема.
Ответить
Как вариант. Может быть, выборка осуществляется внутри функции, а переменная $table объявлена вне функции?
Ответить
Здравствуйте , у меня возникает проблема с присоединением к базе. $userIP = $_SERVER["REMOTE_ADDR"]; $mydb = @ new mysqli ('localhost','root','','questiondb'); if (mysqli_connect_errno()) { echo "Conection error:".mysqli_connect_error(); } $mydb->query('INSERT INTO ipt (ip) VALUES ("$userIP")');// This doesn't works. $result_set = $mydb->query('SELECT ip FROM ipt'); while($row = $result_set->fetch_assoc()) { $row = result_set $print_r($row); // Here i have the mistake . echo"<br />"; } $result_set->close(); $mydb->close(); сделал , вроде бы, всё как вы прописали , но таблицы остаются непоколебимы даже в случае простого заполнения. что можно с этим сдлеать ?
Ответить
Пишите запросы в двойных кавычках, а данные в одинарных. И проверяйте наличие чего-то в таблице через phpmyadmin.
Ответить
Михаил, подсажите, пожалуйста, как получить массив значений полей одной конкретной строки? Я так понимаю, что в запросе "... WHERE field_1=title_1" не прокатит?
Ответить
Прокатит, если title_1 уникален.
Ответить
Спасибо, что обнадежили! Это дало мне сил, а то чуть глаза не сломал ;). Просто в запросе "title_1" надо было писать (в кавычках, блин). Работает! D)
Ответить
Друзья мои, я так рад! Я нашел ошибку, над которой мучился очень долго (пару недель наверное). Я думал, что ошибка в коде, а оказалось, что проблема была в базе данных. Я назвал поле в таблице "data", а обращался к нему как к "date"
Ответить
Михаил в этой строке ошибка $mysqli = @new mysqli('localhost', 'Admin', 'pass', 'mybase'); вот правильный вариант $mysqli = new mysqli('localhost', 'Admin', 'pass', 'mybase');
Ответить
Это не ошибка. @ используется для подавления ошибок.
Ответить
Спасибо, очень полезная информация Классный сайт
Ответить
Здравствуйте Михаил, если не затруднит, можете помочь: в чем здесь ошибка <?php $log = $_POST['login']; $pass = $_POST['pass']; $name = $_POST['oname']; $subname = $_POST['subname']; $nomer = $_POST['nomer']; $mysqli = @new mysqli('localhost', 'tima', '666', 'rai`'); if (mysqli_connect_errno()) { echo "Подключение невозможно: ".mysqli_connect_error(); } $mysqli->query('INSERT INTO table1 (Логин, пароль, Имя, Фамилия, Номер) values ('$log', '$pass', '$name', '$subname', '$nomer')') $mysqli->close(); ?>
Ответить
Пожалуйста в службу поддержки напишите. И используйте для вставки кода сервис типа pastebin.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.