#php #html #forms #phpmyadmin
#php #HTML #формы #phpmyadmin
Вопрос:
Хорошо, итак, вот моя проблема (которую я погуглил и не помог):
У меня есть форма, в которой есть элемент textarea, и в ней я хочу написать что-то вроде:
<table><tr><td>123</td></tr></table>
и нажмите отправить, и я хочу, чтобы оно было сохранено в базе данных.
Теперь мой код работает, если я ввожу НЕHTML-символы, но если я ввожу, как указано выше, я получаю:
Forbidden
You don't have permission to access /xxx/sample_posteddata.php on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Я предполагаю, что каким-то образом на моем хостинге установлена некоторая защита, чтобы запретить это?
Я попытался вставить точный текст из интерфейса администратора php, и это работает нормально 😕
РЕДАКТИРОВАТЬ: полный исходный код файла podaciEdit.php:
<?
require_once("_dal/CredentialsManager.php");
require_once("_dal/ProizvodRepository.php");
$repos = new ProizvodRepository();
if ( isset( $_POST["spremi"] ) ){
$sifra = $_POST["sifra"];
$naziv = $_POST["naziv"];
$slika = $_POST["slika"];
$podaci_full = htmlspecialchars($_POST["podaci_full"]);
$podaci_min = $_POST["podaci_min"];
$kategorija = $_POST["kategorija"];
$kategorija_naziv = $_POST["kategorija_naziv"];
if ($repos->updateProizvod ($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv))
echo "Podaci uspješno spremljeni!";
else{
echo "Greška prilikom spremanja podataka!";
}
echo '<br/>Kliknite <a href="proizvodiEdit.php">ovdje</a> za povratak.';
}
else if ( isset( $_GET["sifra"] ) ){
$sifra = $_GET["sifra"];
$proizvod = $repos->GetProizvod($sifra);
if ($proizvod){
$sifra = $proizvod["sifra"];
$naziv = $proizvod["naziv"];
$slika = $proizvod["slika"];
$podaci_full = $proizvod["podaci_full"];
$podaci_min = $proizvod["podaci_min"];
$kategorija = $proizvod["kategorija"];
$kategorija_naziv = $proizvod["kategorija_naziv"];
//$data = htmlentities($podaci_full, ENT_QUOTES, "UTF-8");
echo <<<qq
<form id="proizvodEdit" method="POST" action="proizvodEdit.php">
Podaci - tablica: (mozes resizeati po potrebi!)<br/>
<textarea class="podaci_full" id="podaci_full" name="podaci_full">{$podaci_full}</textarea>
<input type="submit" value="Spremi sve" name="spremi"/>
</form>
qq;
}
else
echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';
}
else{
echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';
}
Комментарии:
1. Без кода мы можем только догадываться.
2. вы пытаетесь использовать междоменную публикацию? используйте strip_tags() php.net/manual/en/function.strip-tags.php
3. @Rob W: пожалуйста, посмотрите, я c / ped весь php-код
Ответ №1:
Если вы являетесь владельцем веб-сайта, который вы можете использовать htmlspecialchars()
, сохраните выходные данные в базе данных. Если вы хотите прочитать его обратно и преобразовать в html, используйте htmlspecialchars_decode()
для более точного ответа вам следует опубликовать код, который вы используете для сохранения данных в базе данных.
Комментарии:
1. как вы можете видеть, я использую htmlspecialchars(), но безрезультатно:(
2. @Nikola Выполняет ли этот метод
updateProizvod()
какую-либо дальнейшую обработку данных?3. публичная функция updateProizvod($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv){ if ($this->openConnection()){ $sql = «ОБНОВИТЬ набор продуктов sifra=’$sifra’, naziv=’$naziv’, slika=’$slika’, podaci_full=’$podaci_full’, podaci_min=’$podaci_min’, kategorija=’$kategorija’, kategorija_naziv=’$kategorija_naziv’ ГДЕ sifra='». $sifra . «‘»; echo $ sifra; $result = mysql_query ($sql); если (mysql_affected_rows() == 1) возвращает true; else возвращает false; } else{ возвращает false; } }
4. @Nikola Вы неправильно экранируете свои данные (чтобы предотвратить использование SQL-инъекций
mysql_real_escape_string()
для параметров перед использованием вupdate
запросе).5. да, я знаю это и благодарю вас, но это не приводит к ошибке, я получаю сообщение об ошибке, даже если я закомментирую всю часть сохранения базы данных
Ответ №2:
Я предполагаю, что вы изначально получили 403. Это проблема, связанная с правами доступа к файлам, сообщение об ошибке apache, а не php. Попробуйте перейти непосредственно к www.yourdomain.com//xxx/sample_posteddata.php и посмотрите, можете ли вы получить доступ к этому файлу. Может быть, даже попробуйте ПОЛУЧИТЬ параметр.
www.yourdomain.com//xxx/sample_posteddata.php?sifra=xxx
Вы должны иметь к нему доступ. Если нет, попробуйте
chmod x /home/domain/public_html
404 — это код ошибки для НЕ НАЙДЕНО. Это означает, что ваша форма неправильно указывает на ваш php-файл или происходит сбой одного из включений. Проверьте свои пути.
Комментарии:
1. код работает отлично, если я ввожу обычный текст (без тегов HTML) в текстовую область и нажимаю Отправить. Он также отлично сохраняется в БД.
Ответ №3:
Поскольку ваш HTML содержит ключевое слово «table», я бы предпочел предположить, что это, вероятно, проблема, связанная с mod_security или каким-либо другим инструментом безопасности, который фильтрует ключевые слова SQL, чтобы помочь предотвратить SQL-инъекции. Попробуйте добавить в свой .htaccess
:
SecFilterEngine Off
Если это работает таким образом, это, вероятно, связано с mod_security. Обратите внимание, что вы, возможно, не сможете отключить его из своего .htaccess
файла.
Ответ №4:
На самом деле, проблема заключалась в том, что функция stripslashes помогла решить проблему.
$podaci_full = stripslashes($_POST["podaci_full"]);