Обновление данных в базе данных MariaDB или MySQL на PHP 7
3 апреля 2018
Андрей Курпас
Задача была написать более или менее универсальный и очевидный способ приема данных пришедших из html-формы методом POST или GET и обновления их в базе данных. В моем случае использовались MariaDB и PHP 7.2.
Некоторые особенности программы: если параметр не пришел, то в соответствующее ему поле БД запишется значение по умолчанию для этого поля; если текстовое поле в БД имеет ограничение по длине, то, скрипт перед записью обрежет пришедшие данные до этой длины. Дальнейшие комментарии написаны в коде.
Сам скрипт:
<?php
// ниже внесем в массив все имена элементов html, которые могут прийти для записи в БД (работает с методами $_POST, $_GET и $_COOKIE)
// формат массива данных:
// 0 - name элемента в html
// 1 - имя поля в БД
// 2 - тип даных в БД (char int text bool)
// 3 - значение по умолчанию для поля в БД
// 4 - длина текстового (char) поля в БД (необязателный параметр)
$tbl = 'tbl'; // имя таблицы БД для обновления
$arr[] = array('sid', 'id', 'int', 0); // id строки для обновления - всегда первый элемент массива, значение по умолчанию всегда равно 0
$arr[] = array('tx', 'name', 'char', '', 128); // текст
$arr[] = array('chk', 'flag', 'bool', '0'); // чекбокс
$arr[] = array('sel', 'age', 'int', 'NULL'); // число
$arr[] = array('tar', 'opis', 'text', 'NULL'); // многострочный текст
setlocale(LC_ALL, "ru_RU.UTF-8"); // устанавливает русскую кодировку строковых функций
require_once 'upd.php'; // подключить файл обработки данных
require_once 'dbpass.php'; // подключить файл паролей
$mysqli = mysqli_connect($host,$user,$pass,$db);
if ($mysqli->connect_errno) {printf("Connect failed: %s\n", $mysqli->connect_error); exit();}
list($st, $sid) = upd_str($arr, $tbl); // 1 - масив данных, 2 - таблица в БД
if (strlen($st) > 0 ) { // если есть, что обновлять
$result = $mysqli->query($st); if (!$result) {printf("Errormessage: %s\n", $mysqli->error);}
echo '<h3>Изменения в строку №' . $sid . ' внесены успешно!</h3>';
}
mysqli_close($mysqli); // закрыть соединение с БД
?>
Файл upd.php с обработкой данных:
<?php
function gotov_sql($st,$dl,$rep) { // подготавливает текстовую строку для записи в БД
if ($st <> '') {
global $mysqli;
$st = trim($st);
$st = stripslashes($st); // удалим экранирование, которое делает метод post
if ($dl > 0) {$st = mb_substr($st, 0, $dl, 'UTF-8');} // обрежем строку до $dl символов
if ($rep==1) {$st = str_replace('\r\n', '
', $st);} // замена переносов строки для многострочных полей ввода
$st = mysqli_escape_string($mysqli, $st); // экранируем спецсимволы в строке для записи в БД
}
return $st;
}
function upd_str($arr, $tbl) { // возвращает строку SQL для обновления
$cn = count($arr); // длина массива
$sh = 0; $nk = ''; $sid = 0; // переменные
for ($i = 0; $i < $cn; $i++) { // перебираем массив полей
$nm1 = $arr[$i][0]; // name элемента в html
$nm2 = $arr[$i][1]; // имя поля в БД
$tip2 = $arr[$i][2]; // тип даных в БД
$zpu = $arr[$i][3]; // значение по умолчанию для поля в БД
if (isset($_REQUEST[$nm1])) {$per = $_REQUEST[$nm1];} else {$per = $zpu;} // примем входящий параметр
// подготовим значение параметра для записи в БД
if ($tip2 == 'char') {
if ($per <> $zpu) {$per = gotov_sql($per, $arr[$i][4], 0);}
if ($per == '') {$per = $zpu;}
} elseif ($tip2 == 'text') {
if ($per <> $zpu) {$per = gotov_sql($per, 0, 1);}
if ($per == '') {$per = $zpu;}
} elseif ($tip2 == 'int') {
if ($per <> $zpu) {$per = (int)$per;}
if ($per == 0) {$per = $zpu;}
} elseif ($tip2 == 'bool') {
if ($per === 'on') {$per = "1";}
}
if ($i == 0 && $per == 0) {break;}
// расставим кавычки для записи в БД в зависимости от типа данных
if (($tip2 == 'char' || $tip2 == 'text' || $tip2 == 'bool') && $per <> 'NULL') {$kbd = $nm2 . "='" . $per . "'";}
elseif ($tip2 == 'int' || $per == 'NULL') {$kbd = $nm2 . "=" . $per;}
if ($i == 0) {$wr = $kbd; $sid = $per;}
else {
if ($i > 1) {$rzd = ', ';} else {$rzd = '';} // зададим строчный разделитель
$nk = $nk . $rzd . $kbd; // накопим директивы обновления полей
}
}
$ret = '';
if (strlen($nk) > 0) {$ret = "UPDATE " . $tbl . " SET " . $nk . " WHERE " . $wr . ";";} // сформируем итоговую строку
return array($ret, $sid);
}
?>
Поделиться статьей: