Вносим пользовательские данные в базу данных MySql. Php запись в базу данных mysql
В этом посте хочу рассказать, как передать в Базу Данных, введенные данные в форму
. И так мы создаем простую форму, где у нас будет два поля: имя пользователя и его электронная почта:
Эта форма может применятся для регистрации нового пользователя, для рассылки новостей, для сбора статистики, да для чего угодно... В общем в эту форму пользователь забивает свои данные: имя и почту, нажимает на кнопку и дальше данные переходят в php скрипт:
$name = $_POST["name"]; $email = $_POST["email"]; $result = mysqli_query("INSERT INTO user (name, email) VALUES ("$name", "$email")"); if ($result) { echo "Данные успешно сохранены!"; } else { echo "Произошла ошибка, пожалуйста повторите попытку."; }
Что же в этом скрипте происходит? Сейчас разберемся!
Введенные в форму данные, методом POST переходят в php скрипт (который написан выше), и при помощи глобального массива $_POST данные формируются в переменные $name и $email:
$name = $_POST["name"]; $email = $_POST["email"];
После того, как переменные готовы для занесения в базу, составляем запрос. Но прежде Ваши скрипты должны быть уже подключены к БД, как подключиться к БД, я писал в этой теме: . Сам запрос выглядит так:
$result = mysqli_query("INSERT INTO user (name, email) VALUES ("$name", "$email")");
В этом коде мы обозначили, что в ячейки name и email , которые находятся в таблице user , будут добавлены следующие переменные: $name и $email .
Далее, если все прошло успешно, мы получим сообщение из условия:
Данные успешно сохранены!
Если же возникли какие то проблемы и данные не были занесены, мы получим сообщение об ошибке:
Произошла ошибка, пожалуйста повторите попытку.
Вот и все!
*** *** *** *** ***
При желании можно добавить больше полей для ввода информации, например нам необходимо добавить поле для ввода города пользователя. У нас уже есть готовый скрипт (написан выше), теперь просто добавим поле Ваш город
, переменную назовем: $city . И так в форму ввода данных, после:
Ваш E-mail:
добавляем:
Ваш город:
В php скрипте, после:
$email = $_POST["email"];
добавляем:
$city = $_POST["city"];
Ну и конечно в запросе добавляем тоже, вот так:
$result = mysqli_query("INSERT INTO user (name, email, city) VALUES ("$name", "$email", "$city")");
Вот, что должно получится в итоге:
Форма ввода:
Скрипт:
$name = $_POST["name"]; $email = $_POST["email"]; $city = $_POST["city"]; $result = mysqli_query("INSERT INTO user (name, email, city) VALUES ("$name", "$email", "$city")"); if ($result == true) { echo "Данные успешно сохранены!"; } else { echo "Произошла ошибка, пожалуйста повторите попытку."; }
Как видите ни чего сложного! При необходимости можно добавить ещё поле, и ещё, и ещё...
В этом руководстве вы познакомитесь с тем, как начать управлять базой данных из вашего PHP скрипта. Вы изучите добавление записи в таблицу MySQL, используя PHP код . Перед тем как начать, ознакомьтесь с нашими другими руководствами, которые раскрывают основные шаги работы с PHP и базами данных – подключение из PHP к базе данных MySQL (англ.).
Перед началом проверьте наличие следующего:
- Доступ к вашей панели управления хостингом
Шаг 1 - Создание таблицы
Прежде всего, нам нужно создать таблицу для ваших данных. Это очень простая процедура, которую вы можете сделать в phpMyAdmin из вашей панели управления хостингом. Мы уже описывали процесс создания базы данных MySQL в предыдущем руководстве (англ.), поэтому мы пропустим этот момент здесь.
После входа на страницу phpMyAdmin вы увидите подобную картину:
Создадим таблицу с названием Students
для нашей базы данных u266072517_name
. Создать новую таблицу можно по кнопке Create Table
. После этого вы увидите новую страницу, где вы можете ввести все необходимые данные для своей таблицы:
Это наиболее простой способ создания таблицы, для получения большей информации по поводу структуры таблицы/базы данных и какие настройки можно использовать для каждого поля, обратитесь к официальной документации phpMyAdmin (англ.).
Приведём здесь несколько простых пояснение полей, которые мы будем использовать:
- Name – это имя вашего поля. Будет отображено в самом верху вашей таблицы.
- Type – здесь можно установить тип поля. Например, мы выбираем varchar , потому что здесь нам нужно ввести строку с именем (в котором есть буквы, не цифры).
- Length/Values – используется для задания максимальной длины вашей записи в этом поле.
- Index – мы используем индекс “Primary” для нашего поля “ID”. Когда создаётся таблица, рекомендуется иметь одно поле ID. Она используется для индексации записей в таблице, когда настраиваются взаимосвязи между таблицами. Здесь также можно отметить “A_I” , что означает Auto Increment . Эта настройки будет автоматически увеличивать индекс (1,2,3,4…).
Нажмите Save и ваша таблица будет создана.
Шаг 2 - Создание PHP кода и добавление записи в таблицу MySQL
Вариант 1 – Метод MySQLi
Прежде всего, нужно установить соединение с базой данных, согласно нашему предыдущему руководству . После этого мы можем продолжить с SQL запросом на добавление записи в таблицу MySQL – INSERT . Здесь полный пример кода с подключением и методом вставки:
" . mysqli_error($conn); } mysqli_close($conn); ?>
Таким образом первая часть кода (строки 3 – 18 ) относятся к части установления соединения к базе данных. Мы не будем заново проходить по этой части, если вы хотите знать, что означает каждая строка, обратитесь к нашему предыдущему руководству как подключиться к базе данных (англ.).
Начнём со строки 19 :
$sql = "INSERT INTO Students (name, lastname, email) VALUES ("Thom", "Vial", "[email protected]")";
Это наиболее важная строка кода, она делает всё, о чём мы описываем в этом руководстве – добавление записи в таблицу MySQL в базу данных. INSERT INTO – это выражение, которое добавляет запись в указанную таблицу базы данных MySQL. В нашем примере мы добавляем данные в таблицу Students .
Двигаясь дальше, в скобках, мы определяем поля таблицы, значения в которые будем добавлять: (name, lastname, email) . Данные будут добавлены в определённом порядке. Если мы напишем (email, lastname, name) , значения будут добавлены в другом порядке.
Следующая часть значения VALUES . Здесь мы задаём наши значения в ранее указанные поля. Таким образом, каждое поле получит своё значение. Например, в нашем случае это будет что-то вроде: name = Thom, lastname = Vial, email = [email protected] .
Что важно отметить, что тут мы формируем запрос 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);
}
Этот код отображает нам сообщение об ошибке, на случай, если что-то пошло не так.
Вариант 2 – Метод объектов данных PHP (P HP D ata O bject)
Как и в предыдущем примере, нам нужно прежде всего выполнить подключение к базе данных, которое производится при создании нового объекта PDO – предыдущее руководство рассказывает о том, как это происходит. Поскольку подключение к базе данных MySQL – это PDO объект, мы должны использовать различные PDO ‘методы’ (своего рода функции, которые являются частью определённого объекта) для подготовки и запуска запроса. Методы объектов вызываются таким образом:
$the_Object->the_Method();
PDO позволяет ‘подготовить’ SQL код перед его выполнением. Запрос SQL вычисляется и корректируется перед запуском. Так, простая атака путём SQL инъекции может быть выполнена заполняя код SQL в поле формы. Например:
// User writes this in the username field of a login form thom"; DROP DATABASE user_table; // The final query becomes this "SELECT * FROM user_table WHERE username = thom"; DROP DATABASE user_table;
Поскольку SQL код синтаксически правильный, точка с запятой делает из DROP DATABASE user_table новый запрос SQL, и ваша таблица пользователей удалена. Подготавливаемые выражения не разрешают символы “ и ; для завершения исходного запроса, и инструкция DROP DATABASE никогда не выполнится.
Всегда используйте подготавливаемые запросы, когда отправляете или получаете данные из базы данных с PDO.
Для использования подготавливаемых выражений, нужно создать новую переменную, которая вызовет метод prepare() на объекте базы данных.
В правильном виде код выглядит:
$servername = "mysql.hostinger.com"; $database = "u266072517_name"; $username = "u266072517_user"; $password = "buystuffpwd"; $sql = "mysql:host=$servername;dbname=$database;"; $dsn_Options = ; // Create a new connection to the MySQL database using PDO, $my_Db_Connection is an object try { $my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options); echo "Connected successfully"; } catch (PDOException $error) { echo "Connection error: " . $error->getMessage(); } // Set the variables for the person we want to add to the database $first_Name = "Thom"; $last_Name = "Vial"; $email = "[email protected]"; // Here we create a variable that calls the prepare() method of the database object // The SQL query you want to run is entered as the parameter, and placeholders are written like this:placeholder_name $my_Insert_Statement = $my_Db_Connection->prepare("INSERT INTO Students (name, lastname, email) VALUES (:first_name, :last_name, :email)"); // Now we tell the script which variable each placeholder actually refers to using the bindParam() method // First parameter is the placeholder in the statement above - the second parameter is a variable that it should refer to $my_Insert_Statement->bindParam(:first_name, $first_Name); $my_Insert_Statement->bindParam(:last_name, $last_Name); $my_Insert_Statement->bindParam(:email, $email); // Execute the query using the data we just defined // The execute() method returns TRUE if it is successful and FALSE if it is not, allowing you to write your own messages here if ($my_Insert_Statement->execute()) { echo "New record created successfully"; } else { echo "Unable to create record"; } // At this point you can change the data of the variables and execute again to add more data to the database $first_Name = "John"; $last_Name = "Smith"; $email = "[email protected]"; $my_Insert_Statement->execute(); // Execute again now that the variables have changed if ($my_Insert_Statement->execute()) { echo "New record created successfully"; } else { echo "Unable to create record"; }
В строках 28, 29 и 30 мы используем метод bindParam() объекта базы данных. Есть так же метод bindValue() , отличающийся от предыдущего.
- bindParam() – этот метод подсчитывает данные, когда метод execute() достигнут. Первый раз, когда скрипт доходит до метода execute() он видит, что $first_Name ссылается на “Thom”, связывает это значение и выполняет запрос. Когда скрипт добирается второй раз до метода execute() , он смотрит, что $first_Name теперь ссылается на “John”, связывает это значение и запускает запрос опять с новым значением. Важно понимать, что мы создаём запрос один раз и затем подставляем разные данные в разных местах скрипта.
- bindValue() – этот метод вычисляет данные, как только до него доходит очередь. Так как значение $first_Name было задано как “Thom”, на момент, когда мы достигли метода bindValue() , оно будет использован при вызове метода execute() для $my_Insert_Statement .
Обратите внимание, что мы повторно используем переменную $first_Name и задаём ей новое значение во второй раз. Если вы проверите свою базу данных после запуска этого скрипта, там будут оба из заданных имени, вопреки этому значение переменной $first_Name будет равно “John” в конце этого скрипта. Помните, что PHP оценивает содержимое скрипта перед его запуском.
Если вы измените свой скрипт заменив bindParam на bindValue , вы добавите в базу MySQL “Thom Vial” дважды в базу данных и John Smith будет проигнорирован.
Шаг 3 - Проверка успешности выполнения и решение общих вопросов
Если запрос, который мы запустили в базе данных MySQL выполнился успешно, мы увидим такое сообщение:
Решение распространённых ошибок
MySQLi
В любом другом случае вместо сообщения, приведенного выше, будет показано сообщение об ошибке. Например, давайте допустим одну синтаксическую ошибку в нашем коде и мы получим такое:
Как мы видим, первая часть кода в порядке, подключение было успешно установлено, но наш запрос SQL при выполнении столкнулся с неудачей.
"Error: INSERT INTO Students {name, lastname, email} VALUES ("Thom", "Vial", "[email protected]") 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", "[email protected]")" at line 1"
Допущена синтаксическая ошибка, которая приводит к неудаче в выполнении нашего скрипта. Ошибка была здесь:
$sql = "INSERT INTO Students {name, lastname, email} VALUES ("Thom", "Vial", "[email protected]")";
Как вы видите, мы используем фигурные скобки вместо круглых. Это неверно и приводит к синтаксической ошибке в нашем скрипте.
PDO
В строке 7 подключения PDO, режим обработки ошибок установлен в ‘display all exceptions’ (отображать все исключения). Если вы это уберёте из скрипта и запрос потерпит неудачу, вы не получите никакого сообщения об ошибке. Со включёнными исключениями, будут отображаться конкретные возникшие проблемы. В основном, это лучше использовать, когда разрабатываете скрипт, так как это может выявить имена баз данных и таблиц, которые вы бы хотели спрятать от кого-либо, кто может получить несанкционированный доступ к вашим данным. В случае выше, когда фигурные скобки использовались вместо круглых, ошибка выглядит, как показано ниже:
Fatal error: Uncaught exception "PDOException" with message "SQLSTATE: 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", "[email protected]")" at line 1"
Другие проблемы, с которым вы можете столкнуться:
- Неверно указаны поля (несуществующие поля или ошибки в написании названий).
- Несоответствие типа значения типу поля. Например, когда мы хотим присвоить значение числа 47 полю Name , мы получим ошибку, потому что предполагается, что значение будет строкой. Но, если вы укажете число в кавычках, например, “47” , ошибки не будет, потому что наше число будет записано как строка в это поле.
- Попытка ввести данные в таблицу, которой не существует или ошибка в написании названия таблицы.
Все эти ошибки могут быть исправлены следуя руководствам по исправлению ошибок или проверяя журнал ошибок (англ.).
После успешного добавления данных мы должны увидеть их в нашей базе данных. Вот пример таблицы, в которую мы добавили наши данные, если смотреть в phpMyAdmin
.
Заключение
В этом руководстве вы изучили, как использовать PHP код для добавления записи в таблицу MySQL с использованием MySQLi и PDO . Также рассмотрели случаи распространённых ошибок и их решения. Знание того, как использовать PHP код, чтобы добавить в базу данных MySQL пригодится независимо от того, вы учитесь программировать или уже создаёте свой сайт.
Последнее обновление: 1.11.2015
Для добавления данных используется выражение "INSERT":
$query ="INSERT INTO tovars VALUES(NULL, "Samsung Galaxy III","Samsumg")";
Выражение "INSERT" вставляет в таблицу одну строку. После ключевого слова INTO указывается название таблицы, а после VALUES в скобках указываются набор значений для всех столбцов. Так как у нас в таблице три столбца, то мы указываем три значения.
Так как в прошлой теме при создании таблицы мы указывали следующую очередность столбцов: id, name, company, то в данном случае для столбца id передается значение NULL, для name - "Samsung Galaxy III", а для company - "Samsumg".
Поскольку столбец id определен как AUTO_INCREMENT, то нам необязательно указывать для него определенное числовое значение, и можно передать значение NULL, а MySQL присвоит столбцу следующее доступное значение.
Теперь рассмотрим добавление данных на примере. Создадим файл create.php со следующим содержимым:
Данные добавлены"; } // закрываем подключение mysqli_close($link); } ?>
Добавить новую модель
Здесь код взаимодействия с базой данных объединен с функциональностью форм: c помощью формы мы вводим данные для добавления в бд.
Безопасность и MySQL
Здесь мы использовали функцию mysqli_real_escape_string() . Она служит для экранизации символов в строке, которая потом используется в запросе SQL. В качестве параметров она принимает объект подключения и строку, которую надо экранировать.
Таким образом, мы применяем экранизацию символов фактически два раза: сначала для sql-выражения с помощью функции mysqli_real_escape_string() , а затем для html с помощью функции htmlentities() . Это позволит нам защититься сразу от двух видов атак: XSS-атак и SQL-инъекций.
И приведены
. А сейчас мы поговорим, как добавлять изображения в базу MySQL через форму, используя PHP
.
Создание поля в MySQL базе для добавления изображения
Для начала хочу сказать, что для хранения изображений в базе данных MySQL необходимо определить одно из полей таблицы как производное от типа BLOB.
Сокращение BLOB означает большой двоичный объект. Тип хранения данных BLOB обладает несколькими вариантами:
- TINYBLOB — Может хранить до 255 байт
- BLOB может хранить до 64 килобайт информации
- MEDIUMBLOB — до 16 мегабайт
- LONGBLOB до 4 гигабайт
Для хранения файла изображения в базе данных необходимо прочитать файл в переменную и создать запрос на добавление данных в таблицу.
Подготовка формы на странице для добавления изображения в базу данных MySQL
В моём случае задача была добавлять два изображения в базу через форму, используя PHP . У нас есть форма с двумя полями и кнопкой отправить:
form name=»form1″ method=»post» action=»add_image.php»
enctype=»multipart/form-data»
Напомню, что атрибут action указывает файл, который будет выполнять загрузку файлов изображения. Атрибут enctype указывает на способ кодирования содержимого формы и информацию о подгрузке файлов. Посмотрите, как правильно заполнять атрибут enctype чтобы, избежать .
Примечание: поддержка загрузки нескольких файлов была введена в версии 3.0.10.
Написание кода PHP для сохранения изображения в базе данных MySQL
Так как мы отправляем два файла в атрибуте name после слова указываем «userfile» с квадратными скобками, этим мы даем понять, что отправляем несколько файлов с помощью массива, в котором находятся атрибуты файлов:
$_FILES[‘userfile’][‘name’]
Оригинальное имя файла на клиентской машине.
$_FILES[‘userfile’][‘type’]
mime-тип файла, если браузер предоставил эту информацию.
Пример: "image/gif" .
$_FILES[‘userfile’][‘size’]
$_FILES[‘userfile’][‘tmp_name’]
Временное имя файла, под которым загруженный файл был сохранён на сервере.
Как получить значения каждого файла?
К примеру, предположим, что отправлены файлы с именами /home/test/1.jpg и /home/test/2.jpg.
В этом случае $_FILES[‘userfile’][‘name’]
будет содержать значение 1.jpg,
а $_FILES[‘userfile’][‘name’]
— значение 2.jpg
Аналогично, $_FILES[‘userfile’][‘size’] будет содержать значение размера файла 1.jpg, и так далее. Теперь рассмотрим код файла add_image.php, который был указан в атрибуте формы action .
1024*1024||$image_size==0) { $ErrorDescription="Каждое изображение не должно привышать 1Мб! Изображение в базу не может быть добавлено."; return ""; } // Если файл пришел, то проверяем графический // ли он (из соображений безопасности) if(substr($_FILES["userfile"]["type"][$num], 0, 5)=="image") { //Читаем содержимое файла $image=file_get_contents($_FILES["userfile"]["tmp_name"][$num]); //Экранируем специальные символы в содержимом файла $image=mysql_escape_string($image); return $image; }else{ ErrorDescription="Вы загрузили не изображение, поэтому оно не может быть добавлено."; return ""; } }else{ $ErrorDescription="Вы не загрузили изображение, поле пустое, поэтому файл в базу не может быть добавлен."; return ; } return $image; } ?>
Итак, в этой статье мы говорили о том, как сохранить изображение в базе данных MySQL, используя PHP.
В этой статье мы разберём, пожалуй, одни из самых важных SQL-запросов . Это запросы на добавление и удаление записей из таблицы базы данных . Поскольку, ОЧЕНЬ часто приходится добавлять новые записи в таблицу , причём делать это в автоматическом режиме, то данный материал обязателен к изучению.
Для начала SQL-запрос на добавление новой записи в таблицу :
INSERT INTO users (login, pass) values("TestUser", "123456")
При добавлении записи вначале идёт команда "INSERT INTO ", затем название таблицы, в которую мы вставляем запись. Далее идёт в круглых скобках названия полей, которые мы хотим заполнить. А затем в круглых скобках после слова "values " начинаем перечислять значения тех полей, которые мы выбрали. После выполнения этого запроса в нашей таблице появится новая запись.
Иногда требуется обновить запись в таблице , для этого существует следующий SQL-запрос :
UPDATE users SET login = "TestUser2", pass="1234560" WHERE login="TestUser"
Данный запрос является более сложным, так как он имеет конструкцию "WHERE ", но о ней чуть ниже. Вначале идёт команда "UPDATE ", затем имя таблицы, а после "SET " мы описываем значения всех полей, которые мы хотим изменить. Было бы всё просто, но встаёт вопрос: "А какую именно запись следует обновлять? ". Для этого существует "WHERE ". В данном случае мы обновляем запись, поле "login " у которой имеет значение "TestUser ". Обратите внимание, что если таких записей будет несколько, то обновятся абсолютно все ! Это очень важно понимать, иначе Вы рискуете потерять свою таблицу.
Давайте немного ещё поговорим о "WHERE ". Помимо простых проверок на равенство существуют так же и неравенства, а также логические операции: AND и OR .
UPDATE users SET login = "TestUser2", pass="1234560" WHERE id < 15 AND login="TestUser"
Данный SQL-запрос обновит те записи, id которых меньше 15 И поле "login " имеет значение "TestUser ". Надеюсь, Вы разобрались с конструкцией "WHERE ", потому что это очень важно. Именно "WHERE " используется при выборке записей из таблиц , а это самая частоиспользуемая задача при работе с базами данных.
И, напоследок, простой SQL-запрос на удаление записей из таблицы :
DELETE FROM users WHERE login="TestUser2"
После команды "DELETE FROM " идёт имя таблицы, в которой требуется удалить записи. Дальше описываем конструкцию "WHERE". Если запись будет соответствовать описанным условиям, то она будет удалена. Опять же обратите внимание, в зависимости от количества записей, удовлетворяющих условию после "WHERE ", может удалиться любое их количество.