1. Если речь идёт о проверке полей ДО отправки, то это делается с помощью JavaScript, PHP тут не при чём. Получить из JS доступ к содержимому полей формы можно, например, через форму. Например, присвоить форме название "my_form". HTML: <form name="my_form" method="post" action="script.php"> <input type="text" name="my_input" /> </form> Тогда доступ к содержимому инпута "my_input" может быть получен так: [js]document.my_form.my_input.value;[/js] Или можно добавить инпутам атрибут id и получать значения инпутов по id: HTML: <input type="text" name="my_input" id="inp_1" /> [js]document.getElementById('inp_1').value;[/js] Проверить длину текста можно, например, используя свойство length у value. Т.е.: [js]document.my_form.my_input.value.length;[/js] содержит в себе количество символов, введённых в инпут. Также в JS имеются регулярки (синтаксис аналогичен PHP-шным preg_*) для более сложных проверок. Любые проверки, реализованные на JavaScript должны быть продублированы на сервере (на PHP). JavaScript можно просто отключить, запрос к серверу можно подделать. 2. PHP: <?php $var = htmlspecialchars($var, ENT_QUOTES);
Насчет 2. Видимо не так сформулировал задачу. Вообщем переменная выводится в скрипт onclick, а там любой символ " или ' может испортить всю картину. Нужно перед добавлением в базу проверить эту переменную и заменить символы на подобные коды: &#_034; вернет знак " &#_039; вернет знак ' добавил _ для препятствия преобразования в знак Насчет 1. Не могли бы вы привести пример?
1. HTML: <html> <head> <title>Check form</title> <script type="text/javascript"> function checkForm() { if(!document.my_form.my_input.value.length) { alert('my_input is empty!'); return false; } else return true; } </script> </head> <body> <form name="my_form" method="get" action="script.php" onsubmit="javascript:return checkForm()"> <input type="text" name="my_input" /> <input type="submit" value="Send" /> </form> </body> </html> 2. Не стоит преобразовывать кавычки и прочие символы в HTML-сущности (&#... при добавлении в б.д., это нужно делать при выводе из б.д. в HTML. А в б.д. нужно хранить всё как пользователь ввёл. Это не является обязательным, конечно, но обычно делают так. А чтобы некоторые спец.символы не портили запрос - применяется PHP-функция mysql_real_escape_string(), которая экранирует эти спецсимволы: PHP: <?php // ... $var = isset($_GET['my_input']) ? $_GET['my_input'] : ''; if(!empty($var)) { $var = mysql_real_escape_string($var); $sql = "INSERT INTO `table` (`field`) VALUES ('{$var}')"; mysql_query($sql); } else echo('my_input is empty!'); ?> Ну а выводить на страницу HTML примерно так: PHP: <?php // ... $sql = "SELECT * FROM `table`"; $res = mysql_query($sql); if($res and mysql_num_rows($res) > 0) { while($row = mysql_fetch_assoc($res)) echo(htmlspecialchars($row['field'], ENT_QUOTES) . '<br />'); } ?>
Насчет первого... HTML: <html> <head> <title>Check form</title> <script type="text/javascript"> function checkForm() { if(!document.my_form.my_input.value.length) { alert('my_input is empty!'); return false; } else return true; } </script> </head> <body> <form name="my_form" method="get" action="script.php" onsubmit="javascript:return checkForm()"> <input type="text" name="my_input" /> <input type="submit" value="Send" /> </form> </body> </html> С одним полем все нормально работает. Но мне нужно проверить несколько полей. Попробовал продублировать условие переписав под каждое поле - не получилось, проверяется только первое. Попробовал сделать подобное: [js]if(!document.form.title.value.length & !document.form.description.value.length & !document.form.smalldescription.value.length) {[/js] Но в итоге скрипт вообще не исполняется. Подскажите пожалуйста, в чем проблема? Насчет 2го: PHP: <?php // ... $var = isset($_GET['my_input']) ? $_GET['my_input'] : ''; if(!empty($var)) { $var = mysql_real_escape_string($var); $sql = "INSERT INTO `table` (`field`) VALUES ('{$var}')"; mysql_query($sql); } else echo('my_input is empty!'); ?> Неизвестно почему, но у меня ответ идет всегда отрицательный. Скрипт: PHP: <? $var = isset($_GET['title']) ? $_GET['title'] : ''; // не совсем понял что это. if(!empty($var)) { $var = mysql_real_escape_string($var); $result = mysql_query("INSERT INTO news (title, smalldescription, description, author, date) VALUES ('$title', '$smalldescription', '$description', '$author', '$date')"); mysql_query($sql); } else echo('my_input is empty!'); ?> и PHP: <?php // ... $sql = "SELECT * FROM `table`"; $res = mysql_query($sql); if($res and mysql_num_rows($res) > 0) { while($row = mysql_fetch_assoc($res)) echo(htmlspecialchars($row['field'], ENT_QUOTES) . '<br />'); } ?> А в этом случае вообще не хочет выводить. Вставляю в html код, который обернут циклом вывода: PHP: <?echo (htmlspecialchars($news['description'], ENT_QUOTES));?> Сам цикл вывода: PHP: <?$new = mysql_query ("SELECT title, smalldescription, description, date, author FROM news ORDER BY id"); $news = mysql_fetch_array ($new); do{ // вывод... }while($news = mysql_fetch_array ($new));?>
Я там просто пример привёл. Тебе, естественно, нужно подставлять свои значения везде - названия таблиц и их полей в б.д., названия input-ов, названия элементов массива $_GET... Вот это: PHP: <?php $var = isset($_GET['title']) ? $_GET['title'] : ''; // не совсем понял что это. Аналогично вот этому: PHP: <?php if(isset($_GET['title'])) $var = $_GET['title']; else $var = ''; Только букв меньше. Тут: PHP: <?php $result = mysql_query("INSERT INTO news (title, smalldescription, description, author, date) VALUES ('$title', '$smalldescription', '$description', '$author', '$date')"); Не понятно, откуда взялись все эти переменные: $title, $smalldescription, $description, $author, $date...
Переменные присвоены чуть раньше PHP: <?$title = $_POST['title']; $smalldescription = $_POST['smalldescription']; $description = $_POST['description']; $author = $_POST['author']; $date = date("Y-d-m H:i:s");?> выводятся нормально.
1. HTML: <html> <head> <title>Check form</title> <script type="text/javascript"> var fields = new Array('title', 'smalldescription', 'description', 'author'); function checkForm() { var i = false; var errors = ''; for(i in fields) { if(!document.my_form[fields[i]].value.length) errors += 'Поле ' + fields[i] + " пустое\n"; } if(errors.length > 0) { alert(errors); return false; } else return true; } </script> </head> <body> <form name="my_form" method="post" action="script.php" onsubmit="javascript:return checkForm()"> title: <input type="text" name="title" /> <br /> smalldescription: <input type="text" name="smalldescription" /> <br /> description: <input type="text" name="description" /> <br /> author: <input type="text" name="author" /><br /> <input type="submit" value="Send" /> </form> </body> </html> На счёт второго - раз твоя форма передаётся методом POST - то и получать нужно из $_POST. Я же там просто для примера написал $_GET, можно было бы и догадаться. Можешь так сделать: PHP: <?php // ... $title = isset($_POST['title']) ? $_POST['title'] : ''; $smalldescription = isset($_POST['smalldescription']) ? $_POST['smalldescription'] : ''; $description = isset($_POST['description']) ? $_POST['description'] : ''; $author = isset($_POST['author']) ? $_POST['author'] : ''; $errors = array(); if(empty($title)) $errors[] = 'Поле title пустое'; if(empty($smalldescription)) $errors[] = 'Поле smalldescription пустое'; if(empty($description)) $errors[] = 'Поле description пустое'; if(empty($author)) $errors[] = 'Поле author пустое'; if(count($errors) > 0) echo(implode('<br />', $errors)); else { $title = mysql_real_escape_string($title); $smalldescription = mysql_real_escape_string($smalldescription); $description = mysql_real_escape_string($description); $author = mysql_real_escape_string($author); // У тебя там ещё какая-то переменная $date. Если столбец date в б.д. // имеет тип DATE или DATETIME или TIMESTAMP, то можно такой запрос: $sql = "INSERT INTO `news` (`title`, `smalldescription`, `description`, `author`, `date`) VALUES ('$title', '$smalldescription', '$description', '$author', NOW())"; mysql_query($sql); } ?> Почему не выводится ничего - не знаю. Смотри, какой запрос генерируется, смотри, нет ли ошибки, смотри, сколько строк вернул запрос и т.п. Не хочется описывать в миллионный раз, как это делается, тем более, что всё уже описано. Вот, почитай: http://www.phpfaq.ru/debug
PHP: <?php // ... $title = isset($_POST['title']) ? $_POST['title'] : ''; $smalldescription = isset($_POST['smalldescription']) ? $_POST['smalldescription'] : ''; $description = isset($_POST['description']) ? $_POST['description'] : ''; $author = isset($_POST['author']) ? $_POST['author'] : ''; $errors = array(); if(empty($title)) $errors[] = 'Поле title пустое'; if(empty($smalldescription)) $errors[] = 'Поле smalldescription пустое'; if(empty($description)) $errors[] = 'Поле description пустое'; if(empty($author)) $errors[] = 'Поле author пустое'; if(count($errors) > 0) echo(implode('<br />', $errors)); else { $title = mysql_real_escape_string($title); $smalldescription = mysql_real_escape_string($smalldescription); $description = mysql_real_escape_string($description); $author = mysql_real_escape_string($author); // У тебя там ещё какая-то переменная $date. Если столбец date в б.д. // имеет тип DATE или DATETIME или TIMESTAMP, то можно такой запрос: $sql = "INSERT INTO `news` (`title`, `smalldescription`, `description`, `author`, `date`) VALUES ('$title', '$smalldescription', '$description', '$author', NOW())"; mysql_query($sql); } ?> Спасибо, теперь всё работает. С датой тоже учел. Так намного лучше HTML: <html> <head> <title>Check form</title> <script type="text/javascript"> var fields = new Array('title', 'smalldescription', 'description', 'author'); function checkForm() { var i = false; var errors = ''; for(i in fields) { if(!document.my_form[fields[i]].value.length) errors += 'Поле ' + fields[i] + " пустое\n"; } if(errors.length > 0) { alert(errors); return false; } else return true; } </script> </head> <body> <form name="my_form" method="post" action="script.php" onsubmit="javascript:return checkForm()"> title: <input type="text" name="title" /> <br /> smalldescription: <input type="text" name="smalldescription" /> <br /> description: <input type="text" name="description" /> <br /> author: <input type="text" name="author" /><br /> <input type="submit" value="Send" /> </form> </body> </html> Тоже прекрасно работает. Благодарю за помощь Насчет вывода, чудесным образом всё заработало
Чуть переделал: HTML: <script type="text/javascript"> var fields = new Array('title', 'smalldescription', 'description'); var fnames = new Array('заголовка', 'короткого описания', 'описания'); function checkForm() { var i = false; var errors = ''; for(i in fields) { if(!document.form[fields[i]].value.length) errors += 'Ошибка! Поле ' + fnames[i] + " не заполнено.\n"; } if(errors.length > 0) { alert(errors); return false; } else return true; } </script> Заметил очень маленькую ошибку. Если заполнено поле title и smalldescription, то при выводе видим: [sql]Ошибка! Поле описания не заполнен...[/sql] точнее эта ошибка возникает если заполнено 2 поля(любые) а 3 не заполнено. когда заполнено одно(или ноль), а остальные пусты в конце сообщения об ошибке видим какой-то квадратик...
[js] function valid() { var login=$('#login input[name="login"]').val(); if(login=='') { alert('Не заполнено'); }else{document.forms['login'].submit();} } [/js] HTML: <form name=""<-теперь не валидно используем -> id="login"> <input type="text" name="login" /> если xhtml ставим "с пробелом />" Можно так: <input type="submit" onclick="valid();return false" value="Войти" /> Или так: <a href="/" onclick="valid();return false" class="link">Войти</a> </form>
Вообще - то, весь сайт должен работать корректно, не ради мелочи. Чтобы не было много разного и куски кода, копии.
Подымаю тему т.к. проблема обнаружила себя вновь... В скрипт вывожу поле таким образом: Код (Text): <?echo (htmlspecialchars($news['description'], ENT_QUOTES));?> Содержимое поля: Код (Text): Обычные скобки ' ' ' и двойные скобки " " " Двойные скобки выводятся как " (так и должно быть, всё ок) А вот одинарные скобки проходят мимо фильтра. В чем может быть проблема?
Если пишешь , то должен преобразовывать также и одинарные кавычки. Убедись, что там действительно это есть. У меня экранируются одинарные кавычки так.
Ты, наверно, просматриваешь через FireBug или Opera DragonFly. Там, действительно, всякие ' преобразуются в соответствующие символы, видимо. Открой именно "Исходный код" и посмотри, что там (Ctrl + U). Тем не менее, JavaScript не срабатывает, не смотря на то, что там в исходном коде действительно ' ... Используй тогда Код (PHP): <?php echo(str_replace(array('"', '\''), array('"', '\\\''), $str)); ?>