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

Задача была написать более или менее универсальный и очевидный способ приема данных пришедших из 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);
}
?>

Поделиться статьей:  

Поделитесь своим мнением

Правила сообщений

Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Копирование материалов разрешено только с указанием источника и прямой индексируемой ссылкой на оригинал.
Яндекс.Метрика
© 2018 Хороший отзыв · Искусство выбирать · Лично · Разумно · Честно