Показать сообщение отдельно
  #4 (permalink)  
Старый 07.06.2020, 23:13
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Безнадежный программист
Должна работать именно с денвером.
Почему? Вы, конечно, можете оставаться и в нем, но со времени "панихиды по Денверу" веб технологии шагнули далеко вперед, и вы неизбежно с ними столкнетесь. А Open Server, это такой же локальный сервер как и Денвер, так же не требующий инсталляции, также с возможностью его запуска с переносимых носителей, но имеющий гораздо большие встроенные возможности. Вам рано или поздно придется использовать "готовые инструменты", устанавливают которые обычно с помощью composer. В Open Server он уже установлен и сам сервер обладает хорошей оболочкой командной строки.

Сообщение от Безнадежный программист
Тоже посмотрю, хорошо.
Что? Здесь просто нужно прочесть внимательно еще раз об этих функциях и подумать. База данных может хранить в себе любые "режущие и колющие предметы", а вот когда их "показывают пользователю", пропускают через htmlspecialchars, чтобы как раз "не уколоть" пользователя. Функции htmlspecialchars/htmlentities никак не могут спасти базу от sql-инъекции, а вот доставить хлопот, этого будет хоть отбавляй. Представьте, что вы записали в базу "a < b = ...". Как будут в ней хранится эти данные, если вы их пропустите через htmlspecialchars/htmlentities? Вы даете пользователю возможность искать данные в базе (любыми способами, включая и полнотекстовый поиск). Сможет ли пользователь найти в базе "a < b"?

Здесь дамп тестовой таблицы, можете ее импортировать, запустить этот код и все будет работать. Создавая в РМА таблицу, нужно правильно задать и кодировку сравнения, почитать тут. У вас просто путаница. Стоит только заметить, проверки входных данных нет, это просто легкий пример. На самом же деле вы обязаны их проверять, для этого в РНР есть фильтры.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h4>Структура таблицы Сотрудники</h4>
<pre>--
-- Структура таблицы `employees`
--

CREATE TABLE `employees` (
  `id` int(11) NOT NULL COMMENT 'Идентификатор',
  `surname` varchar(32) NOT NULL COMMENT 'Фамилия',
  `name` varchar(12) NOT NULL COMMENT 'Имя',
  `post` varchar(24) NOT NULL COMMENT 'Должность'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Сотрудники';

--
-- Индексы таблицы `employees`
--
ALTER TABLE `employees`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для таблицы `employees`
--
ALTER TABLE `employees`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор';
COMMIT;</pre>

<h4>Содержание таблицы Сотрудники</h4>

<?
$db = new mysqli('localhost', 'root', '', 'test');
$db->set_charset("utf8");

if($_POST) {
    
    if(isset($_POST['add'])) {
        if($q = $db->prepare("INSERT INTO `employees` (`surname`, `name`, `post`) VALUES (?, ?, ?)")) {
            $q->bind_param("sss", $_POST['surname'], $_POST['name'], $_POST['post']);
            $q->execute();
        }
    }
    
    if(isset($_POST['del']) && $id = (int)$_POST['del']) $db->query("DELETE FROM `employees` WHERE id=$id");
        
}

if($q = $db->query("SELECT * FROM `employees`")) {
    if($q->num_rows) {
?>
<form method="post">
    <table>
        <tr><th>Фамилия</th><th>Имя</th><th>Должность</th><th>Удаление</th></tr>
<?
    while($row = $q->fetch_row()) echo '<tr><td>' . implode('</td><td>',array_map('htmlspecialchars', array_slice($row, 1))) . 
        "</td><td><button type=\"submit\" name=\"del\" value=\"$row[0]\">Удалить</button></td></tr>";
?>
    </table>
</form>
<?        
    } else echo '<p>Таблица Сотрудники не имеет записей</p>';
?>
<h4>Добавление сотрудников</h4>
<form method="post">
    <input name="surname" required="" pattern="[а-яёА-ЯЁ-]{5,32}" placeholder="Фамилия" />
    <input name="name" required="" pattern="[а-яёА-ЯЁ]{4,12}" placeholder="Имя" />
    <input name="post" required="" pattern="[а-яёА-ЯЁ]{5,24}" placeholder="Должность" />
    <button name="add">Добавить</button>
</form>    
<?        
} else echo 'xxxx';
$db->close();
?>


PS. В структуре вашего кода есть один "очень неприятный сюрприз". Я в примере тоже таковой "оставил сознательно". Большой плюс для вас будет, если вы поймете о каком "сюрпризе" речь. Подсказка - поставить себя на место пользователя, вспомнить о своих возможных действиях на странице.

Последний раз редактировалось laimas, 08.06.2020 в 02:47.
Ответить с цитированием