METANIT.COM

Класс для безопасной и удобной работы с MySQL

Поэтому я и решил написать простой класс, обеспечивающий необходимую функциональность, который можно и нужно использовать для замены классических mysql_query/mysql_fetch_array.

Код доступен на Гитхабе: http://github.com/colshrapnel/safemysql/blob/master/safemysql.class.php

Основной принцип работы таков:
Большая часть операций выполняется в одну строчку. В боле сложных случаях всё делается по-старинке — запрос собирается вручную, НО — с использованием гарантированно безопасных плейсхолодеров.

— ?s («string») — строки (а также DATE, FLOAT и DECIMAL).
— ?i («integer») — целые числа.
— ?n («name») — имена полей и таблиц
— ?p («parsed») — для вставки уже обработанных частей запроса
— ?a («array») — набор значений для IN (строка вида ‘a’,’b’,’c’ )
— ?u («update») — набор значений для SET (строка вида `field`=’value’,`field`=’value’ )

Первый служит для добавления строк, а так же всех типов данных, приравненных к ним. Второй — целых чисел.
Третий — идентификаторый — служит для динамической вставки в запрос имен полей и таблиц.
Он требуется потому, что правила форматирования идентификаторов отличаются от правил форматирования строк. Ограничивается он не одинарной кавычкой, а обратным апострофом, а экранируется не слешем, а удвоением.
Назначение четвёртого — подставлять в запрос уже обработанные части запроса.

Последние два введены для удобства. Очень часто бывает нужно подставить массив в оператор IN(). Классическими средствами это сделать затруднительно, а с помощью плейсхолдера — не сложнее, чем строку.
Наличие плейсхолдера ?u позволяет избавиться от выделенных методов insert() и update(), сделав запросы более гибкими.

Читайте также:  Java servlet exec process

При необходимости набор плейсхолдеров может быть легко расширен.

Единственный случай, не охватываемый плейсхолдерами — это SQL операторы, такие, как AND, DESC и любые другие.
В случае, если они добавляются в запрос динамически, то их надо помещать в запрос только из белого списка, заранее прописанного в скрипте.

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

Для такой фильтрации служат методы filterArray() и whiteList()

Удобство достигается за счёт следующих факторов:

Хелпер — функция, берущая на себя всю рутинную работу по обработке запроса, и сразу возвращающая нужный результат. В сочетании с плейсхолдерами позволяет сокращать код в 3-5 раз!
Пример: допустим, нам надо получить информацию о пользователе по имени, полученного из GET запроса.
Классический код будет таким:
$name = mysql_real_escape_string($_GET[‘name’]);
$result = mysql_query(«SELECT * FROM users where name=’$name'»);
$user = mysql_fetch_array($result);

Как это делается с помощью функции-хелпера? В одну строчку!
$user = $db->getRow(«SELECT * FROM users where name=?s»,$_GET[‘name’]);

причём чем сложнее наш запрос, то больше выгода.

Полный список функций приведён ниже. В основном они различаются типом возвращаемого результата.

— query($query,$param1,$param2, . ) — возвращает mysqli resource. аналог mysqli_query
— getOne($query,$param1,$param2, . ) — возвращает скаляр, первый элемент первой строки результата
— getRow($query,$param1,$param2, . ) — одномерный массив, первую строку результата
— getCol($query,$param1,$param2, . ) — одномерный массив скаляров — колонку таблицы.
— getAll($query,$param1,$param2, . ) — двумерный массив, индексированный числами по порядку
— getInd($key,$query,$par1,$par2, . ) — двумерный массив, индексированный значениями поля, указанного первым параметром
— getIndCol($key,$query,$par1,$par2, . ) — массив скаляров, индексированный полем из первого параметра. Незаменимо для составления словарей вида key => value

Как видно, имена функций напоминают таковые из PEAR::DB, но не во всём совпадают с ними.
В первую очередь, сокращено их количество, поскольку поддержка плейсхолдеров сделала многие искусственные функции (типа limitQuery() или INSERT) попросту ненужными, а синтаксис запросов — более естественным и в тоже время — гибким.

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

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

Источник

PHP MySQL Update Data

The UPDATE statement is used to update existing records in a table:

Notice the WHERE clause in the UPDATE syntax: The WHERE clause specifies which record or records that should be updated. If you omit the WHERE clause, all records will be updated!

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

Let’s look at the «MyGuests» table:

id firstname lastname email reg_date
1 John Doe john@example.com 2014-10-22 14:26:15
2 Mary Moe mary@example.com 2014-10-23 10:22:30

The following examples update the record with in 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 = «UPDATE MyGuests SET lastname=’Doe’ WHERE ($conn->query($sql) === TRUE) echo «Record updated successfully»;
> else echo «Error updating record: » . $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 = «UPDATE MyGuests SET lastname=’Doe’ WHERE (mysqli_query($conn, $sql)) echo «Record updated successfully»;
> else echo «Error updating record: » . 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 = «UPDATE MyGuests SET lastname=’Doe’ WHERE // Prepare statement
$stmt = $conn->prepare($sql);

// execute the query
$stmt->execute();

// echo a message to say the UPDATE succeeded
echo $stmt->rowCount() . » records UPDATED successfully»;
> catch(PDOException $e) echo $sql . «
» . $e->getMessage();
>

After the record is updated, the table will look like this:

id firstname lastname email reg_date
1 John Doe john@example.com 2014-10-22 14:26:15
2 Mary Doe mary@example.com 2014-10-23 10:22:30

Источник

Php class sql update

В MySQL для обновления применяется sql-команда UPDATE :

UPDATE Таблица SET столбец1 = значение1, столбец2 = значение2. WHERE столбец = значение

Для примера возьмем использованную в прошлых темах таблицу Users со следующим определением:

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

Объектно-ориентированный стиль

Сначала определим файл index.php , который будет выводить список пользователей с ссылками на их обновление:

     

Список пользователей

connect_error)< die("Ошибка: " . $conn->connect_error); > $sql = "SELECT * FROM Users"; if($result = $conn->query($sql))< echo ""; foreach($result as $row)< echo ""; echo ""; echo ""; echo ""; echo ""; > echo "
ИмяВозраст
" . $row["name"] . "" . $row["age"] . "Изменить
"; $result->free(); > else< echo "Ошибка: " . $conn->error; > $conn->close(); ?>

Здесь используется команда SELECT, которая получает всех пользователей из таблицы Users. В таблице третий столбец хранит ссылку на скрипт update.php, который мы далее создадим и которому передается параметр id с идентификатором пользователя, которого надо изменить.

Для обновления данных определим скрипт update.php :

connect_error)< die("Ошибка: " . $conn->connect_error); > ?>     real_escape_string($_GET["id"]); $sql = "SELECT * FROM Users WHERE "; if($result = $conn->query($sql))< if($result->num_rows > 0) < foreach($result as $row)< $username = $row["name"]; $userage = $row["age"]; >echo "

Обновление пользователя

Имя:

Возраст:

"; > else< echo "
Пользователь не найден
"; > $result->free(); > else< echo "Ошибка: " . $conn->error; > > elseif (isset($_POST["id"]) && isset($_POST["name"]) && isset($_POST["age"])) < $userid = $conn->real_escape_string($_POST["id"]); $username = $conn->real_escape_string($_POST["name"]); $userage = $conn->real_escape_string($_POST["age"]); $sql = "UPDATE Users SET name = '$username', age = '$userage' WHERE "; if($result = $conn->query($sql)) < header("Location: index.php"); >else< echo "Ошибка: " . $conn->error; > > else < echo "Некорректные данные"; >$conn->close(); ?>

Весь код обновления структурно делится на две части. В первой части мы обрабатываем запрос GET. Когда пользователь нажимает на ссылку «Обновить» на странице index.php , то отправляется запрос GET, в котором передается id редактируемого пользователя.

if($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["id"]))

И если это запрос GET, то нам надо вывести данные редактируемого пользователя в поля формы. Для этого получаем из базы данных объект по переданному id

$userid = $conn->real_escape_string($_GET["id"]); $sql = "SELECT * FROM Users WHERE "; if($result = $conn->query($sql))

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

Вторая часть скрипта представляет обработку POST-запроса - когда пользователь нажимает на кнопку на форме, то будет отправляться POST-запрос с отправленными данными. Мы получаем эти данные и отправляем базе данных команду UPDATE с этими данными, используя при этом параметризацию запроса:

$userid = $conn->real_escape_string($_POST["id"]); $username = $conn->real_escape_string($_POST["name"]); $userage = $conn->real_escape_string($_POST["age"]); $sql = "UPDATE Users SET name = '$username', age = '$userage' WHERE "; if($result = $conn->query($sql))

После выполнения запроса к БД перенаправляем пользователя на скрипт index.php с помощью функции

Таким образом, пользователь обращается к скрипту index.php , видит таблицу с данными и нажимает на ссылку "Обновить" в одной из строк.

Вывод данных из MySQL в PHP и pdo

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

Редактирование данных из MySQL в PHP и pdo

Данные в запросе POST отправляются этому же скрипту update.php , который сохраняет данные и перенаправляет пользователя обратно на index.php .

Изменение данных из MySQL в PHP и pdo

Процедурный стиль

     

Список пользователей

$sql = "SELECT * FROM Users"; if($result = mysqli_query($conn, $sql))< echo ""; foreach($result as $row)< echo ""; echo ""; echo ""; echo ""; echo ""; > echo "
ИмяВозраст
" . $row["name"] . "" . $row["age"] . "Изменить
"; mysqli_free_result($result); > else < echo "Ошибка: " . mysqli_error($conn); >mysqli_close($conn); ?>
 ?>      0) < foreach($result as $row)< $username = $row["name"]; $userage = $row["age"]; >echo "

Обновление пользователя

Имя:

Возраст:

"; > else< echo "
Пользователь не найден
"; > mysqli_free_result($result); > else < echo "Ошибка: " . mysqli_error($conn); >> elseif (isset($_POST["id"]) && isset($_POST["name"]) && isset($_POST["age"])) < $userid = mysqli_real_escape_string($conn, $_POST["id"]); $username = mysqli_real_escape_string($conn, $_POST["name"]); $userage = mysqli_real_escape_string($conn, $_POST["age"]); $sql = "UPDATE Users SET name = '$username', age = '$userage' WHERE "; if($result = mysqli_query($conn, $sql))< header("Location: index.php"); >else < echo "Ошибка: " . mysqli_error($conn); >> else < echo "Некорректные данные"; >mysqli_close($conn); ?>

Источник

Обновление данных в базе данных MySQL

В этом уроке вы узнаете, как обновлять записи в таблице базы данных MySQL с помощью запросов SQL.

Обновление данных БД

При обновлении данных в таблице можно либо обновить определенные строки, либо обновить все строки в таблице. Эти задачи решаются с помощью оператора SQL UPDATE в сочетании с ключевыми словами SET и WHERE .

Базовый синтаксис оператора UPDATE может быть задан следующим образом:

Давайте создадим SQL-запрос, используя оператор UPDATE и условие WHERE , передав его функции PHP mysqli_query() для обновления записей таблиц. Рассмотрим следующую таблицу persons в базе данных demo:

Выбор данных из таблиц базы данных MySQL

Код PHP в следующем примере обновит адрес электронной почты человека в таблице persons, идентификатор которого равен 1:

Пример

 $sql = "UPDATE persons SET email='peterparker_new@mail.com' WHERE (mysqli_query($conn, $sql)) < echo "Запись успешно обновлена"; >else < echo "Ошибка обновления записи: " . mysqli_error($conn); >mysqli_close($conn); ?>
 $sql = "UPDATE persons SET email='peterparker_new@mail.com' WHERE ($conn->query($sql) === TRUE) < echo "Запись успешно обновлена"; >else < echo "Ошибка обновления записи: " . $conn->error; > $conn->close(); ?>
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE persons SET email='peterparker_new@mail.com' WHERE // Подготовить заявление $stmt = $conn->prepare($sql); // выполнить запрос $stmt->execute(); // echo-сообщение, чтобы сказать, что ОБНОВЛЕНИЕ выполнено успешно echo $stmt->rowCount() . " записи ОБНОВЛЕНЫ успешно"; > catch(PDOException $e) < echo $sql . "
" . $e->getMessage(); > $conn = null; ?>

После обновления таблица лиц будет выглядеть так:

Выбор данных из таблиц базы данных MySQL

Примечание: Обратите внимание на условие WHERE в синтаксисе UPDATE: условие WHERE указывает, какую запись или записи следует обновить. Если вы опустите условие WHERE, все записи будут обновлены!

Источник

Оцените статью