METANIT.COM

Inserting Data into Tables from PDO

Summary: in this tutorial, you will learn how to insert one or more rows into a table using PHP PDO.

The steps for inserting a row into a table

To insert a row into a table, you follow these steps:

  • First, connect to the database by creating a new PDO object.
  • Second, construct the INSERT statement. If you need to pass a value to the INSERT statement, you can use the placeholders in the format :parameter . Later, you can substitute the parameter by its value.
  • Third, create a prepared statement by calling the prepare() method of the PDO object. The prepare() method returns an instance of the PDOStatement class.
  • Finally, call the execute() method of the prepared statement and pass the values.

Inserting a row into a table example

The following example shows how to insert a new row into the publishers table:

 $pdo = require_once 'connect.php'; // insert a single publisher $name = 'Macmillan'; $sql = 'INSERT INTO publishers(name) VALUES(:name)'; $statement = $pdo->prepare($sql); $statement->execute([ ':name' => $name ]); $publisher_id = $pdo->lastInsertId(); echo 'The publisher id ' . $publisher_id . ' was inserted';Code language: HTML, XML (xml)
  • First, use the connect.php to connect to the bookldb database.
  • Next, construct an SQL INSERT statement. The :name is the placeholder that will be replaced by a publisher name.
  • Then, prepare the INSERT statement for execution by calling the prepare() method of the $pdo instance. The prepare() method returns an instance of the PDOStatement class.
  • After that, execute the prepared statement by passing the values to the execute() method.
  • Finally, get the inserted id by calling the lastInsertId() method of the PDO object.

Note that this tutorial uses the connect.php script developed in the connecting to the database tutorial.

Inserting multiple rows into a table example

To insert multiple rows into a table, you need to call execute() the method multiple times. The method inserts a new row into the table in each call. For example:

 $pdo = require_once 'connect.php'; $names = [ 'Penguin/Random House', 'Hachette Book Group', 'Harper Collins', 'Simon and Schuster' ]; $sql = 'INSERT INTO publishers(name) VALUES(:name)'; $statement = $pdo->prepare($sql); foreach ($names as $name) < $statement->execute([ ':name' => $name ]); >Code language: HTML, XML (xml)

In this example, we have a list of publishers stored in the $names array.

To insert these publishers into the publishers table, we iterate over the elements of the $names array using the foreach and insert each element into the table.

Summary

Источник

Php new pdo insert

Для добавления данных в БД MySQL применяется sql-команда INSERT , которая имеет следующий синтаксис:

INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)

Данная команда также выполняется методом exec() объекта PDO. Стоит отметить, что для sql-команд INSERT , UPDATE и DELETE метод exec() возвращает количество затронутных командой строк (добавленных, измененных или удаленных). Таким образом, мы можем узнать сколько строк было добавлено.

Сначала рассмотрим простейшее добавление одного объекта в БД. Для примера возьмем созданную в прошлой теме базу данных «testdb1» и созданную в ней таблицу Users со следующим определением:

CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)

И для добавления определим следующий скрипт PHP:

exec($sql); echo "В таблицу Users добавлено строк: $affectedRowsNumber"; > catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > ?>

Команда на добавление здесь выглядит следующим образом:

"INSERT INTO Users (name, age) VALUES ('Tom', 37)"

То есть в столбец name добавляется строка «Tom», а в столбец age — число 37. Для столбца id не добавляется никакого значения, потому что при создании таблицы для него указан параметр AUTO_INCREMENT — то есть значение этого столбца у каждой добавляемой строки будет автоматически увеличиваеться по сравнению с предыдущей на единицу.

При добавлении мы получаем количество добавленных строк в переменую $affectedRowsNumber и затем выводим ее значение в браузере. Поэтому при успешном добавлении мы увидим

Множественное добавление

Также мы можем добавить сразу несколько объектов:

exec($sql); echo "В таблицу Users добавлено строк: $affectedRowsNumber"; > catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > ?>

Здесь в таблицу добавляется три строки. Соответственно в браузере мы увидим:

Добавление данных из формы HTML

В большинстве случаев добавляемые данные будут приходить из вне, например, присылаться в запросе пользователя. Рассмотрим добавление данных, отправленных из формы HTML. Для этого определим следующий скрипт:

     exec($sql); // если добавлена как минимум одна строка if($affectedRowsNumber > 0 ) < echo "Data successfully added: name=$username age= $userage"; >> catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > > ?> 

Create a new User

User Name:

User Age:

Здесь мы проверяем, пришли ли с сервера данные в POST-запросе, которые имеют ключи «username» и «userage»:

if (isset($_POST["username"]) && isset($_POST["userage"])) 

Если эти данные имеются, то есть был отправлен post-запрос с данными на добавление, то мы получаем эти данные в переменные и добавляем их в бд.

$sql = "INSERT INTO Users (name, age) VALUES ('$username', $userage)";

Если была добавлена строка, то есть метод exec() возвратил число больше нуля, то выводим пользователю соответствующее сообщение.

После кода php собственно определена форма на добавление данных с помощью post-запроса.

Запустим скрипт. Введем в форму данные и нажмем на кнопку:

Insert data in PHP and PDO in MySQL

И данные будут добавлены. Вроде все хорошо. Однако здесь есть большой недостаток.

Параметризация запросов

Недостаток выше приведенного скрипа заключается в том, что мы никак не констролируем присылаемые данные и сохраняем их в базу данных как есть. Что несет потенциальную угрозу безопасности, особенно при добавлении строк типа "; DELETE FROM `Users`; -- . Кроме того, в ряде случае может быть проблематично добавить даже безопасные данные, например, строку, которая содержит одинарную кавычку, типа "Tom O'Brian".

Для решения этих проблем PDO предлагает параметризацию запросов с помощью применения заранее подготовленных выражений - prepared statement . Выражения prepared statement вместо жестко установленных значений или переменных принимают параметры, которые не привязаны к конкретным значениям. Эти выражения prepared statement посылаются серверу базы данных до того, как станут известны используемые данные, что позволяет серверу приготовить их к выполнению, но при этом они не выполняются. А когда пользователь присылает данные - параметры заменяются пришедшими данными, и выражение prepared statement выполняется.

Перепишем предыдущий пример с использованием параметров:

     prepare($sql); // привязываем параметры к значениям $stmt->bindValue(":username", $_POST["username"]); $stmt->bindValue(":userage", $_POST["userage"]); // выполняем prepared statement $affectedRowsNumber = $stmt->execute(); // если добавлена как минимум одна строка if($affectedRowsNumber > 0 ) < echo "Data successfully added: name=" . $_POST["username"] ." age= " . $_POST["userage"]; >> catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > > ?> 

Create a new User

User Name:

User Age:

В SQL-выражении теперь применяются параметры:

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)";

:username и :userage - это названия параметров. Причем они начинаются с символа двоеточия :.

Само выражение prepared statement создается с помощью метода prepare() объекта PDO, в который передается выполняемая sql-команда:

Фактически здесь создается объект PDOStatement , который сохраняется в переменную $stmt .

Чтобы связать параметр с конкретным значением у объекта PDOStatement вызывается метод bindValue() . Первый параметр этого метода - собственно параметр из sql-команды, а второй параметр - передаваемое ему значение.

$stmt->bindValue(":username", $_POST["username"]);

Так, в данном случае параметр :username привязывается к значению из $_POST["username"]

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

$user = "Tom" // привязка к переменной $user $stmt->bindValue(":username", $user);

Для выполнения sql-выражения у объекта PDOStatement вызывается метод execute() , который для команды INSERT возвращает число добавленных строк.

Передача значений параметрам через массив по имени

В примере выше для параметризации применялся метод bindValue() :

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)"; $stmt = $conn->prepare($sql); // привязываем параметры к значениям $stmt->bindValue(":username", $_POST["username"]); $stmt->bindValue(":userage", $_POST["userage"]); // выполняем prepared statement $affectedRowsNumber = $stmt->execute();

Но есть и другой способ привязки параметров к значениям - мы можем передать в метод execute() параметры и их значения в виде ассоциативного массива:

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)"; $stmt = $conn->prepare($sql); // через массив передаем значения параметрам по имени $rowsNumber = $stmt->execute(array(":username" => $_POST["username"], ":userage" => $_POST["userage"]));

В этом случае названия параметров являются ключами.

Передача значений параметрам через массив по позиции

Третий способ привязки значений к параметрам представляет передачу значений по позиции:

$sql = "INSERT INTO Users (name, age) VALUES (?, ?)"; $stmt = $conn->prepare($sql); // через массив передаем значения параметрам по позиции $rowsNumber = $stmt->execute(array($_POST["username"], $_POST["userage"]));

В этом случае вместо названий параметров применяются знаки вопроса ? . Для передачи этим параметрам значений в метод execute() также передается массив. Первое значение массива привязывается к первому параметру (условно добавляется вместо первого знака вопроса), второе значение привязывается ко второму параметру и т.д.

Источник

PHP MySQL Insert Data

After a database and a table have been created, we can start adding data in them.

Here are some syntax rules to follow:

  • The SQL query must be quoted in PHP
  • String values inside the SQL query must be quoted
  • Numeric values must not be quoted
  • The word NULL must not be quoted

The INSERT INTO statement is used to add new records to a MySQL table:

To learn more about SQL, please visit our SQL tutorial.

In the previous chapter we created an empty table named "MyGuests" with five columns: "id", "firstname", "lastname", "email" and "reg_date". Now, let us fill the table with data.

Note: If a column is AUTO_INCREMENT (like the "id" column) or TIMESTAMP with default update of current_timesamp (like the "reg_date" column), it is no need to be specified in the SQL query; MySQL will automatically add the value.

The following examples add a new record to the "MyGuests" table:

Example (MySQLi Object-oriented)

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) die("Connection failed: " . $conn->connect_error);
>

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if ($conn->query($sql) === TRUE) echo "New record created successfully";
> else echo "Error: " . $sql . "
" . $conn->error;
>

Example (MySQLi Procedural)

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) die("Connection failed: " . mysqli_connect_error());
>

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if (mysqli_query($conn, $sql)) echo "New record created successfully";
> else echo "Error: " . $sql . "
" . mysqli_error($conn);
>

Example (PDO)

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
// use exec() because no results are returned
$conn->exec($sql);
echo "New record created successfully";
> catch(PDOException $e) echo $sql . "
" . $e->getMessage();
>

Источник

Читайте также:  Css opacity and text
Оцените статью