Verification: a143cc29221c9be0

Mysql вставить строку в таблицу php

Mysql вставить строку в таблицу php

Содержание

Предварительные требования

Для целей этого краткого руководства понадобится:

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.

  • Создание отдельного сервера Базы данных Azure для MySQL с помощью портала Azure
    или с помощью Azure CLI, если он еще не создан.

  • Выполнить ОДНО из действий (в зависимости от того, пользуетесь вы общим или частным доступом), чтобы настроить возможность подключения.

    Действие Метод подключения Практическое руководство
    Настройка правил брандмауэра Общие Портал
    CLI
    Настройка конечной точки службы Общие Портал
    CLI
    Настройка приватного канала Private Портал
    CLI
  • Создание базы данных и пользователя без прав администратора.

  • Установка последней версии PHP для вашей операционной системы:

    • PHP в macOS;
    • PHP в Linux;
    • PHP в Windows

Примечание

При работе с этим кратким руководством мы используем библиотеку MySQLi для управления подключением и выполнения запросов к серверу.

Получение сведений о подключении

Чтобы получить сведения о подключении сервера базы данных с портала Azure, выполните следующие действия.

  1. Войдите на портал Azure.

  2. Перейдите на страницу Базы данных Azure для MySQL. Найдите и выберите База данных Azure для MySQL. Поиск Базы данных Azure для MySQL

  3. Выберите свой сервер MySQL (например, mydemoserver).

  4. На странице Обзор скопируйте полное имя сервера рядом с полем Имя сервера и имя администратора рядом с полем Имя для входа администратора сервера. Чтобы скопировать имя сервера или имя узла, наведите на него указатель мыши и щелкните значок копирования.

Важно!

  • Если вы забыли свой пароль, его можно сбросить.
  • Замените значения параметров host, username, password и db_name своими значениями**.

Шаг 1. Подключение к серверу

Протокол SSL включен по умолчанию. Для подключения из локальной среды может потребоваться скачать SSL-сертификат DigiCertGlobalRootG2. Этот код вызывает:

  • mysqli_init для инициализации MySQLi.
  • mysqli_ssl_set для указания пути SSL-сертификата. Это необходимо для локальной среды, но не требуется для веб-приложения Службы приложений или виртуальных машин Azure.
  • mysqli_real_connect для подключения к MySQL.
  • mysqli_close для закрытия подключения.
$host = 'mydemoserver.mysql.database.azure.com';
$username = 'myadmin@mydemoserver';
$password = 'your_password';
$db_name = 'your_database';

//Initializes MySQLi
$conn = mysqli_init();

mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/DigiCertGlobalRootG2.crt.pem", NULL, NULL);

// Establish the connection
mysqli_real_connect($conn, 'mydemoserver.mysql.database.azure.com', 'myadmin@mydemoserver', 'yourpassword', 'quickstartdb', 3306, NULL, MYSQLI_CLIENT_SSL);

//If connection failed, show the error
if (mysqli_connect_errno())
{
    die('Failed to connect to MySQL: '.mysqli_connect_error());
}

Возникли проблемы? Сообщите нам об этом

Шаг 2. Создание таблицы

Для подключения используйте следующий код. Этот код вызывает:

  • mysqli_query для запуска запроса.
// Run the create table query
if (mysqli_query($conn, '
CREATE TABLE Products (
`Id` INT NOT NULL AUTO_INCREMENT ,
`ProductName` VARCHAR(200) NOT NULL ,
`Color` VARCHAR(50) NOT NULL ,
`Price` DOUBLE NOT NULL ,
PRIMARY KEY (`Id`)
);
')) {
printf("Table created\n");
}

Шаг 3. Добавление данных

Используйте указанный ниже код с инструкцией SQL INSERT для вставки данных. Этот код использует методы:

  • mysqli_prepare для создания подготовленной инструкции INSERT.
  • mysqli_stmt_bind_param для привязки параметров для каждого вставленного значения столбца.
  • mysqli_stmt_execute.
  • mysqli_stmt_close для закрытия инструкции с помощью метода.
//Create an Insert prepared statement and run it
$product_name = 'BrandNewProduct';
$product_color = 'Blue';
$product_price = 15.5;
if ($stmt = mysqli_prepare($conn, "INSERT INTO Products (ProductName, Color, Price) VALUES (?, ?, ?)"))
{
    mysqli_stmt_bind_param($stmt, 'ssd', $product_name, $product_color, $product_price);
    mysqli_stmt_execute($stmt);
    printf("Insert: Affected %d rows\n", mysqli_stmt_affected_rows($stmt));
    mysqli_stmt_close($stmt);
}

Шаг 4. Чтение данных

Используйте указанный ниже код с инструкцией SQL SELECT для чтения данных. Этот код использует методы:

  • mysqli_query для выполнения запроса SELECT.
  • mysqli_fetch_assoc для получения результирующих строк.
//Run the Select query
printf("Reading data from table: \n");
$res = mysqli_query($conn, 'SELECT * FROM Products');
while ($row = mysqli_fetch_assoc($res))
 {
    var_dump($row);
 }

Шаг 5. Удаление данных

Используйте указанный ниже код с инструкцией SQL DELETE для удаления строк. Этот код использует методы:

  • mysqli_prepare для создания подготовленной инструкции DELETE.
  • mysqli_stmt_bind_param для привязки параметров.
  • mysqli_stmt_execute для создания подготовленной инструкции DELETE.
  • mysqli_stmt_close для закрытия инструкции.
//Run the Delete statement
$product_name = 'BrandNewProduct';
if ($stmt = mysqli_prepare($conn, "DELETE FROM Products WHERE ProductName = ?")) {
mysqli_stmt_bind_param($stmt, 's', $product_name);
mysqli_stmt_execute($stmt);
printf("Delete: Affected %d rows\n", mysqli_stmt_affected_rows($stmt));
mysqli_stmt_close($stmt);
}

Очистка ресурсов

Чтобы очистить все ресурсы, используемые во время этого краткого руководства, удалите группу ресурсов с помощью следующей команды:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

Что такое реляционная база данных

Реляционная база данных – это база данных основанная на реляционной модели (от англ. relationship — отношение, связь) выражаясь по другому, это некий набор данных с определёнными связями между ними. Обычно такие базы организованны в виде таблиц. В отдельных таблицах хранится сгруппированная по определённому смыслу информация о какой-либо сущности, например данные о покупателях (сущность — покупатель) или данные о товарах (сущность — товар) и т.д.  Каждый столбец таблицы отвечает за хранение одного свойства сущности, внутри ячейки хранится значение свойства сущности, например столбец — цена, значение — 1000.

Отношения между таблицами в БД

Преимущественно отдельные столбцы имеют строго определённый тип данных (числовой, логический, текстовый, дату и время и т.д.). Каждая стока таблицы это набор значений свойств относящихся к определённой сущности (напр. определённому пользователю может соответствовать строка где хранит его имя, фамилия, телефон, email, возраст и пол.). Каждая строка в таблице должна иметь уникальный идентификатор, а так же так называемый «первичный ключ» (часто первичный ключ = уникальный идентификатор). При помощи первичного ключа, несколько таблиц базы данных могут быть связаны, например в таблице users — хранятся пользователи, а в таблице orders — заказы пользователей сделанные в интернет-магазине. По первичному ключу user_id  (идентификатор пользователя) мы можем узнать что этот пользователь заказал, т.е. получить данные из таблицы orders.

Для работы с реляционными базами данных существует множество инструментов, они позволяют «вытаскивать» из БД различные наборы данных, даже более сложные чем в приведённом примере, при этом, структура таблиц не требует реорганизации.

СУБД MySQL

Что же такое MySQL? Это надежная. быстрая и универсальная система управления базами данных (СУБД), пожалуй  самая популярная в мире (в 2019 году 39% разработчиков использовали MySQL в своих проектах). Несмотря на более слабый функционал в сравнении с PostgreSQL, данная СУБД прекрасно масштабируется и отлично подходит для большинства проектов.

MySQL СУБД

MySQL — идеальный выбор для разработке веб-приложений. Данная СУБД входит в стандартный набор: Linux, Apache HTTP Server, MySQL и PHP (LAMP — набор программ с открытым исходным кодом). Так же не основе MySQL работает большинство популярных CMS ( Content Management System — система управление содержимым), таких как WordPress, OpenCart, 1С Битрикс и т.д.

К преимуществам этой СУБД можно отнести:

  • Простота: Mysql легко установить на любую платформу (Linux, Windows, MacOS), под эту СУБД написано множество настольных приложений позволяющих работать с базой в визуальном режиме (очень удобно особенно для новичков), к подобным системам относятся Workbench, Navicat, PHPMyAdmin и другие.
  • Много функций: MySQL поддерживает весь функционал реализованный на  языке SQL.
  • Безопасность: в СУБД MySQL встроено много функций безопасности, например Access Control Lists и поддержка SSH-зашифрованных соединений.
  • Масштабируемость: MySQL достаточно легко и не дорого масштабируется, что позволяет разрабатывать на ней довольно крупные и высоко-нагруженные проекты.

В большинстве языков программирования встроена поддержка СУБД MySQL, PHP так же не стал исключением.

PHP PDO

PHP PDO
 PDO — это специализированный класс реализующий интерфейс доступа к базе данных. Его отличает универсальность, т.к. вам без разницы какая база данных будет использована.

Подключение к БД

Для подключения к БД необходимо создать экземпляр класса PDO и передать в него параметры подключения:


/* Подключение к базе данных MySQL с помощью PDO */
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'root';
$password = '123456';

//Чтобы перехватить ошибки подключения используем исключения try {...} catch () {...}
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
	//В случае ошибки выводим сообщения из перехваченного исключения
    echo 'Подключение к БД не удалось: ' . $e->getMessage();
}

Конструктор PDO так же поддерживает и четвёртый параметр options — это массив ключ=>значение специфичных для драйвера (например MySQL или PostgreSQL) настроек подключения. Например сразу после подключения можно выполнить MySQL запрос указав это в параметре options:


//Чтобы перехватить ошибки подключения используем исключения try {...} catch () {...}
try {
    $dbh = new PDO(
		$dsn, 
		$user, 
		$password, 
		[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"] //Команда которую необходимо выполнить сразу после подключения к серверу
	);
} catch (PDOException $e) {
	//В случае ошибки выводим сообщения из перехваченного исключения
    echo 'Подключение к БД не удалось: ' . $e->getMessage();
}

Полный перечень параметров доступных в options вы найдёте в документации.

Базовый набор операций (CRUD)

Большинство веб-приложений работающих с базой данных, так или иначе реализуют базовый набор операций, а именно Create — создание, Read — чтение, Update — обновление и Delete — удаление (CRUD). Давайте рассмотрим как этот набор операций сделать в PDO.

Создание

Для теста, давайте создадим таблицу с пользователями сайта и заполним её данными. Таблица будет называться просто users и иметь 4 поля:

  1. id — автоинкрементный идентификатор записи
  2. name — имя пользователя
  3. email — адрес электронной почты
  4. phone — контактный телефон

try {
    //Соединяемся с базой данных
    $dbh = new PDO('mysql:dbname=test_db;host=localhost', $user, $password);

    //запрос на создание таблицы
    $sqlCreateTable = 'CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL, `phone` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`)) ';
    $dbh->exec($sqlCreateTable);
    echo 'Создана таблица users';

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Здесь мы используем метод exec() он запускает запрос на выполнение возвращая количество затронутых строк. Метод не предназначен для выборки данных из таблицы. Если всё сделано верно у вас будет создана таблица пользователей. Давайте заполним её данными.


/*Данные пользователей, в реальном проектк они могут
 быть получены из JSON, файла импорта или из формы регистрации */
$usersData = [
    [
        'name'=>'Иван Иванов',
        'email'=>'ivan@mail.ru',
        'phone'=>'+79001234567'],
    [
        'name'=>'Пётр Петров',
        'email'=>'petrov@yandex.ru',
        'phone'=>'+79281534874'],
    [
        'name'=>'Олег Сидоров',
        'email'=>'sidor@gmail.com',
        'phone'=>'+79508975248'
    ],
];

try {
    //Соединяемся с базой данных
    $dbh = new PDO('mysql:dbname=test_db;host=localhost', $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Подготовка запроса, обратите внимание что ключи в запросе совпадают с ключами массив отдельного пользователя
    $data = $dbh->prepare('INSERT INTO users (name, email, phone) VALUES(:name, :email, :phone)');

    //Перебираем массив пользователей
    foreach ($usersData as $user) {
        //Подставляем данные пользователей в запрос
        $data->execute($user);
    }

} catch(PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Если всё сделано верно, вы получите заполненную таблицу users:
Заполненная таблица users

Чтение

Прочитать записи в таблице БД можно несколькими способами, при помощи метода query и execute , давайте разберём оба:

Чтение таблицы при помощи метода query


$user = 'root';
$password = 'Ваш пароль';

//Чтобы перехватить ошибки подключения используем исключения try {...} catch () {...}
try {
    $dbh = new PDO('mysql:dbname=test_db;host=localhost', $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Выборка всех записей
    $users = $dbh->query('SELECT * FROM `users`');

    echo '
    '; foreach ($users as $user){ echo '
  • id: ' . $user['id'] . ' - name: ' . $user['name'] . ' - phone: ' . $user['phone'] . ' - email: '. $user['email'] .'
  • '; } echo '
'; } catch (PDOException $e) { //В случае ошибки выводим сообщения из перехваченного исключения echo 'Ошибка: ' . $e->getMessage(); }

В результате на экране вы увидите такую картину:
Результат чтения таблицы users
Обратите внимание на следующее:


$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Данные параметры устанавливают расширенный режим вывода ошибок и исключение PDO.

Чтение таблицы при помощи метода execute

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


try {
    $dbh = new PDO('mysql:dbname=test_db;host=localhost', $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Вывод пользователя с email адресом ivan@mail.ru

    //Подготовка запроса
    $data = $dbh->prepare('SELECT * FROM `users` WHERE `email` = :user_email');
    // Выполнение с подстановкой параметра в запрос
    $data->execute(['user_email'=>'ivan@mail.ru']);

    //Получаем результат
    $users = $data->fetchAll();

    echo '
    '; foreach ($users as $user){ echo '
  • id: ' . $user['id'] . ' - name: ' . $user['name'] . ' - phone: ' . $user['phone'] . ' - email: '. $user['email'] .'
  • '; } echo '
'; } catch (PDOException $e) { //В случае ошибки выводим сообщения из перехваченного исключения echo 'Ошибка: ' . $e->getMessage(); }

В данном примере используется метод prepare т.е. подготовка запроса. Это позволят почти с 100% гарантией избежать SQL инъекций т.к. подставляемый параметры email не встраивается в зарос напрямую, в запросе есть лишь метка :email куда через метод execute будет подставлена переданная через ассоциативный массив переменная.

В результате выполнения запроса, получаем одну запись из таблицы users:

Чтение таблицы методом execute

Редактирование

Давайте теперь изменим контактный телефон для пользователя с id равным 2 и сразу посмотрим на результат (выведем на экран список всех пользователей).


try {
    //Соединяемся с базой данных
    $dbh = new PDO('mysql:dbname=test_db;host=localhost', $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Подготовка запроса
    $data = $dbh->prepare('UPDATE  users SET phone = :phone WHERE id = :id');

    //Подстановка параметров
    $data->execute([
        'phone'=>'+7 900 000 00 00',
        'id' => 2
    ]);

    //Выведем на экран сколько строк затронул наш запрос
    echo 'Обновлено строк таблицы: ' . $data->rowCount();

    //И сразу посмотрим на результат, выведем всех пользователей
    $users = $dbh->query('SELECT * FROM `users`');

    echo '
    '; foreach ($users as $user){ echo '
  • id: ' . $user['id'] . ' - name: ' . $user['name'] . ' - phone: ' . $user['phone'] . ' - email: '. $user['email'] .'
  • '; } echo '
'; } catch(PDOException $e) { echo 'Ошибка: ' . $e->getMessage(); }

Как видите, запись обновилась:
Обновление записи в БД

Отлично, осталось понять как удалять запись. Давайте удалим того же пользователя, этот Пётр Петров мне надоел =)

Создадим тестовую таблицу

Давайте создадим таблицу table1 со столбцами a, b, c в нашей MySQL базе данных:

CREATE TABLE `table1` (
      `a` INT(11),
      `b` INT(11),
      `c` INT(11)
);

Запрос на вставку строки

Простой запрос, который вставляет строку со столбцами 111, 222 и 333 выглядит так:

INSERT INTO table1 (a, b, c) VALUES (111, 222, 333);

Еще один способ сделать то же самое:

INSERT INTO table1 SET a=111, b=222, c=333;

Столбцы, которые вы не перечислите заполняются значениями по умолчанию, которые вы предусматриваете при создании таблицы, даже если это просто NULL.

У таблиц обычно есть поле id с первичным ключом (PRIMARY KEY) таблицы. Если этому полю установлено значение AUTOINCREMENT т.е. оно заполняется автоматически, то в таком случае вы не должны его перечислять в списке столбцов оператора INSERT.

Вставка без перечисления столбцов

Если количество значений, которые мы вставляем = количеству столбцов в таблице, то можно не перечислять столбцы, и наш запрос может выглядеть так:

INSERT INTO table1 VALUES (111, 222, 333);

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

Вставка сразу нескольких строк с помощью INSERT INTO

Если нам нужно вставить несколько строк, то мы просто перечисляем группы значений через запятую выглядит это так:

INSERT INTO table1 (a, b, c) VALUES 
    (1, 222, 333), 
    (2, 555, 666),
    (3, 555, 333);

Таким образом мы вставили 3 строки в нашу таблицу table1. Их может быть и больше. В MySQL четкого предела нет, однако он все таки существует и зависит от параметра max_allowed_packet который ограничивает размер запроса. Если вы установите SET GLOBAL max_allowed_packet=524288000; то размер запроса будет ограничен 500MB но делайте это в очень крайнем случае. Обычно всегда можно найти решение и разделить 1 большой запрос, на несколько более мелких и вставлять например не больше 1000 строк за один цикл.

Как вставить значение из другой таблицы INSERT INTO ... SELECT ...

Допустим у нас есть еще одна таблица table2 которая по структуре точно такая же как и первая. Нам в таблицу table2 нужно вставить все строки из table1.

Вставляем значения из table1 в таблицу table2:

INSERT INTO table2 (a, b, c) SELECT a, b, c FROM table1;

Вам следует позаботиться об уникальности ключей, если они есть в таблице, в которую мы вставляем. Например при дублировании PRIMARY KEY мы получим следующее сообщение об ошибке:

/* ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY' */

Если вы делаете не какую-то единичную вставку при переносе данных, а где-то сохраните этот запрос, например в вашем PHP скрипте, то всегда перечисляйте столбцы.

Как не рекомендуется делать (без перечисления столбцов):

INSERT INTO table2 SELECT * FROM table1;

Если у вас со временем изменится количество столбцов в таблице, то запрос перестанет работать. При выполнении запроса MySQL в лучшем случае просто будет возвращать ошибку:

/* Ошибка SQL (1136): Column count doesn't match value count at row 1 */

Либо еще хуже: значения вставятся не в те столбцы.

Вставка из другой таблицы с условием INSERT INTO ... SELECT ... WHERE ...

А теперь представим, что нам нужно вставить только те строки из table1, у которых столбец "c" равен 333. Тогда наш запрос будет выглядеть так

INSERT INTO table2 (a, b, c)
    SELECT a, b, c FROM table1 
    WHERE c = 333;

То есть мы просто вставляем данные в таблицу, которые выбрали из другой таблицы при помощи обычного SELECT запроса

Теперь представим, что у нас в таблице table2 - 4 столбца, а в table1 - 3. При этом четвертый столбец в table2 обязательный. Чтобы выйти из этой ситуации, нужно передать какое-нибудь подходящее значение в этот лишний столбец. У нас чисто абстрактная задача, поэтому давайте передадим туда просто единицу.

INSERT INTO table2 (a, b, c, d)
    SELECT a, b, c, 1 FROM table1 
    WHERE c = 333;

Теперь в столбец d у нас записалась единица и проблема решена.

Вставка в определенный раздел INSERT INTO ... PARTITION ...

Подробнее о разделах: https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html

Если вам нужно вставить строки в определенный раздел таблицы, то нужно после таблицы указать PARTITION (название раздела), например так:

INSERT INTO table1 PARTITION (p1) VALUES(1, 2, 3);

Вставка в несколько разделов. Первая строка вставляется в раздел p1, а вторая в p2

INSERT INTO table1 PARTITION (p1, p2) VALUES(1, 2, 3), (4, 5, 6);

Больше примеров для работы с разделами: https://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html

Вставка строк, некоторые из которых уже существуют в целевой таблице

Существование строк определяется по значению уникальных ключей. В зависимости от ситуации мы можем выбрать разные способы поведения при совпадении значений уникальных столбцов.

Игнорирование INSERT IGNORE INTO

Например если мы вставляем строку с PK = 1, и при этом в таблице уже есть PK = 1 то MySQL выдаст ошибку:

/* ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' */

Выполнение запроса на этом прервется, однако нам в некоторых случаях хотелось бы просто вставить данные, игнорируя ошибки. В этом нам поможет INSERT IGNORE INTO:

INSERT IGNORE INTO table1 (a, b, c) VALUES 
    (1, 222, 333), 
    (2, 555, 666),
    (3, 555, 333);

Просто добавляем IGNORE в наш запрос и ошибки будут игнорироваться

Вставка с заменой существующих значений REPLACE INTO

REPLACE работает также INSERT, но если совпадают уникальные ключи, то старая строка (или строки!) удаляется до вставки новой.

В таком случае наш пример выглядит следующим образом:

REPLACE INTO table1 (a, b, c) VALUES 
    (1, 222, 333), 
    (2, 555, 666),
    (3, 555, 333);

Обновление некоторых полей, при существовании строк ON DUPLICATE KEY UPDATE

При совпадении ключей, мы можем также заменить некоторые или все поля в строке.

Наш запрос будет выглядеть так:

INSERT INTO table1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=VALUES(c);

В данном примере если у нас какой-то уникальный ключ совпадает, то мы не производим вставку, а обновляем существующую строку или строки путем присваивания столбцу "c" значения, которое у нас перечислено в VALUES.

Иными словами, если ключ совпадает, то мы просто обновим данные столбца "с" а остальные столбцы трогать не будем.

Иногда нам нужно при совпадении ключей обновить все значения. Этом можно сделать просто перечислив все столбцы:

INSERT INTO table1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b), c=VALUES(c);

При обновлении столбцов мы также можем использовать разные выражения, например:

INSERT INTO table1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

Подробнее про ON DUPLICATE KEY UPDATE

Выражения для вставляемых значений в VALUES

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

Пример использования выражений:

INSERT INTO table1 (a, b, c) VALUES 
    (1, 222, 333 + a), 
    (2, 555, 666 + b);

Таким образом мы для формирования столбца "c" использовали столбцы "a" и "b".

Этапы подключения к базе данных MySQL

  1. Код PHP начинается с и заканчивается ?> Так компьютеру будет понятно, где начало и где конец программы.
  2. В самом начале кода удобно указать способ отображения ошибок — если что-то пойдет не так, вы сможете быстро понять код ошибки. В языке программирования PHP для этого используются следующие команды:

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL); 
  3. Соединение с базой данных MySQL: создаем переменную, например, $connect, в которой через коннектор вносим доступы к нашей базе данных (имя, пароль и т.п.). Эта база данных MySQL должна уже существовать и «крутиться» либо на сервере, либо на локалке. Про установку и создание своей базы данных у нас будет отдельный материал. Подключаемся:

    $connect = mysqli_connect('localhost', 'database', 'password', 'user');
  4. Создаем запрос к базе данных — какие данные мы хотим получить: для этого делаем новую переменную, например, $query1, которой присваиваем значение запроса на языке, понятном для базы MySQL — выбери из где . Запрос выглядит так:

    $query1 = "SELECT Name FROM igroki WHERE N='7'";
  5. Подготовка в возвращение результатов запроса для чтения: создаем новую переменную, например, $result— которая получит результат запроса. Используется конструкция [подключение к БД] -> query([запрос к БД]). В нашем примере возвращение результатов выглядит так:

    $result = $connect->query($query1);
  6. Затем вы должны получать по одной записи из набора результатов возвращенного запроса (по сути перебором). В нашем примере — это будет только 1 запись, потому что вы получаете id = 7. Обычно вы будете использовать mysqli_fetch_array ($ result), чтобы вернуть массив данных, или вы можете использовать mysqli_fetch_object ($ result), чтобы вернуть объект данных. В нашем примере мы создаем новую переменную, например, $record и фетчим полученный массив:

    $record = mysqli_fetch_array($result);
  7. Напечатать имя седьмого игрока: для печати в PHP используется оператор echo, где в кавычках можно написать текст для печати, и через точку объединить текст с переменной — так как возвращенный массив имеет несколько «колонок», а нам нужно вывести именно имя, то указываем в скобках к переменной $record именно 'Name':

    echo 'Name of 7th player: ' . $record['Name'];
  8. Отключение от базы данных:

    $connect -> close();

*Если у вас есть несколько записей в вашей таблице и вы хотите их вывести, вы можете использовать цикл while для перебора данных следующим образом:

$query2 = "SELECT Name FROM igroki";
$result2 = $connect->query($query2);

while ($record2 = mysqli_fetch_array($result2))
{
    echo 'Name: ' . $record2['Name'] . '
';

}

Подключения к базе данных MySQL — простой пример запроса на PHP


ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);

$query1 = «SELECT Name FROM igroki WHERE N=’7′»;

$result = $connect->query($query1);

$record = mysqli_fetch_array($result);

echo ‘Name of 7th player: ‘ . $record[‘Name’];

echo «





»;  //Это разделитель html

// Перебор нескольких значений:

echo «All players:

»;
$query2 = «SELECT Name FROM igroki»;

$result2 = $connect->query($query2);
while ($record2 = mysqli_fetch_array($result2)) {
echo ‘Name: ‘ . $record2[‘Name’] . ‘
’;

}

$connect -> close();
?>

Создание кнопки на сайте для получения значений из базы данных MySQL

К тому коду, который вам уже известен — базовый запрос к БД — осталось добавить html-код кнопки через тег

(позволяет создавать на сайте интерактивные элементы и отправлять данные на сервер).

Чтобы внутри формы появилась кнопка вводим action — можно пустой (action=''), чтобы при нажатии загружалась эта же программа, либо можно в кавычках указать ссылку на другой файл с кодом, который запустится при нажатии кнопки (например, action='submit.php').

Важно присвоить форме select name — любое имя, на которое затем можно ссылаться в программе).

На сайте кнопку, списки, выпадающие меню можно сделать с помощью форм, которые могут быть типа POST (method=’POST’) или GET (method=’GET’). Если делать форму POST, то пользователь не будет видеть в строке браузера текст, соответствующий выбранным опциям. Если сделать форму GET, то строка браузера после выбора варианта покажет значение (похожим образом работает поисковик, если сделать запрос, то в строку браузера добавляется информация о запросе).ᅠ


if (isset($_POST[‘submit’]))
{
echo » 



«;
}

ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);
$query1 = «SELECT Name FROM igroki WHERE N=’7′»;
$result = $connect->query($query1);
$record = mysqli_fetch_array($result);

if (isset($_POST[‘submit’]))
{
echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

$connect -> close();
?>

Создание формы (выпадающий список) с кнопкой на сайте

Научившись обращаться к базе данных и делать простые кнопки, пришло время сделать форму на сайте в виде выпадающего списка (dropdown menu) и связанную кнопку, которую пользователь может нажать, чтобы выбрать значение, отправить запрос в БД и получить результаты на экране монитора.

На сайте выпадающее меню создается с помощью форм, которые могут быть типа POST (method=’POST’) или GET (method=’GET’). 

Чтобы создать выпадающее меню с кнопкой, используется html-тег формы

с выбором вариантов через теги:

(можно указать action='', чтобы при нажатии загружалась эта же программа, либо можно в кавычках указать ссылку на другой файл с кодом, который запустится при нажатии кнопки; важно присвоить select name — любое имя, на которое затем можно ссылаться в программе);

(option value — это значение, которое будет записано в переменную при выборе этого пункта, а Seven и Eight  — это то, что показывается пользователю на сайте в выпадающем меню);

внутри формы добавляем кнопку через html-тег .

Пример кода для выпадающего меню с кнопкой методом POST




Создав форму с кнопкой, нам теперь надо уметь получать пользовательский выбор. Если пользователь нажмет кнопку выбора варианта, то программа должна понимать это. Давайте научим компьютер общаться с пользователем. Для этого создам условие с проверкой нажатия кнопки — если кнопка была нажата (isset в PHP проверяет, есть ли у переменной значение, отличное от null), то сделай запрос к базе данных и напечатай то, что выбрал пользователь.

Этот код очень похож на то, что мы уже писали в начале этого поста, создавая простой запрос к БД. 

Получение выбора пользователя после нажатия кнопки на сайте — напечатать одно значение из базы данных (имя седьмого игрока)

if (isset($_POST[‘submit’]))
{
    $number = $_POST[‘PlayerID’];
    $query = «SELECT Name FROM igroki WHERE N=’$number'»;
    $result = $connect->query($query);
    $record = mysqli_fetch_array($result);
    echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

Cоздание формы (выпадающий список) с кнопкой, отправляющей запрос к базе данных MySQL на html + PHP с выводом результатов на сайте





ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);

if (isset($_POST[‘submit’]))
{
    $number = $_POST[‘PlayerID’];
    $query = «SELECT Name FROM igroki WHERE N=’$number'»;
    $result = $connect->query($query);
    $record = mysqli_fetch_array($result);
    echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

$connect -> close();
?>

Подготовка таблицы

Данный урок выполняется на основе (после выполнения) уроков "Создание базы данных и таблицы с товарами" и "Вывод данных из MySql на PHP". А именно, из этих уроков нам понадобится:

  • Таблица "products" с полями "ID", "Name", "Price";
  • Установленное соединение с БД MySql.

Создание формы для добавления записей

Для начала нам необходимо создать обычную форму, в которую мы будем записывать данные, и после отправки формы, они будут записываться в таблицу MySql.

Создадим новую страницу, к примеру "product_admin.php" с установленным соединением с БД:




Админ-панель

Теперь в блок после подключения к БД добавим HTML форму:

Наименование:
Цена: руб.

Обработка (вставка) полученных из формы данных

После того, как данные из формы будут отправлены, их надо принять и записать в таблицу БД.

Давайте првоерим, переданы ли данные и, если переданы, то сохраним их. Этот код лучше вставить перед формой, но после подключения к БД:

Данные успешно добавлены в таблицу.';
    } else {
      echo '

Произошла ошибка: ' . mysqli_error($link) . '

'; } } ?>

Теперь после отправки формы в таблице у вас должна появиться новая срока - новый товар.

Никогда без проверок принятых переменных не вставляйте данные напрямую в базу данных. В этом случае вас будет очень легко взломать. Подробнее об этом в google: о sql инъекциях. Но поскольку мы только учимся, и усложнять все незачем, то мы будем делать так :)

Удаление строк из Mysql

Давайте попробуем вывести все товары, а рядом с каждым товаром кнопку удалить (код вставляем в самый низ страницы перед тегом

):

Удалить
"; } ?>

Теперь перед выводом товаров нам следует проверить, а не была ли передана переменная на их удаление, и если была, то удалить товар:

Товар удален.";
    } else {
      echo '

Произошла ошибка: ' . mysqli_error($link) . '

'; } } ?>

Попробуйте доработать данный пример и сделать самим редактирование данных о товаре. Путей решения много. Один из них: рядом со ссылкой "Удалить" добавляем "Редактировать", при клике по которой передаем переменную "red". Перед отрисовкой формы проверяем, а нет ли этой переменной, и если есть, то извлекаем и подставляем данные в форму. Перед новой вставкой, если все еще есть "red", то делаем UPDATE, а не INSERT. Дерзайте ;)

Ну и для самых лентяев! Готовый код с редактирвоанием данных в таблице ниже.

Создание Таблицы (По необходимости)

Прежде всего, нам нужно создать таблицу для ваших данных. Если она у вас уже есть, смело переходите к следующему разделу. Процедура очень простая. Создать таблицу можно в phpMyAdmin из вашей панели управления хостингом.

phpMyAdmin в Панели Управления Хостингом Hostinger

После входа на страницу phpMyAdmin вы увидите подобную картину:

Меню phpMyAdmin

Давайте создадим таблицу с названием Students для нашей базы данных u104357129_name. Создать новую таблицу можно, нажав на кнопку Create Table. После этого вы увидите новую страницу со всеми необходимыми полями для ввода данных.

Окно с Полями для Создания Таблицы MySQL

Поскольку создание таблицы не основная тема этого руководства, мы не будем углубляться в подробности. Если вам нужно больше информации о структуре таблицы/базы данных и о том, какие настройки вы можете использовать для каждого столбца, рекомендуем обратиться к официальной документации phpMyAdmin (англ.).

Здесь приведём лишь несколько простых пояснение столбцов, которые мы будем использовать:

  • Name — это имя столбца. Будет отображено в самом верху вашей таблицы.
  • Type — тип ваших данных. Вы можете указать любой тип: int, varchar, string и многие другие. Например, мы указали varchar, поскольку нам нужно ввести строку переменной длины, содержащую буквы, не цифры.
  • Length/Values — используется для задания максимальной длины вашей записи в столбце.
  • Index — для нашего поля “ID” мы используем индекс “Primary”. Когда создаётся таблица, рекомендуется иметь один столбец ID. Он используется для индексации записей в таблице, когда настраиваются взаимосвязи между таблицами. Здесь также можно отметить “A_I”, что означает Auto Increment. Эта настройки будет автоматически увеличивать индекс (1,2,3,4…).

Нажмите Save, чтобы сохранить вашу таблицу.

Создание PHP Кода и Добавление Записи в Таблицу MySQL (Insert)

Есть два способа вставить данные в вашу базу данных MySQL. Метод PHP MySQLi и PHP Data Object, или PDO.

Метод с MySQLi

Прежде всего, нужно установить соединение с базой данных. После этого мы можем продолжить с SQL запросом на добавление записи в таблицу MySQL — INSERT. Ниже показан полный пример PHP кода с методами подключения и вставки:

" . mysqli_error($conn);
}
mysqli_close($conn);

?>

Первая часть кода (строки 3 – 18) касается подключения к базе данных. Мы не станем углубляться, так как у нас есть отдельное подробное руководство по этой теме. Если вы хотите знать, что означает каждая строка, читайте, как подключиться к базе данных.

Начнём со строки 19:

$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Test', 'Testing', 'Testing@tesing.com')";

Это наиболее важная строка PHP кода, поскольку именно она отвечает за добавление записи в таблицу MySQL. INSERT INTO — это выражение, которое добавляет запись в указанную таблицу базы данных MySQL. В нашем примере мы добавляем данные в таблицу Students.

Двигаясь дальше, в скобках, мы указываем имена столбцов таблицы, в которые хотим добавить значения: (name, lastname, email). Данные будут добавлены в определённом порядке. Если мы напишем (email, lastname, name), значения будут добавлены в неправильном порядке.

Следующая часть — выражение VALUES. Здесь мы задаём наши значения в ранее указанные поля. Таким образом, каждый столбец получит своё значение. Например, в нашем случае это будет что-то вроде: name = Test, lastname = Testing, email = Testing@testing.com.

Также стоит отметить, что мы только что выполнили SQL-запрос с использованием кода PHP. SQL-запросы должны быть заключены в кавычки. В нашем примере всё между кавычками и записанное после $sql = является SQL-запросом.

Следующая часть кода (20 – 22 строки) проверяет успешность нашего запроса:

if (mysqli_query($conn, $sql)) {
     echo "New record created successfully";
}

Мы увидим это сообщение, если запрос выполнен успешно.

И последняя часть ( строки 22 – 24) демонстрирует пример другого сообщения.

else {
     echo "Error: " . $sql . "
" . mysqli_error($conn); }

Вы увидите подобное сообщение в случае возникновения ошибки при попытке отправить запрос.

Метод с PHP Data Object (PDO)

Как и в предыдущем примере, нам нужно прежде всего выполнить подключение к базе данных, которое производится при создании нового объекта PDO. Как это сделать, показано в уже не раз упомянутом руководстве. Поскольку подключение к базе данных MySQL является объектом PDO, мы должны использовать различные PDO методы (любую функцию, которая является частью любого объекта) для подготовки и запуска запросов. Методы объектов вызываются слудеющим образом:

$the_Object->the_Method();

PDO позволяет вам подготовить SQL-код перед его выполнением. Перед запуском SQL-запрос оценивается и корректируется. Не секрет, что взломщики могут модифицировать запрос. SQL-инъекция может быть осуществлена просто путём ввода SQL-кода в поле формы. Например:

// Пользователь вписывает это в поле имени пользователя в форме для входа
john"; DROP DATABASE user_table;

// И вот, во что превращается окончательный запрос  
"SELECT * FROM user_table WHERE username = john"; DROP DATABASE user_table;

Поскольку SQL-код синтаксически правильный, точка с запятой делает из DROP DATABASE user_table новый SQL-запрос, а ваша таблица пользователей удаляется. Подготовляемые запросы, также известные как связываемые переменные не позволят завершить запрос, использовав символы  и ;. Как результат, вредоносная инструкция DROP DATABASE не будет выполнена.

Всегда используйте подготовляемые запросы, когда отправляете или получаете данные из базы данных с PDO

Чтобы использовать подготовляемые запросы, вы должны написать новую переменную, которая вызывает метод prepare() объекта базы данных.

В правильном виде код выглядит так:

 PDO::ERRMODE_EXCEPTION];

// Создаём новое соединение с базой данных MySQL с использованием PDO, $my_Db_Connection - это объект
try { 
  $my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options);
  echo "Connected successfully";
} catch (PDOException $error) {
  echo 'Connection error: ' . $error->getMessage();
}

// Задаём переменные для человека, которого мы хотим добавить в базу данных
$first_Name = "Test";
$last_Name = "Testing";
$email = "Testing@testing.com";

// Здесь мы создаём переменную, которая вызывает метод prepare() объекта базы данных
// SQL-запрос, который вы хотите запустить, вводится как параметр, а плейсхолдеры записываются следующим образом - :placeholder_name
$my_Insert_Statement = $my_Db_Connection->prepare("INSERT INTO Students (name, lastname, email) VALUES (:first_name, :last_name, :email)");

// Теперь мы сообщаем скрипту, на какую переменную фактически ссылается каждый плейсхолдер, используя метод bindParam()
// Первый параметр - это плейсхолдер в приведённом выше выражении, второй параметр - это переменная, на которую он должен ссылаться
$my_Insert_Statement->bindParam(:first_name, $first_Name);
$my_Insert_Statement->bindParam(:last_name, $last_Name);
$my_Insert_Statement->bindParam(:email, $email);

// Выполните запрос, используя данные, которые мы только-что определили
// Метод execute() возвращает TRUE, если запрос был выполнен успешно и FALSE в противном случае, позволяя вам создавать собственные сообщения
if ($my_Insert_Statement->execute()) {
  echo "New record created successfully";
} else {
  echo "Unable to create record";
}

// На этом этапе вы можете изменить данные переменных и выполнить запрос снова, чтобы добавить больше данных в БД.
$first_Name = "John";
$last_Name = "Smith";
$email = "john.smith@email.com";
$my_Insert_Statement->execute();

// Выполните снова с другими переменными 
if ($my_Insert_Statement->execute()) {
  echo "New record created successfully";
} else {
  echo "Unable to create record";
}

В строках 28, 29 и 30 мы используем метод bindParam() объекта базы данных. Есть так же метод bindValue(), отличающийся от предыдущего.

  • bindParam() — связывает переменную PHP с параметром, достигнув execute(). Первый раз, когда скрипт доходит до метода execute() он видит, что $first_Name ссылается на “Test”, связывает это значение и выполняет запрос. Когда скрипт добирается до метода execute() второй раз, он смотрит, что $first_Name теперь ссылается на “John”, связывает это значение и запускает запрос опять с новым значением. Важно понимать, что мы создаём запрос один раз и повторно используем его, подставляя разные данные в разных местах скрипта.
  • bindValue() — этот метод связывает параметр с заданным значением. Поскольку заданное значение $first_Name — “Test”, при достижении метода bindValue(), оно будет использоваться каждый раз при вызове метода execute() для $my_Insert_Statement.

Обратите внимание, что мы повторно используем переменную $first_Name и задаём ей новое значение во второй раз. Если вы проверите свою базу данных после запуска этого скрипта, там будут оба заданных имени, даже если переменная $first_Name в конце скрипта равна “John”. Помните, что PHP оценивает содержимое всего скрипта перед его выполнением.

Если вы измените свой скрипт, заменив bindParam на bindValue, вы добавите в базу MySQL “Test Testing” дважды, а John Smith будет проигнорирован.

Проверка Статуса Выполнения и Устранение Распространённых Ошибок

Если запрос, который мы выполнили и вставили в базу данных MySQL, был успешным, мы увидим следующее сообщение:

Connect Successfully
New record created successfully

Устранение Распространённых Ошибок

Если же запись содержит ошибку, вы увидите соответствующее сообщение. Но не волнуйтесь, есть множество вариантов, как можно устранить эти ошибки mySQL.

MySQLi

Если вы столкнулись с ошибкой, работая с MySQLi, причина скорее всего в неправильном синтаксисе. Для примера давайте сделаем одну синтаксическую ошибку в нашем коде. В результате мы увидим что-то вроде этого:

Connect successfully
Error: INSERT INTO students {name, lastname, email} VALUES ('Test', 'Testing', 'Testing@testing.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Test', 'Testing', 'Test@testingcom')' at line 1"

Как мы видим, первая часть кода в порядке, подключение было успешно установлено, но с нашим SQL-запросом не всё так гладко.

"Error: INSERT INTO Students {name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com') You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')' at line 1"

Допущена синтаксическая ошибка, которая привела к невозможности выполнения нашего скрипта. Ошибка была допущена здесь:

$sql = "INSERT INTO Students {name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')";

Мы использовали фигурные скобки вместо простых. Поскольку это неправильно, наш скрипт выдал синтаксическую ошибку.

PDO

В строке 7 подключения PDO, режим обработки ошибок установлен в «display all exceptions» (отображать все исключения). Если вы уберёте это из скрипта и запрос потерпит неудачу, вы не получите никакого сообщения об ошибке. Со включёнными исключениями, будут отображаться конкретные возникшие проблемы.

Тем не менее этот режим лучше использовать при разработке скриптов, так как в случае попытки получить несанкционированный доступ к вашим данным он может выявить имена баз данных и таблиц. Если же причиной стала синтаксическая ошибка, как в примере с фигурными скобками, сообщение будет выглядеть примерно так:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')' at line 1"

Другие проблемы, с которым вы можете столкнуться:

  • Неверно указаны столбцы (несуществующие столбцы или ошибки в написании названий).
  • Несоответствие типа значения типу столбца. Например, когда мы хотим присвоить числовое значение 47 полю Name, мы получим ошибку, потому что предполагается, что значение будет строкой. Но, если вы укажете число в кавычках, например, “47”, ошибки не будет, потому что наше число будет записано как строка в этот столбец.
  • Попытка ввести данные в таблицу, которой не существует или ошибка в написании названия таблицы.

Все эти ошибки могут быть исправлены, следуя руководствам по исправлению ошибок или журнала ошибок (англ.).

В случае успешного добавления, наши данные должны появиться в базе. Вот пример таблицы, в которую мы добавили данные, если смотреть в phpMyAdmin.

Добавление Записи в Таблицу MySQL - Вид Таблицы в phpMyAdmin