<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Отправка запросов к базе данных в PHP

Отправка запросов к базе данных в 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", "myname@mail.ru")');
  $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:

  1. Получить result_set, отправив соответствующий запрос к базе данных.
  2. В цикле на каждой итерации присваивать следующую строку (запись) из result_set с использованием метода fetch_assoc() некоторой переменной row. Дальше Вы можете работать с этой переменной как с одномерным ассоциативным массивом, у которого ключи - это названия полей таблицы, а значения соответствуют текущей записи.
  3. Обязательно закройте 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.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (41):

sync.o sync.o 13.07.2011 15:02:14

А можно ли с пом. data_seek() перейти на одну позицию назад? Т.е. задать относительное значение?

Ответить

Admin Admin 14.10.2011 02:05:11

К сожалению, простого пути нет. Это реализуется путём подсчёта количества вызовов fetch_assoc() и последующим вызовом функции data_seek() с параметром "счётчик - 1". Это и будет предыдущая запись.

Ответить

sync.o sync.o 14.07.2011 17:23:48

только num_rows в скрипте никак не используется. а так - полезнейшая функция!

Ответить

sync.o sync.o 14.10.2011 01:56:28

Михаил, а есть разница - работать с объектом mysqli и пользоваться обычными php-функциями mysql_connect(), mysql_query() и т.д.?

Ответить

Admin Admin 14.10.2011 02:00:50

Никакой разницы нет, единственное, что через объекты работать более удобно (на мой взгляд, так как я уже давно привык к ООП).

Ответить

Сорокин Сорокин 23.05.2012 13:20:58

Михаил, при попытке вывести содержимое базы данных выдаёт такую штуку Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\marvel\www\marvel\index.php on line 7 Чё делать, шэф?

Ответить

Admin Admin 23.05.2012 13:35:37

Скорее всего, ошибка в запросе.

Ответить

Сорокин Сорокин 23.05.2012 14:12:17

Есть index.html. И есть index.php, который выводит содержимое базы данных (например). Как заставить index.php выводить информацию через index.html?

Ответить

Admin Admin 23.05.2012 14:14:04

Не должно быть 2 index-файла, это, как минимум, глупо.

Ответить

Сорокин Сорокин 23.05.2012 14:24:29

Ну предположим, что второй называется baza.php. Как работать то заставить?

Ответить

Admin Admin 23.05.2012 14:25:14

А первый как?

Ответить

Сорокин Сорокин 23.05.2012 14:36:13

baza.php выводит содержимое бд, а index.html - главная страница. Как сделать так, чтобы index.html выводил то, что выводит baza.php?

Ответить

Admin Admin 23.05.2012 14:40:26

Для этого он должен стать index.php, и вставить там: <?php require_once "baza.php"; ?>

Ответить

Сорокин Сорокин 24.05.2012 03:08:29

есть код <?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 ) . И не важно куда он будет это выдавать?? или надо сделать например текстовое поле ? Или же вообще все не так и надо писать джава скрипт который будит посылать запрос к пшп и потом от туда принимать значения и выводить их тоже куда-то? Посоветуйте как подойти к вопросу.

Ответить

Admin Admin 24.05.2012 06:34:18

Я, помнится, Вам уже давал рекомендацию почитать про массивы. Вы почему её настойчиво игнорируете? Вы понятия не имеете, что это такое, забудьте о базе данных, рано ещё. Читайте про массивы, Вы не умеете с ними работать, отсюда и Ваши вопросы.

Ответить

malina95 malina95 05.10.2012 21:00:47

Если вы сделали уже fetch_assoc(); то вам нужно просто при выводе делать так : echo<<<HERE $row[id] $row[name] HERE; // и так далее,тоесть подставлять в кавычки поля базы данных... Это просто пример вывода,дальше и я вам советую реально учиться работать с массивами(это очень просто,не бойтесь их учить,я их выучил когда увидел их пример и всё,и вам советую лазить по гуглу и смотреть примеры их написания и работы с ними...и не забудьте посмотреть их синтаксис,это очень важно) Я надеюсь что немного вам помог

Ответить

dsmts dsmts 02.01.2013 18:57:52

Не подскажите, как сделать так, что бы в базу заносились данные из переменных, а не названия переменных. При работе данного скрипта, у меня в базу попадает $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(); ?>

Ответить

dsmts dsmts 02.01.2013 19:10:11

Разобрался сам. Поменял одинарные кавычки на двойные, а двойные на одинарные. Всё заработало. $mysqli->query("INSERT INTO `klients` (`id`, `fio`, `name`) VALUES (NULL, '$fio', '$name')");

Ответить

ivan26 ivan26 05.01.2013 14:59:56

Добрый день. На странице выполняется скрипт добавления записи в таблицу базы данных. Ну так вот. После добавления в браузере появляется надписьс дерективой из .htaccses: header("Content-Type: text/html;charset=utf-8"). Как сделать так, чтоб на странице оставалась HTML-форма и это окно не появлялось.

Ответить

Admin Admin 05.01.2013 18:14:38

После обработки формы сделать редирект на страницу с формой: header("Location: ".$_SERVER["HTTP_REFERER"]; exit;

Ответить

yurashura yurashura 24.01.2013 12:23:34

Мишаня! Допиши, не поленись! while ($row = $result_set->fetch_assoc()) { echo $row['name'] . ' '; echo $row['text_comment'] . ' '; echo "<br />"; }

Ответить

Admin Admin 24.01.2013 21:03:44

Если Вы про комментарии, то писать это бессмысленно, поскольку везде своя вёрстка и свой формат вывода. Вы вообще никакого форматирования не сделали, никто так не выводит вообще. print_r() - это классический универсальный пример вывода готового массива, который уже можно использовать, если обладать базовыми вещами о массивах. А уже как и кто будет выводить, зависит от конкретной задачи, которых бесконечное множество.

Ответить

AlexTesla AlexTesla 18.03.2013 20:41:47

Здравствуйте, Михаил. Помогите, пожалуйста с возникшей проблемой. Делаю выборку из таблицы: $mysqli->query("SELECT * FROM $table"); И когда $table ввожу вручную, все работает. А мне надо вставить переменную, как результат выборки из другой таблицы. Причем в $table содержится именно то имя таблицы, которое мне нужно. Но в результате - ошибка. Как здесь быть?

Ответить

Admin Admin 18.03.2013 21:37:54

Чудес не бывает, значит, что-то другое и содержится. Сделайте для начала echo "SELECT * FROM $table" и посмотрите.

Ответить

AlexTesla AlexTesla 18.03.2013 22:27:58

Дело в том, что если вместо $table я вставляю `cat1` (имя таблицы) всё в порядке. Если $table: echo $table - результат `cat1`... Но результат: "Call to a member function fetch_assoc() on a non-object". Может с кодировкой что не так, или с типом переменной?

Ответить

Admin Admin 19.03.2013 11:50:37

Так что выводится при echo?

Ответить

AlexTesla AlexTesla 19.03.2013 13:34:19

При echo вообще ничего. После выборки из первой таблицы получается набор переменных, в т. ч. и $table. но при переходе на новую выборку, $table теряется.

Ответить

Admin Admin 19.03.2013 21:37:31

Так вот и ищите, где $table теряется, в этом и вся проблема.

Ответить

vegas vegas 09.04.2013 03:13:12

Как вариант. Может быть, выборка осуществляется внутри функции, а переменная $table объявлена вне функции?

Ответить

lammer lammer 05.04.2013 21:46:49

Здравствуйте , у меня возникает проблема с присоединением к базе. $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(); сделал , вроде бы, всё как вы прописали , но таблицы остаются непоколебимы даже в случае простого заполнения. что можно с этим сдлеать ?

Ответить

Admin Admin 06.04.2013 11:18:50

Пишите запросы в двойных кавычках, а данные в одинарных. И проверяйте наличие чего-то в таблице через phpmyadmin.

Ответить

vegas vegas 09.04.2013 03:19:58

Михаил, подсажите, пожалуйста, как получить массив значений полей одной конкретной строки? Я так понимаю, что в запросе "... WHERE field_1=title_1" не прокатит?

Ответить

Admin Admin 09.04.2013 10:55:08

Прокатит, если title_1 уникален.

Ответить

vegas vegas 09.04.2013 15:20:37

Спасибо, что обнадежили! Это дало мне сил, а то чуть глаза не сломал ;). Просто в запросе "title_1" надо было писать (в кавычках, блин). Работает! D)

Ответить

Олег Олег 04.08.2013 16:50:15

Друзья мои, я так рад! Я нашел ошибку, над которой мучился очень долго (пару недель наверное). Я думал, что ошибка в коде, а оказалось, что проблема была в базе данных. Я назвал поле в таблице "data", а обращался к нему как к "date"

Ответить

kir1234 kir1234 15.09.2013 11:42:30

Михаил в этой строке ошибка $mysqli = @new mysqli('localhost', 'Admin', 'pass', 'mybase'); вот правильный вариант $mysqli = new mysqli('localhost', 'Admin', 'pass', 'mybase');

Ответить

Admin Admin 15.09.2013 16:29:08

Это не ошибка. @ используется для подавления ошибок.

Ответить

11221122 11221122 25.10.2013 00:30:46

Спасибо, очень полезная информация Классный сайт

Ответить

timur.02.01.1997 timur.02.01.1997 24.12.2014 18:10:30

Здравствуйте Михаил, если не затруднит, можете помочь: в чем здесь ошибка <?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(); ?>

Ответить

tikkiwiki tikkiwiki 24.12.2014 20:02:17

Пожалуйста в службу поддержки напишите. И используйте для вставки кода сервис типа pastebin.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.