Мы научились подключаться серверу MySQL, выбирать базу данных для работы, узнали PHP-функцию отправки запросов серверу MySQL, узнали два простейших запроса (создание и удаление таблицы), ну и узнали как закрывать соединение.
Теперь мы будем более глубоко изучать запросы MySQL. Итак, приступим!
Создание таблицы - CREATE TABLE
Сейчас у нас пустая база данных, в ней нет таблиц. Поэтому сначала создадим таблицу. Мы уже знаем как это делать из первой части.
Вот код скрипта, который создаст нужную нам табличку:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))"; if (mysqli_query($link, $query)) echo "Таблица создана."; else echo "Таблица не создана: ".mysqli_error(); mysqli_close($link);
В нашей таблице только два поля: логин и пароль. Пока что нам больше не нужно, не будем усложнять процесс.
Итак, таблица создана.
Добавление строк (записей) в таблицу - INSERT
Добавить новую строку в таблицу можно при помощи SQL команды insert. Вот пример:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "INSERT INTO users (login, password) VALUE ("zeus", "pass123")"; if (mysqli_query($link, $query)) echo "Пользователь добавлен."; else echo "Пользователь не добавлен: " . mysqli_error(); mysqli_close($link);
SQL запрос состоит из команды INSERT INTO , имени базы данных users, затем в скобках идут имена полей, потом слово VALUE , после которого в скобках следуют добавляемые значения. Значения берутся в кавычки.
Синтаксис запроса выглядит так:
INSERT INTO имя_таблицы (столбец1, столбец2) VALUE ("х1", "х2")
Кавычки во вторых скобках обязательны.
На месте значений могут быть переменные. Вот пример:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $login = "zeus"; $password = "pass123"; $query = "INSERT INTO users (login, password) VALUE ("$login", "$password")"; if (mysqli_query($link, $query)) echo "Пользователь добавлен."; else echo "Пользователь не добавлен: " . mysqli_error(); mysqli_close($link);
Конечно, в этом примере мало смысла. Возможно, новичкам будет полезно услышать, что так в базу данных записываются логины и пароли, которые сообщают пользователи при регистрации. Эти данные хранятся в переменных, потом, после проверки, записываются в базу.
Существует быстрый способ вставки нескольких строк одним запросом INSERT:
INSERT INTO users (login, password) VALUE ("bob", "eee333"), ("Rooki", "12345"), ("magy", "olol88e8")
Как видим, перечисляемые данные просто отделены запятыми.
Итак, при помощи команды INSERT мы научились добавлять записи в таблицу. Идём дальше.
Просмотр таблицы: команда SELECT
Теперь у нас есть таблица users, в которой есть строки. Прошлый скрипт можно запустить несколько раз, и каждый раз он будет добавлять строку в таблицу. Теперь мы можем не знать, сколько у нас строк в таблице. А хочется знать что у нас в ней записано.
Для получения данных из таблицы используется SQL-команда SELECT . Знак * обозначает что мы запрашиваем все данные, затем после слова FROM пишем имя таблицы, из которой хотим получить данные.
Запросим все данные из таблицы users:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены"; mysqli_close($link);
Функция mysqli_query() вернула нам идентификатор результата запроса - мы его помещаем в переменную и в дальнейшем будем работать с ним при помощи других функций PHP.
Число записей в запросе
Давайте определим сколько строк в нашем запросе? Я вот запустил скрипт добавления записи в таблицу сам не помню сколько раз и теперь не знаю сколько строк в моей таблице.
Для определения числа строк в результате запроса используют функцию mysqli_num_rows() . Этой функции передаётся идентификатор результата запроса, а вернёт она число записей.
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены"; $count = mysqli_num_rows($result); echo "Всего строк в таблице: $count."; mysqli_close($link);
Если нам нужно узнать число записей в таблице, то приведённый способ не самый подходящий. Тут мы узнали число записей, найденных в запросе, но число записей в таблице ищется по другому.
Число записей в таблице SELECT COUNT(*)
Чтобы узнать число записей в таблице можно воспользоваться командой SELECT COUNT(*) FROM имя_таблицы.
$link = mysqli_connect("localhost", "root", ""); if (!$link) die("Error"); mysqli_select_db("tester"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены. "; $count = mysqli_fetch_row($result); echo "Всего строк в таблице: $count."; mysqli_close($link);
Обратите внимание, тут мы использовали новую функцию PHP mysqli_fetch_row() для получения данных. Эта функция возвращает ряд результата запроса в форме простого массива, в нашем случае в ряду одно поле и оно имеет индес 0.
Просмотр результата запроса в цикле
После выполнения SQL-запроса с командой SELECT и получения идентификатора результата запроса, PHP создаёт в наборе записей результата внутренний указатель. Этот указатель автоматически перемещается на следующую запись, после обращения к текущей записи. Благодаря этому механизму набор результа запроса SELECT очень удобно просматривать в цикле.
В PHP есть несколько функций, при помощи которых можно дла каждой строки результирующего запроса получить массив, состоящий из её полей. Для примера возьмём функцию mysqli_fetch_row() . Этой функции передают идентификатор запроса, а возвращает она массив. Так в цикле просматривается весь результат запроса, по достижению конца результата запроса функция вернёт false .
Итак, запрашиваем все данные из таблицы users (SELECT * FROM users).
";
while ($row = mysqli_fetch_row($result))
{
echo "Логин: $row. Пароль: $row.
";
}
mysqli_close($link);
Функция mysqli_fetch_row() возвращает простой массив. В каждой итерации цикла мы получим массив с строкой из таблицы, доступ к полям которой мы можем получить указав числовой индекс.
То же самое можно сделать используя функцию mysql_fetch_assoc() , она возвращает ассоциативный массив.
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
$result = mysqli_query($link, "SELECT * FROM users");
if (!$result) echo "Произошла ошибка: " . mysqli_error();
else echo "Данные получены.
";
while ($row = mysqli_fetch_assoc($result))
{
echo "Логин: $row. Пароль: $row.
";
}
mysqli_close($link);
Также есть функции mysqli_fetch_array() - возвращает любой тип массива, и mysqli_fetch_object() - возвращает объект.
Запрос SELECT DISTINCT - уникальные значения полей
Давайте создадим новую таблицу:
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
// удаляем существующую таблицу
mysqli_query($link, "DROP TABLE users");
// создаём новую таблицу
$query = "CREATE TABLE users(name VARCHAR(20),
surname VARCHAR(20),
age TINYINT UNSIGNED)";
if (mysqli_query($link, $query)) echo "Таблица создана.
";
else echo "Таблица не создана: " . mysqli_error();
// функция для добавления записей в таблицу
function add_new_line($link, $query)
{
if (!mysqli_query($link, $query)) echo "Пользователь не добавлен: " . mysqli_error();
}
// добавляем записи
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Max", "Jayson", "33")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Bob", "Freeman", "26")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Sara", "Lopes", "65")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Serg", "Pupin", "29")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Serg", "Borman", "43")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Max", "Lopes", "21")");
// выводим содержание таблицы в браузер
$result = mysqli_query($link, "SELECT * FROM users");
if (!$result) echo "Произошла ошибка: " . mysqli_error();
else echo "Данные получены.
";
while ($row = mysqli_fetch_assoc($result))
{
echo "Имя: $row. Фамилия: $row. Возраст: $row.
";
}
mysqli_close($link);
Итак, мы имеем новую, более сложную таблицу с уникальными записями. Сейчас давайте посмотрим, сколько у нас имён в базе данных.
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
$result = mysqli_query($link, "SELECT DISTINCT name FROM users");
echo "Всего имён: " . mysqli_num_rows($result)."
";
echo "Список имён:
";
while ($name = mysqli_fetch_row($result))
{
echo "$name
";
}
mysqli_close($link);
SQL-запрос " SELECT DISTINCT name FROM users " вернул результат со всеми уникальными именами в нашей таблице. Каждое уникальное имя в новой строке результата запроса.
Сортировка результата - ORDER BY
Добавив в SQL-запрос команду ORDER BY мы сортируем результат запроса по возрастанию (цифры и буквы по алфавиту). Вот пример, в котором можно сравнить обычный запрос и отсортированный по возрасту (поле age).
";
}
echo "Сортируем по возрасту:
";
$result = mysqli_query($link, "SELECT * FROM users ORDER BY age");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Можете заменить поле age в команде ORDER BY на поле name и посмотреть результат.
Чтобы сортировать результат запроса в обратном порядке используйте команду ORDER BY age DESC .
Соответствие условию - WHERE
Добавив в SQL-запрос команду WHERE мы запросим только те записи, которые соответствуют условию. Например, сделаем запрос на людей младше 30 лет.
Для этого используем SQL-запрос " SELECT * FROM users WHERE age
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Люди младше 30:
";
$result = mysqli_query($link, "SELECT * FROM users WHERE age<30");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Также мы можем сразу отсортировать результат по возрастанию age:
" SELECT * FROM users WHERE age<30 ORDER BY age ".
Если мы сделаем запрос " SELECT name FROM users WHERE age<30 ORDER BY age ", то в результате нам вернут только значения поля "name", но они также будут отсортированы по age.
Мы можем запросить значения двух полей: " SELECT name, age FROM users WHERE age
Теперь запросим все пользователей, с именем "Max".
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Все Максы:
";
$result = mysqli_query($link, "SELECT * FROM users WHERE name="Max"");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
И ещё пример запроса, - выберет только имена (name) из таблицы users, все кроме Max.
SELECT name FROM users WHERE name!="Max"
На этом с запросом WHERE всё.
Ограничение записей - LIMIT
Добавив в SQL-запрос команду LIMIT мы ограничим размер результата.
Запрос, который выводит первые три записи: " SELECT * FROM users LIMIT 3 ". Давайте посмотрим как он работает:
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Содержание таблицы:
";
$result = mysqli_query($link, "SELECT * FROM users");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
echo "
Первые три записи:
";
$result = mysqli_query($link, "SELECT * FROM users LIMIT 3");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
echo "
Вторые три записи:
";
$result = mysqli_query($link, "SELECT * FROM users LIMIT 3, 3");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Также тут мы использовали запрос: " SELECT * FROM users LIMIT 3, 3 ". Вторая тройка указывает смещение в результате запроса.
Соответствие шаблону - LIKE
Язык SQL поддерживает простые шаблоны. Для этого используется команда LIKE и шаблон задаётся с использованием символа % .
Вот пример запроса, который вернёт все записи с именами, начинающимися на букву S.
SELECT * FROM users WHERE name LIKE "S%"
Тестирую запрос:
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Содержание таблицы:
";
$result = mysqli_query($link, "SELECT * FROM users");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
echo "
Имена на букву S:
";
$result = mysqli_query($link, "SELECT * FROM users WHERE name LIKE "S%"");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Вот пример запроса, который вернёт все записи с фамилиями, заканчивающимися на букву s.
SELECT * FROM users WHERE name LIKE "%s"
Соответствие условию - IN
Этот запрос с использованием команды IN вернёт только те строки, которые строго соответствую условию.
Например, нас интересуют люди с возрастом 21, 26 и 33 года.
SELECT * FROM users WHERE age IN (21,26,33)
Тестирую запрос:
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Содержание таблицы:
";
$result = mysqli_query($link, "SELECT * FROM users");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
echo "
Люди, с требуемыми возрастами (21, 26, 33):
";
$result = mysqli_query($link, "SELECT * FROM users WHERE age IN (21, 26, 33)");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Максимальное и минимальное значение в столбце
Выбирает максимальное значение age в таблице users.
SELECT max(age) FROM users
Следующий запрос выбирает данные из таблицы users по полям name и age где age принимает минимальное значение.
SELECT name, min(age) FROM users
Обновление записи - UPDATE
Давайте Max Lopes установим возраст 15 лет. Это делается запросом MySQL:
UPDATE users SET age="15" WHERE name="Max" AND surname="Lopes"
Обратите внимание на новую команду AND (and - по английски значит "и") в запросе. Если мы не уточним фамилию, то возраст 15 лет будет установлен всем Максам в таблице.
Одним запросом можно обновить два и более полей в одной строке. Делается это следующим образом:
UPDATE users SET age = "18", surname = "Coocker" WHERE id = "3"
В нашей таблице нет поля id, так что этот запрос не сработает на ней. Но это поле, содержащее уникальные номера строк, мы обязательно выучим.
Удалить запись - DELETE
Запрос к базе данных MySQL для удаления записи:
DELETE FROM users WHERE id = "10"
Опять же, в нашей таблице нет поля id. Но мы можем удалить из неё всех людей, младше 18 лет.
DELETE FROM users WHERE age < "18"
Удалить таблицу - DROP TABLE
Запрос к базе данных MySQL который удаляет целиком таблицу users:
DROP TABLE users
Удалить столбец - ALTER TABLE ... DROP ...
Иногда может потребоваться удалить столбец из таблицы, давайте например удалим из users столбец age:
ALTER TABLE users DROP age
Этот запрос MySQL удалил столбец окончательно и безвозвратно.
Добавить столбец - ALTER TABLE ... ADD ...
Иногда может потребоваться добавить столбец в существующую таблицу, давайте например снова добавим в таблицу users столбец age:
ALTER TABLE users ADD age TINYINT UNSIGNED
Переименование столбца - ALTER TABLE ... CHANGE ...
Иногда может потребоваться переименовать столбец, например столбец age переименовать в vozrast. Делаем это так:
ALTER TABLE users CHANGE age vozrast TINYINT UNSIGNED
Этот запрос MySQL переименовал столбец age в vozrast с типом данных TINYINT UNSIGNED .
Переименование таблицы - RENAME TABLE ... TO ...
Иногда может потребоваться переименовать таблицу:
RENAME TABLE users TO peoples
Удаление базы данных - DROP DATABASE
Этот запрос может удалить базу данных с имененм tester:
DROP DATABASE tester
Создание базы данных - CREATE DATABASE
Этот запрос создаёт базу данных с имененм tester:
CREATE DATABASE tester
У меня на денвере этот запрос работает, но на хостинге может и не сработать, если у пользователя базы данных нет прав на выполнение удаления.
Итоги
Итак, в этой части мы ознакомились с запросами к MySQL. Многие из рассмотренных нами запросов нам не часто пригодятся в процессе работы, но знать их нужно, так как они точно пригодятся в процессе разработки скриптов.
Некоторые запросы обычно делают только из phpMyAdmin (создание и удаление баз данных например).
В работе сайтов обычно нужно добавить запись в таблицу, редактировать запись или удалить запись из таблицы.
Следующим шагом будет изучение типов данных в MySQL.
В связи с прекращением поддержки PHP MySQL в 2011 году для работы с базами данных все более широкое применение находят PDO или MySqli . Они обладают лучшей функциональностью (чем MySQL) и предлагают ООП (объектно-ориентированный интерфейс) API. Какой из них лучше, это тема для другой статьи, в этой статье мы попытаемся разобраться с основами работы с MySqli. Поэтому, без дальнейших предисловий, перейдем к рассмотрению соединения (connect), выбора (select), вставки (insert), обновления (update) и удаления (delete) записей (данных/документов/информации) посредством PHP MySqli. Надеюсь, что данная статья будет полезна при решении проблем, которые могут возникнуть при работе с PHP MySqli.
Установка MySqli
При использовании PHP версии 5.3.0 +, MySqli доступен по умолчанию; для более старых версий, чтобы сделать его доступным, надо включить php_mysqli.dll DLL внутри файла php.ini и отредактировать php.ini, раскоментировав строчку extension=php_mysqli.dll . В линуксе MySQLIi будет установлен автоматически при установке пакета PHP5 mysql. Более подробную информацию об установке в системах windows и linux можно найти .
Соединение с базой данных
MySqli предлагает два способа соединения с базой данных: процедурный и объектно-ориентированный. Рекомендуется использовать объектно-ориентированный. Процедурный похож на (старый) MySql, поэтому для новичков его использование, возможно, будет предпочтительней, стоит помнить, что им пользоваться не рекомендуется.
PHP
//процедурный стиль $mysqli = mysqli_connect("host","username","password","database_name"); //объектно-ориентированный стиль (рекомендуется) $mysqli = new mysqli("host","username","password","database_name");Ниже показано открытие соединения с базой данных объектно-ориентированным способом. Этот способ будет использоваться и во всех приведенных ниже примерах.
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } ?>Выбор (SELECT) результирующего ряда в виде ассоциативного массива
mysqli_fetch_assoc() : в приведенном ниже коде происходит извлечение результирующего ряда в виде ассоциативного массива. Возвращаемый массив содержит строки, полученные из базы данных, где имена столбцов будут являться ключом, используемым для доступа к внутренним данным. Как показана ниже, данные отображаются в виде HTML таблицы.
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } //MySqli Select Query $results = $mysqli->".$row["id"]." | "; print "".$row["product_code"]." | "; print "".$row["product_name"]." | "; print "".$row["product_desc"]." | "; print "".$row["price"]." | "; print "
Выбор (SELECT) результирующего ряда в виде массива (ассоциативный, обычный, или в оба)
Фукнция fetch_array() : возвращает массив с объединенным функционалом mysqli_fetch_row и mysqli_fetch assoc . Эта функция является расширенной версией функции mysqli_fetch_row() ; для доступа к данным можно использовать как строку, так и числа.
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc, price FROM products"); print "".$row["id"]." | "; print "".$row["product_code"]." | "; print "".$row["product_name"]." | "; print "".$row["product_desc"]." | "; print "".$row["price"]." | "; print "
Выбор (SELECT) результирующего ряда в виде объекта
fetch_object() : чтобы получить результирующий набор в виде объекта, нужно воспользоваться MySqli fetch_object() . Атрибуты объекта будут отображать имена полей, найденных внутри результирующего набора.
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc, price FROM products"); print "".$row->id." | "; print "".$row->product_code." | "; print "".$row->product_name." | "; print "".$row->product_desc." | "; print "".$row->price." | "; print "
Выбор (SELECT) одиночного значение
Одиночное значение получить из базы данных можно посредством fetch_object (метод Cameron Spear).
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } //chained PHP functions $product_name = $mysqli->query("SELECT product_name FROM products WHERE id = 1")->fetch_object()->product_name; print $product_name; //output value $mysqli->close(); ?>Извлекаем (SELECT COUNT) количество строк в таблице
Иногда нужно узнать количество строк в таблице, особенно при нумерации страниц.
PHP
connect_error) { die("Error: (". $mysqli->connect_errno .") ". $mysqli->connect_error); } //get total number of records $results = $mysqli->query("SELECT COUNT(*) FROM users"); $get_total_rows = $results->fetch_row(); //hold total records in variable $mysqli->close(); ?>Выбор (SELECT) с помощью шаблонов (prepared statements)
prepared statements - специальный инструмент СУБД, позволяющий ускорить последовательное выполнение повторяющихся запросов, построенных по одному и тому же шаблону.
Одной из особенностей MySqli является возможность использования уже написанных шаблонов: то есть запрос достаточно написать один раз, после чего его можно многократно исполнять с различными параметрами. Использование уже написанных шаблонов улучшает производительность для больших таблицах и сложных запросов. Для предотвращения попадания вредоносного кода анализ каждого запроса производится сервером отдельно.
Код ниже использует шаблон (Prepared statement), чтобы получать данные из базы данных. Заполнитель ? в запросе SQL играет роль маркера и будет замещен параметром, который, в свою очередь, может быть строкой, целым числом, double или blob. В нашем случае это строка $search_product .
PHP
$search_product = "PD1001"; //product id //create a prepared statement $query = "SELECT id, product_code, product_desc, price FROM products WHERE product_code=?"; $statement = $mysqli->prepare($query); //bind parameters for markers, where (s = string, i = integer, d = double, b = blob) $statement->bind_param("s", $search_product); //execute query $statement->execute(); //bind result variables $statement->".$id." | "; print "".$product_code." | "; print "".$product_desc." | "; print "".$price." | "; print "
Тот же запрос с несколькими параметрами:
PHP
$search_ID = 1; $search_product = "PD1001"; $query = "SELECT id, product_code, product_desc, price FROM products WHERE ID=? AND product_code=?"; $statement = $mysqli->prepare($query); $statement->bind_param("is", $search_ID, $search_product); $statement->execute(); $statement->bind_result($id, $product_code, $product_desc, $price); print "".$id." | "; print "".$product_code." | "; print "".$product_desc." | "; print "".$price." | "; print "
Вставка (INSERT) записи
Запись ниже вставляет в таблицу новый ряд.
PHP
real_escape_string("P1234")."""; $product_name = """.$mysqli->real_escape_string("42 inch TV")."""; $product_price = """.$mysqli->real_escape_string("600")."""; //MySqli Insert Query $insert_row = $mysqli->query("INSERT INTO products (product_code, product_name, price) VALUES($product_code, $product_name, $product_price)"); if($insert_row){ print "Success! ID of last inserted record is: " .$mysqli->insert_id .""; }else{ die("Error: (". $mysqli->errno .") ". $mysqli->error); } ?>
Отрывок ниже вставляет те же значения посредством шаблонов (Prepared Statement). Как мы уже говорили, шаблоны чрезвычайно эффективны против SQL инъекция. Для приведенного примера их использование является оптимальным вариантом.
PHP
//values to be inserted in database table $product_code = "P1234"; $product_name = "42 inch TV"; $product_price = "600"; $query = "INSERT INTO products (product_code, product_name, price) VALUES(?, ?, ?)"; $statement = $mysqli->prepare($query); //bind parameters for markers, where (s = string, i = integer, d = double, b = blob) $statement->bind_param("sss", $product_code, $product_name, $product_price); if($statement->execute()){ print "Success! ID of last inserted record is: " .$statement->insert_id .""; }else{ die("Error: (". $mysqli->errno .") ". $mysqli->error); } $statement->close();
Вставка (INSERT) нескольких записей
Вставка нескольких рядов одновременно осуществляется путем включения ряда значений столбцов, где каждый ряд значений должен быть обнесен скобками и отделен от других запятой. Иногда нужно узнать, сколько записей было вставлено, обновлено или удалено, для этого можно воспользоваться mysqli_affected_rows .
PHP
//product 1 $product_code1 = """.$mysqli->real_escape_string("P1")."""; $product_name1 = """.$mysqli->real_escape_string("Google Nexus")."""; $product_price1 = """.$mysqli->real_escape_string("149")."""; //product 2 $product_code2 = """.$mysqli->real_escape_string("P2")."""; $product_name2 = """.$mysqli->real_escape_string("Apple iPad 2")."""; $product_price2 = """.$mysqli->real_escape_string("217")."""; //product 3 $product_code3 = """.$mysqli->real_escape_string("P3")."""; $product_name3 = """.$mysqli->real_escape_string("Samsung Galaxy Note")."""; $product_price3 = """.$mysqli->real_escape_string("259")."""; //Insert multiple rows $insert = $mysqli->query("INSERT INTO products(product_code, product_name, price) VALUES ($product_code1, $product_name1, $product_price1), ($product_code2, $product_name2, $product_price2), ($product_code3, $product_name3, $product_price3)"); if($insert){ //return total inserted records using mysqli_affected_rows print "Success! Total " .$mysqli->affected_rows ." rows added."; }else{ die("Error: (". $mysqli->errno .") ". $mysqli->error); }
Обновление (Update)/удаление (Delete) записей
Принцип обновление и удаление записей тот же. Достаточно заменить строку запроса на MySql update или delete (не понял, сам смотри).
PHP
//MySqli Update Query $results = $mysqli->query("UPDATE products SET product_name="52 inch TV", product_code="323343" WHERE ID=24"); //MySqli Delete Query //$results = $mysqli->query("DELETE FROM products WHERE ID=24"); if($results){ print "Success! record updated / deleted"; }else{ print "Error: (". $mysqli->errno .") ". $mysqli->error; }Обновление с помощью шаблонов (prepared statements)
Пример обновления записи с помощью шаблонов (prepared statements) приведен ниже.
PHP
$product_name = "52 inch TV"; $product_code = "9879798"; $find_id = 24; $query = "UPDATE products SET product_name=?, product_code=? WHERE ID=?"; $statement = $mysqli->prepare($query); //bind parameters for markers, where (s = string, i = integer, d = double, b = blob) $results = $statement->bind_param("ssi", $product_name, $product_code, $find_id); if($results){ print "Success! record updated"; }else{ print "Error: (". $mysqli->errno .") ". $mysqli->error; }Удаление старых записей
Удалению подвергаются все записи, находящиеся на сервере больше 1 дня; количество дней можно задать самому.
PHP
//MySqli Delete Query $results = $mysqli-Вне сомнения, MySqli существенно лучше стандартного MySql расширения PHP, хотя принципы их работы довольно схожи. Надеюсь, приведенная выше информация окажется полезной при создании и переносе проектов в будущем. Для удобства ниже была реализована возможность скачать файлы примеров. Это можно сделать, нажав на кнопку download.
При помощи php...
Создание соединения с БД на PHP разными способами :
1) старый дедовский способ подключения к MySQL:
$conn=mysql_connect($db_hostname, $db_username, $db_password) or die ("Нет подключения к серверу");
mysql_select_db($db_database,$conn) or die ("Нет удалось соединиться с БД");
Пояснения к переменным ниже.
При этом используются функции:
- mysql_connect() - для подключения к серверу;
- mysql_select_db() - для подключения к БД;
При этом постоянно проверяем на наличие ошибки таким способом: or die ("Ошибка такая то"); - переводится как или умри с такой-то ошибкой - чтобы сразу найти где ошибка.
config.php
// переменные для соединения с БД
$host = "localhost"; / хост
$username = "root"; // пароль для подключения к БД
$password = ""; // пароль для подлючения к базе данных - на локальном компьютере он может иметь пустое значение.
$database_name = "my-dolgi"; // имя БД
// старый способ соедения с БД
mysql_connect($host, $username, $password) or die("Не могу соединиться создать соединение");
// выбрать БД. Если ошибка - вывести
mysql_select_db($database_name) or die(mysql_error());
index.php
require_once "config.php";
$result = mysql_query("SELECT Name, Money FROM Dolg ORDER BY Money DESC LIMIT 5") or die(mysql_error());
";
while ($row = mysql_fetch_assoc($result)) {
";
}
mysql_free_result($result);
// Закрываем соединение
mysql_close();
2) Более прогрессивный процедурный стиль - соединение с БД при помощи mysqli:
Данный способ:
- удобнее;
- быстрее до 40 раз;
- повышена безопасность;
- есть новые возможности и функции;
Пример соединения с БД на php с выборкой из таблицы
config.php
// соедения с БД
$link = mysqli_connect("localhost", "username", "password", "name-database"); // тут вводим прям данные ваши: имя юзера, пароль и имя БД, первое поле обычно localhost
// вывод ошибки соединения
if (!$link) {
echo "Ошибка подключения к БД. Код ошибки: " . mysqli_connect_error();
exit;
}
Обратите внимание - везде используется mysqli , а не mysql !!!
index.php
require_once "config.php";
// Выполнить запрос. Если ошибка - выводим
if ($result = mysqli_query
($link,
"SELECT Name, Money FROM Dolg ORDER BY Money DESC LIMIT 5")) {
Echo "Кому я должен по убыванию:
";
// Выборка результатов запроса
while ($row = mysqli_fetch_assoc
($result)) {
echo $row["Name"] . " с долгом " . $row["Money"] . " рублей.
";
}
// освобождение используемой памяти
mysqli_free_result
($result);
// Закрываем соединение
mysqli_close
($link
);
}
Как видим, некоторые моменты поменялись (выделены курсивом).
3) Объектно-ориентированный метод подключения к бд MySQL - с помощью методов и классов:
Минусы: сложнее и менее восприимчив к ошибкам.
Плюсы: краткость и удобство для программистов с опытом.
$conn = new mysqli($db_hostname, $db_username, $db_password, $db_database);
if($conn->connect_errno){
die($conn->connect_error);
} else {echo "Соединение с БД успешно установлено";}
тут в принципе все интуитивно понятно:
- $db_hostname - это хост (в основном localhost),
- $db_database - имя БД ;
- $db_username и $db_password - имя пользователя и пароль соответственно!
Пример соединения с БД на php стиль ООП с выборкой из таблицы
config.php
// соедения с БД
$mysqli = new mysqli ("localhost", "username", "password", "name-database"); // тут вводим прям данные ваши: имя юзера, пароль и имя БД, первое поле обычно localhost
// вывод ошибки соединения
if ($mysqli->connect_error) {
die ("Ошибка подключения к БД: (" . $mysqli->connect_errno . ") " . mysqli_connect_error) ;
}
Обратите внимание - везде используется mysqli , а не mysql !!! и в отличие от предыдущего метода появляются стрелочки "->", которые показывают, что это стиль ООП.
index.php
require_once "config.php";
// Выполнить запрос. Если ошибка - выводим
if ($result = $mysqli->query
("SELECT Name, Money FROM Dolg ORDER BY Money DESC LIMIT 5")) {
Echo "Кому я должен по убыванию:
";
// Выборка результатов запроса
while ($row = $result->fetch_assoc
()) {
echo $row["Name"] . " с долгом " . $row["Money"] . " рублей.
";
}
// освобождение используемой памяти
$result->close()
;
// Закрываем соединение
$mysqli->close
();
}
Задание вам такое - найти отличия.
4) Связь с БД при помощи PDO:
При соединении с базой данных MySQL используются подготовленные выражения(методом prepare) и в результате большая безопасность и сильно увеличивает быстродействие.
config файл от предыдущего метода! - такой же
index.php
// PDO стиль для связи с MySQL
if ($stmt = $mysqli->prepare("SELECT Name, Voney FROM Dolg ORDER BY Money < ? LIMIT 5")) {
$stmt->bind_param("i", $summa);
$summa = 100000;
//запускаем выполнение
$stmt->execute();
// Объявление переменных для заготовленных значений
$stmt->bind_result($col1, $col2);
Echo "Кому я должен по убыванию:
";
// Выборка результатов запроса
while ($stmt->fetch()) {
echo $col1 . " с долгом " . $col2 . " рублей.
";
}
// освобождение используемой памяти
$stmt->close();
// Закрываем соединение
$mysqli->close();
Как видим, тут намного сложнее и надо изучать PDO - это отдельная тема.
Свою базу я назвал "phptest". После нажатие на кнопку "Создать" Вас автоматом должно перекинуть в созданную Вами базу данных.
Создаем таблицу в базе данных
В этой процедуре тоже ничего сложного нет. Давайте создадим таблицу в которой мы будем хранить заголовок наших статей и непосредственно сам текст:
Как Вы могли заметить в количестве полей я поставил цифру 3, почему? Ведь нам нужно создать два поля, под заголовок и текст. Дело в том, что у таблицы в базе данных должно быть одно дополнительное поле. Для чего? Это поле представляет собой поочередный идентификационный номер, (то есть мы как бы считаем наши строки в таблице) таким образом мы получаем у каждой строчки таблицы свой неповторимый номер. Это пригодится для поиска нужной нам строки в базе данных. Поле это обычно называют id и выставляют ему AUTO_INCREMENT (покажу ниже где он выставляется). AUTO_INCREMENT позволяет присваивать каждой сточки свой неповторимый номер, тем самым Вы в таблице базы данных не встретите запись с одинаковым номером!
после заполнение имени и количество полей, жмет "ОК" попадаем на страницу создание полей. Признаюсь Вам я не особо понимаю что делаю при создание полей, но мне это не мешает с ними работать Заполним вот так:
И заполните два нужных нам поля:
Почему только два? Потому что первое поле id будет заполняться автоматически за счет AUTO_INCREMENT. Жмем "ОК". Теперь во вкладке "Обзор" можно увидеть созданную нами строчку в таблице:
Что ж, мы научились создавать таблицы и строки через панель phpmyadmin, это уже прогресс Кстати хочу отметить что интерфейс у этой панели интуитивно понятен, Вы вполне можете потыкать там кнопочки и разобраться что к чему
Пришло время научится создавать удалять и обновлять строки в созданных таблицах посредством php. Для того что бы Вы лучше восприняли то что я Вам говорю, будем писать небольшую админскую панель сайта, и походу дела я Вам расскажу что да как.
Вывод записей из базы данных
Начнем с этого, так как при создание какого либо проекта необходимо наглядно видеть процесс, а без вывода это очень сложно сделать (я буду работать с файлом test.php, не удивляйтесь когда увидите ссылки в коде на этот файл). Как будем выводить? Ну для начала нам необходимо подключиться к базе данных, после циклом do while (Изучаем PHP - Циклы) мы вытащим записи из базы данных. Приступим
Подключение к базе данных
Как осуществляется подключение? Внимание на синтаксис:
mysql_select_db(Название БД, mysql_connect(Сервер,Имя пользователя БД,Пароль пользователя БД));
Название базы данных, сервер пользователь и пароль создается Вами или предоставляется Вашим хостером. На примере локального сервера, вы создаете некоторые данные самостоятельно, или же пользуетесь уже созданными. Вот как будет выглядеть подключения к созданной мной базе данных:
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
Сервер, пользователь и пароль был создан по умолчанию (в данном случае можно сказать, что почти все данные нам предоставляет хостер). Из своих данных я лишь указал имя базы данных. Кстати, это php код, и поэтому должен находиться в спец скобках ()
Вывод данных
Нам необходимо вывести данные из таблицы page. Внимание на синтаксис вывода:
$result = mysql_query("SELECT Что вытаскиваем FROM имя таблицы в БД");
Первая строчка позволяет указать какие колонки нам необходимо вытащить, и из какой базы данных.
Вторая строчка помещает все найденное в переменную...
ВНИМАНИЕ есть пару моментов которые я бы хотел пояснить. Давайте решим несколько задач:
- Нам необходимо вытащить все поля из таблицы.
Как вытащить все поля из таблицы page? вот так:
$result = mysql_query("SELECT * FROM page");
$myrow = mysql_fetch_array($result);
Вы могли заметить, что я поставил звездочку (*) после SELECT. Звездочка означает, что мне необходимо извлечь все поля из таблицы
- Нам необходимо вытащить только одно поле из таблицы
Как вытащить только поле text из таблицы? вот так:
$result = mysql_query("SELECT text FROM page");
$myrow = mysql_fetch_array($result);
Для того что бы вытащить не все поля, а только некоторые, необходимо после SELECT через запятую перечислить необходимые поля.
- Нам необходимо вытащить поля не из все таблицы, а только из одной строчки
Как вытащить все поля из первой строчки? Нам известно что первая строчка имеет id равную единице, воспользуемся этими знаниями:
После SELECT я через запятую пояснил какие поля необходимо извлечь, после добавил новую строчку WHERE (что означает "где") id равен 1. Таким образом я вытаскиваю нужные мне поля из строки где id равен единице
Ну что ж, приступим к созданию вывода наших статей? Выводить будем только заголовки, приступим:
$myrow = mysql_fetch_array($result);
do
{
echo "".$myrow."
";
}
Что мы сделали? Мы вытащили из таблицы два поля, id и title. Далее запустили цикл do while (Изучаем PHP - Циклы) и сформировали ссылки, с помощью данных которые вывели из БД. Данные хранятся в переменной $myrow, эта переменная является массивом , ключами к массиву являются имена наших полей в базе данных. Вот что получилось:
Вывод заголовков есть, теперь давайте организуем вывод полных сообщений при щелчке мыши по ссылке с заголовком. Для того что бы это осуществить в одном файле, добавим условия if(){}:
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
$nameDB = "phptest";//Название БД
$nameSERVER = "localhost";//Сервер
$nameUSER = "root";//Имя пользователя БД
$passUSER = "";//Пароль пользователя БД
mysql_select_db($nameDB, mysql_connect($nameSERVER,$nameUSER,$passUSER));
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
//ВЫВОД ЗАГОЛОВКОВ
if(!isset($_GET["id"]))
{
$result = mysql_query("SELECT id,title FROM page");
$myrow = mysql_fetch_array($result);
do
{
echo "".$myrow."
";
}
while ($myrow = mysql_fetch_array($result));
}
//ВЫВОД ЗАГОЛОВКОВ
//ВЫВОД ПОЛНОГО ТЕКСТА
if(isset($_GET["id"]))
{
$myrow = mysql_fetch_array($result);
echo $myrow;
}
//ВЫВОД ПОЛНОГО ТЕКСТА
?>
Я добавил два условия. Список с заголовками мы будем видеть только в случае если не существует глобальная переменная $_GET["id"]. Полный же текст мы увидим только если эта переменная существует. При этом из базы данных мы будем выводить лишь одну нужную нам запись. Вот, что мы получили:
Теперь думаю пора научится добавлять новые строки в таблицу.
Добавление данных в БД
Добавление начнем с создание формы , вот кусочек кода который необходимо добавить в конец нашего файла:
//ФОРМА ДОБАВЛЕНИЕ ЗАПИСЕЙ
if(isset($_GET["add"]))
{
echo "
}
//ФОРМА ДОБАВЛЕНИЕ ЗАПИСЕЙ
Эта форма появиться только в случае если будет существовать глобальная переменная $_GET["add"], поэтому где-нить в низу необходимо вставить ссылку на добавление новой статьи. Лучше всего это сделать в коде вывода заголовков, так же можно отредактировать условие вывода наших заголовков вот так:
//ВЫВОД ЗАГОЛОВКОВ
if(!isset($_GET["id"]) AND !isset($_GET["add"]))
{
$result = mysql_query("SELECT id,title FROM page");
$myrow = mysql_fetch_array($result);
do
{
echo "".$myrow."
";
}
while ($myrow = mysql_fetch_array($result));
echo "
Добавить пост";
}
//ВЫВОД ЗАГОЛОВКОВ
Отредактировал условие таким образом, что бы список заголовков не появлялся при выводе формы, вот что получилось:
$result = mysql_query("INSERT INTO имя таблицы в БД (поле 1 БД,поле 2 БД) VALUES ("данные 1","данные 2")");
Сейчас напишем обработчик для нашей мини админки и вы все поймете . Вот кусочек кода, который я разместил сразу после подключение к базе данных:
//ДОБАВЛЕНИЕ ЗАПИСЕЙ
{
header("location: test.php");
exit;
}
//ДОБАВЛЕНИЕ ЗАПИСЕЙ
Условием является глобальная переменная $_POST то есть если мы заполнили форму, нажали на кнопку "Добавить пост" то сработает наше условие. В поле title запишутся данные из глобальной переменной $_POST, а в поле text - $_POST. Далее сработает строчка header("location: test.php") Она позволяет перенаправить пользователя на другую страницу, в данном случае этой страницей будет test.php. А строчка exit; прерывает выполнение остальных скриптов. Вот что получилось:
Редактирование данных в БД
Для того что бы редактировать определенную запись в нашей БД нам естественно необходимо определить какую именно запись необходимо отредактировать...Я предлагаю выводить кнопку редактирование в коде вывода полного текста, давайте отредактируем его:
//ВЫВОД ПОЛНОГО ТЕКСТА
if(isset($_GET["id"]))
{
$result = mysql_query("SELECT text FROM page WHERE id="$_GET"");
$myrow = mysql_fetch_array($result);
echo $myrow;
echo "
Редактировать пост";
}
//ВЫВОД ПОЛНОГО ТЕКСТА
if(isset($_GET["edd"]))
{
$myrow = mysql_fetch_array($result);
Echo "
}
//ФОРМА РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
Я добавил этот кусочек кода после формы добавление записей. Эта форма почти аналогична форме добавление постов. Как Вы могли заметить, я переделал атрибуты name, и добавил атрибут value. В этот атрибут я поместил данные которые вывел из базы данных. Так же тут присутствует невидимое поле. Оно нужно для того чтобы переслать идентификатор записи в файл обработчик.
Теперь для того что бы при выводе этой формы на экране не было списка заголовков, исправим условие:
//ВЫВОД ЗАГОЛОВКОВ
{
$result = mysql_query("SELECT id,title FROM page");
$myrow = mysql_fetch_array($result);
do
{
echo "".$myrow."
";
}
while ($myrow = mysql_fetch_array($result));
echo "
Добавить пост";
}
//ВЫВОД ЗАГОЛОВКОВ
Пришло время узнать как редактируются записи в базе данных. Вот синтаксис:
Теперь напишем обработчик. Вот кусочек кода который я добавил сразу после обработчика добавление записей:
//РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
{
header("location: test.php");
exit;
}
//РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
По условию видно, что обработчик запустится только в случае если мы нажали на кнопку "редактировать пост". Далее идет обновление базы данных. В поле title мы поместим значение глобальной переменной $_POST а в поле text - $_POST. Редактировать будем строку у которой id равен глобальной переменной $_POST. После мы перенаправляем пользователя обратно к списку заголовков:
Удаление записей из БД
Ну что ж, последнее что осталось нам изучить, это удаление.. Оно проще всех остальных, так что внимание на синтаксис:
Для того чтобы удалять какие то записи, необходимо где-нить выставить ссылку с помощью который пользователь сможет удалить какую то запись...давайте разместим эту ссылку в выводе полного текста поста:
//ВЫВОД ПОЛНОГО ТЕКСТА
if(isset($_GET["id"]))
{
$result = mysql_query("SELECT text FROM page WHERE id="$_GET"");
$myrow = mysql_fetch_array($result);
echo $myrow;
echo "
Редактировать пост";
echo "
Удалить пост";
}
//ВЫВОД ПОЛНОГО ТЕКСТА
Результат работы
Вот полный код сегодняшнего поста:
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
$nameDB = "phptest";//Название БД
$nameSERVER = "localhost";//Сервер
$nameUSER = "root";//Имя пользователя БД
$passUSER = "";//Пароль пользователя БД
mysql_select_db($nameDB, mysql_connect($nameSERVER,$nameUSER,$passUSER));
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
//ДОБАВЛЕНИЕ ЗАПИСЕЙ
if(isset($_POST["title_post"]) AND isset($_POST["text_post"]))
{
$result = mysql_query("INSERT INTO page (title,text) VALUES ("$_POST","$_POST")");
header("location: test.php");
exit;
}
//ДОБАВЛЕНИЕ ЗАПИСЕЙ
//РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
if(isset($_POST["title_post_edd"]) AND isset($_POST["text_post_edd"]))
{
$result = mysql_query ("UPDATE page SET title="$_POST", text="$_POST" WHERE id="$_POST"");
header("location: test.php");
exit;
}
//РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
//УДАЛЕНИЕ ЗАПИСЕЙ
if(isset($_GET["del"]))
{
$result = mysql_query ("DELETE FROM page WHERE id="$_GET"");
header("location: test.php");
exit;
}
//УДАЛЕНИЕ ЗАПИСЕЙ
//ВЫВОД ЗАГОЛОВКОВ
if(!isset($_GET["id"]) AND !isset($_GET["add"]) AND !isset($_GET["edd"]))
{
$result = mysql_query("SELECT id,title FROM page");
$myrow = mysql_fetch_array($result);
do
{
echo "".$myrow."
";
}
while ($myrow = mysql_fetch_array($result));
echo "
Добавить пост";
}
//ВЫВОД ЗАГОЛОВКОВ
//ВЫВОД ПОЛНОГО ТЕКСТА
if(isset($_GET["id"]))
{
$result = mysql_query("SELECT text FROM page WHERE id="$_GET"");
$myrow = mysql_fetch_array($result);
echo $myrow;
echo "
Редактировать пост";
echo "
Удалить пост";
}
//ВЫВОД ПОЛНОГО ТЕКСТА
//ФОРМА ДОБАВЛЕНИЕ ЗАПИСЕЙ
if(isset($_GET["add"]))
{
echo "
}
//ФОРМА ДОБАВЛЕНИЕ ЗАПИСЕЙ
//ФОРМА РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
if(isset($_GET["edd"]))
{
$result = mysql_query("SELECT * FROM page WHERE id="$_GET"");
$myrow = mysql_fetch_array($result);
Echo "
}
//ФОРМА РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
?>
Заключение
Довольно сложный получился материал. Но! Вы могли заметить, что я использовал лишь ту информацию которую давал ранее . А это значит, что имея эти знание, можно создавать простейшие проекты на php! Если Вы все это освоили, то можете с гордостью заявить, что вы начинающий программист! Ну что ж, теперь Вы вполне можете приступить к созданию свой первой cms . Если есть какие то вопросы, а они скорее всего есть, задавайте, помогу чем смогу! Удачи Вам, на сегодня у меня все!
P.S.: Что такое mdf файл? Чем его открыть? Как его открыть? На эти и многие вопросы можно найти ответ на voprosi4ek.ru
Всё, что я могу сказать в качестве рекомендации к использованию БД - это то, что жизнь без них - просто смерть! База данных - луч exe-шного света в тёмном царстве обработки данных интерпретируемой программой. База данных приносит немножко головной боли, но снимает гораздо больше.
В качестве примера взят сервер баз данных MySQL (полагаю, что освоив его, вы без большого труда освоите и другие. Когда-нибудь я напишу и о них, если сам освою:).
Первый разговор пойдет о функциях PHP, используемых для работы с MySQL. Итак, начнём.
1. Администрирование базы данных
Способы администрирования БД в порядке убывания удобства:
- phpMyAdmin (весьма рекомендую!)
- Написать скрипт, который бы передёргивал базу (см. пример)
- mysql.exe в пакете mysql
- mysql_manager.exe (там, вроде, как-то можно, только на грани шаманства)
Особенно рекомендую первый способ. С ним не придётся изучать запросы ALTER TABLE, ADD COLUMN и т.п. Я их не знаю до сих пор. Тем более, что "такие вопросы, товарищ посол, с кондачка не решаются" - когда вам понадобится автоматически изменить структуру базы или таблицы? Пару слов о втором способе. Это так сказать обходная технология, которую я применял, не зная про phpMyAdmin и утилиту mysqldump. В скрипте пишутся команды, удаляющие базу и создающие её вновь. Когда-то помогало, но вообще это, ещё раз скажу, обходная технология, "подпорка".
На будущее: если у вас будет несколько сайтов, использующих БД, то хотя бы в пределах домашнего сервера создайте несколько баз. Это облегчит работу серверу и исключит возможность путаницы таблиц. В общем, правила работы с БД те же, что и с сайтом - держать в отдельной директории от других.
2. Соединение с сервером БД
Осуществляется при помощи функции mysql_connect: $connect = mysql_connect(<хост>, <логин>, <пароль>); По умолчанию, на mysql-сервере в таблице пользователей есть пользователь root, который может иметь доступ только с localhost-а, то бишь с того же самого компьютера, где стоит сервер mysql. ВНИМАНИЕ! "Иметь доступ с localhost-а" значит, что доступ имеет ваш скрипт PHP, а вы можете обращаться к нему с любого другого компьютера.
Что происходит, когда мы вызываем функцию mysql_connect? С началом выполнения вашего скрипта, php выделяет в своей памяти место для информации о нём и его переменных. В информации о выполняемом скрипте хранится, в том числе, и информация о соединениях с базами данных. Переменная $connect - грубо говоря указатель на место, где данная информация хранится. Переменная эта точно такая же, как и остальные - если вы используете функции, то надо объявлять глобальные переменные, чтобы обратиться к ней.
Почему вообще используется переменная? Это на случай, если для работы вам необходимо использовать несколько серверов баз данных (или, например, для обеспечения бОльшей безопасности вы используете разные логины, у которых могут быть разные привилегии). В таких случаях в каждом запросе нужна определённость, по какому, так сказать, каналу идёт команда. Но если вы используете только одно соединение, указывать его в параметрах функций запросов (о них - ниже) не нужно - php находит первое (и в данном случае единственное) установленное соединение и использует его.
Механизм работы функций запросов к БД такой же, как и у функции соединения: функции передаются параметры запроса и (если надо) соединения, а результат записывается в переменную:
$result = mysql_db_query(string база данных, string запрос [, переменная соединения]);
$result = mysql_query(string запрос [, переменная соединения]);
ВНИМАНИЕ! Чтобы использовать функцию mysql_query, в которой база данных не указывается, надо предварительно выбрать используемую базу данных:
mysql_select_db(string база данных);
Теперь у нас есть переменная $result. Это указатель на результат выполнения запроса. Там есть сколько-то строк таблицы. Получить эти строки можно через функции mysql_fetch_row и mysql_fetch_array:
Echo "
", $row["field1"], " | ", $row["field2"], " |
Функция mysql_fetch_array выдаёт в указанную переменную (в данном случае $row) массив, индексы которого - имена полей (причём, если вы в списке полей запроса пишете table.field, то индекс массива будет field). mysql_fetch_row выдаёт массив, индексы которого - числа, начиная с 0.
Какой функцией лучше пользоваться? Если вы запрашиваете звёздочку, т.е. все поля таблицы, а выводить поля нужно в определённой последовательноси (когда, например, у таблицы рисуется шапка), лучше пользоваться mysql_fetch_array. Если вы запрашиваете одно-два-три поля, чётко зная их последовательность, можно делать mysql_fetch_row - это уменьшит объем кода программы.
Это команды DELETE и UPDATE. Подобные запросы - в "правах" такие же, как и SELECT, поэтому отправка команды серверу происходит тем же способом - mysql_query (mysql_db_query). Но в данном случае функция не возвращает результата:
$result = mysql_query("SELECT * FROM sometable"); но mysql_query("DELETE FROM sometable WHERE id=...");
Соответственно, если мы выполним запрос-выборку и не запишем результат в переменную, данные не будут храниться нигде.
5. Обработка ошибок запросов
Сообщение о последней ошибке можно получить через функцию mysql_error:
echo "Ошибка базы данных. MySQL пишет:", mysql_error();
Если результат функции пишется в переменную, можно проверить её:
$result = mysql_query($request); if (!$result) echo "Ошибка базы данных. MySQL пишет:", mysql_error(); else { echo "
", $row["field1"], " | ", $row["field2"], " |
Если в переменную не пишем, то так.
Windows 7