Есть скрипт, редактирующий запись в бд. Извлекает он запись нормально, а при сохранении экранирует каждую кавычку слэшами. Как это исправить? PHP: <?php error_reporting(E_ALL); mysql_connect('------', '------', '------') or die('Ошибка соединения с БД') ; mysql_select_db('------') or die('Ошибка при выборе БД') ; // Получаем и валидируем требуемое действие $action = (isset($_POST['action']) && in_array($action, array('save', 'get' ))) ? $_POST['action'] : ''; // Инициализируем все используемые переменные для защиты от атак через // register_globals $message = $text = $id = ''; switch ($action) { case 'get': // извлечение новости $id = intval($_POST['id']); // в очередной раз обращаю внимание // на приведение к целому для защиты от инъекции $result = mysql_query('SELECT `news_text` FROM `news` WHERE `id` = '.$id); if (mysql_num_rows($result) > 0) // если новость извлеклась { $text = reset(mysql_fetch_row($result)); } else { $message = 'Новость не найдена!'; $action = ''; // сбрасываем действие, чтобы в форме показалась кнопка "извлечь" } mysql_free_result($result); break; case 'save': // сохранение новости $id = intval($_POST['id']); $text = $_POST['text']; if (false === mysql_query(' UPDATE `news` SET `news_text` = \''.mysql_real_escape_string($text).'\' WHERE `id` = '.$id.' ') ) { $message = 'Не удалось сохранить новость!'; } else { $message = 'Новость успешно сохранена!'; $text = ''; // чтобы текст не вывелся снова } break; } if ($message != '') { echo "<b>$message</b><br><br>"; } ?> <form method="POST" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"> ID новости:<br> <input <?php echo $action != 'get' ? 'type="text" size="60"' : 'type="hidden"'; ?> name="id" value="<?php echo $id; ?>"><br> <?php if (!empty($text)) { ?> Текст новости:<br> <textarea name="text" cols="60" rows="8"><?php echo htmlspecialchars($text); ?></textarea><br> <?php } ?> <button type="submit" name="action" value="<?php echo $action == 'get' ? 'save' : 'get'; ?>"><?php echo $action == 'get' ? 'Сохранить' : 'Извлечь'; ?> новость</button> </form>
Хотя не, наверное GPC обработаются еще до выполнения этой операции. Тогда так PHP: <? if (get_magic_quotes_gpc()) { $_POST = stripslashes_array($_POST); } PHP: <? function stripslashes_array($array) { foreach ($array as &$value) { if (is_array($value)) { $value = stripslashes_array($value); } else { $value = stripslashes($value); } } return $array; }
Там написано "добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются. Соответственно, распространенной ошибкой является применение stripslashes при получении данных из базы." Так какого они у меня при выводе появляются, раз они не заносятся? Ведь вроде все правильно в скрипте сделано.
Да потому что с логикой проблемы, с формальной логикой. Двойное слеширование, ДВОЙНОЕ. Экранирование данных функцией mysql_real_escape_string и неявный вызов addshashes.