За последние 24 часа нас посетили 193444 программиста и 2147 роботов. Сейчас ищут 2213 программистов ...

Проверка полей

Тема в разделе "PHP для новичков", создана пользователем klon5555, 8 янв 2012.

  1. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Вопрос 1:
    Вопрос 2:
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    1. Если речь идёт о проверке полей ДО отправки, то это делается с помощью JavaScript, PHP тут не при чём. Получить из JS доступ к содержимому полей формы можно, например, через форму. Например, присвоить форме название "my_form".

    HTML:
    1. <form name="my_form" method="post" action="script.php">
    2. <input type="text" name="my_input" />
    3. </form>
    Тогда доступ к содержимому инпута "my_input" может быть получен так:

    [js]document.my_form.my_input.value;[/js]

    Или можно добавить инпутам атрибут id и получать значения инпутов по id:

    HTML:
    1. <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:
    1. <?php
    2. $var = htmlspecialchars($var, ENT_QUOTES);
     
  3. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Насчет 2.
    Видимо не так сформулировал задачу. Вообщем переменная выводится в скрипт onclick, а там любой символ " или ' может испортить всю картину.

    Нужно перед добавлением в базу проверить эту переменную и заменить символы на подобные коды:
    &#_034; вернет знак "
    &#_039; вернет знак '
    добавил _ для препятствия преобразования в знак

    Насчет 1.
    Не могли бы вы привести пример?
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    1.
    HTML:
    1.     <head>
    2.         <title>Check form</title>
    3.         <script type="text/javascript">
    4.             function checkForm() {
    5.                 if(!document.my_form.my_input.value.length) {
    6.                     alert('my_input is empty!');
    7.                     return false;
    8.                 } else
    9.                     return true;
    10.             }
    11.         </script>
    12.     </head>
    13.     <body>
    14.         <form name="my_form" method="get" action="script.php" onsubmit="javascript:return checkForm()">
    15.             <input type="text" name="my_input" />
    16.             <input type="submit" value="Send" />
    17.         </form>
    18.     </body>
    19. </html>
    2.
    Не стоит преобразовывать кавычки и прочие символы в HTML-сущности (&#...;) при добавлении в б.д., это нужно делать при выводе из б.д. в HTML. А в б.д. нужно хранить всё как пользователь ввёл. Это не является обязательным, конечно, но обычно делают так. А чтобы некоторые спец.символы не портили запрос - применяется PHP-функция mysql_real_escape_string(), которая экранирует эти спецсимволы:

    PHP:
    1. <?php
    2. // ...
    3. $var = isset($_GET['my_input']) ? $_GET['my_input'] : '';
    4. if(!empty($var)) {
    5.     $var = mysql_real_escape_string($var);
    6.     $sql = "INSERT INTO `table` (`field`) VALUES ('{$var}')";
    7.     mysql_query($sql);
    8. } else
    9.     echo('my_input is empty!');
    10. ?>
    Ну а выводить на страницу HTML примерно так:

    PHP:
    1. <?php
    2. // ...
    3. $sql = "SELECT * FROM `table`";
    4. $res = mysql_query($sql);
    5. if($res and mysql_num_rows($res) > 0) {
    6.     while($row = mysql_fetch_assoc($res))
    7.         echo(htmlspecialchars($row['field'], ENT_QUOTES) . '<br />');
    8. }
    9. ?>
     
  5. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Насчет первого...
    HTML:
    1.      <head>
    2.          <title>Check form</title>
    3.          <script type="text/javascript">
    4.              function checkForm() {
    5.                  if(!document.my_form.my_input.value.length) {
    6.                      alert('my_input is empty!');
    7.                      return false;
    8.                  } else
    9.                      return true;
    10.              }
    11.          </script>
    12.      </head>
    13.      <body>
    14.          <form name="my_form" method="get" action="script.php" onsubmit="javascript:return checkForm()">
    15.              <input type="text" name="my_input" />
    16.              <input type="submit" value="Send" />
    17.          </form>
    18.      </body>
    19.  </html>
    С одним полем все нормально работает. Но мне нужно проверить несколько полей.
    Попробовал продублировать условие переписав под каждое поле - не получилось, проверяется только первое.
    Попробовал сделать подобное:
    [js]if(!document.form.title.value.length & !document.form.description.value.length & !document.form.smalldescription.value.length) {[/js]
    Но в итоге скрипт вообще не исполняется. Подскажите пожалуйста, в чем проблема?

    Насчет 2го:
    PHP:
    1. <?php
    2.  // ...
    3.  $var = isset($_GET['my_input']) ? $_GET['my_input'] : '';
    4.  if(!empty($var)) {
    5.      $var = mysql_real_escape_string($var);
    6.      $sql = "INSERT INTO `table` (`field`) VALUES ('{$var}')";
    7.      mysql_query($sql);
    8.  } else
    9.      echo('my_input is empty!');
    10.  ?>
    Неизвестно почему, но у меня ответ идет всегда отрицательный.
    Скрипт:
    PHP:
    1.  
    2. <?
    3.  $var = isset($_GET['title']) ? $_GET['title'] : ''; // не совсем понял что это.
    4.  if(!empty($var)) {
    5.      $var = mysql_real_escape_string($var);
    6. $result = mysql_query("INSERT INTO news (title, smalldescription, description, author, date) VALUES ('$title', '$smalldescription', '$description', '$author', '$date')");
    7.      mysql_query($sql);
    8.  } else
    9.      echo('my_input is empty!');
    10.  ?>
    и
    PHP:
    1.  <?php
    2.  // ...
    3.  $sql = "SELECT * FROM `table`";
    4.  $res = mysql_query($sql);
    5.  if($res and mysql_num_rows($res) > 0) {
    6.      while($row = mysql_fetch_assoc($res))
    7.          echo(htmlspecialchars($row['field'], ENT_QUOTES) . '<br />');
    8.  }
    9.  ?>
    А в этом случае вообще не хочет выводить.
    Вставляю в html код, который обернут циклом вывода:
    PHP:
    1. <?echo (htmlspecialchars($news['description'], ENT_QUOTES));?>
    Сам цикл вывода:
    PHP:
    1.  
    2.             <?$new = mysql_query ("SELECT title, smalldescription, description, date, author FROM news ORDER BY id");
    3.             $news = mysql_fetch_array ($new);
    4.             do{
    5.                        //  вывод...
    6.                         }while($news = mysql_fetch_array ($new));?>
    7.  
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я там просто пример привёл. Тебе, естественно, нужно подставлять свои значения везде - названия таблиц и их полей в б.д., названия input-ов, названия элементов массива $_GET...

    Вот это:
    PHP:
    1. <?php
    2. $var = isset($_GET['title']) ? $_GET['title'] : ''; // не совсем понял что это.
    Аналогично вот этому:
    PHP:
    1. <?php
    2. if(isset($_GET['title']))
    3.     $var = $_GET['title'];
    4. else
    5.     $var = '';
    Только букв меньше.

    Тут:
    PHP:
    1. <?php
    2. $result = mysql_query("INSERT INTO news (title, smalldescription, description, author, date) VALUES ('$title', '$smalldescription', '$description', '$author', '$date')");
    Не понятно, откуда взялись все эти переменные:
    $title, $smalldescription, $description, $author, $date...
     
  7. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Переменные присвоены чуть раньше
    PHP:
    1. <?$title = $_POST['title'];
    2. $smalldescription = $_POST['smalldescription'];
    3. $description = $_POST['description'];
    4. $author = $_POST['author'];
    5. $date = date("Y-d-m H:i:s");?>
    выводятся нормально.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    1.
    HTML:
    1.     <head>
    2.         <title>Check form</title>
    3.         <script type="text/javascript">
    4.             var fields = new Array('title', 'smalldescription', 'description', 'author');
    5.             function checkForm() {
    6.                 var i = false;
    7.                 var errors = '';
    8.                 for(i in fields) {
    9.                     if(!document.my_form[fields[i]].value.length)
    10.                         errors += 'Поле ' + fields[i] + " пустое\n";
    11.                 }
    12.                 if(errors.length > 0) {
    13.                     alert(errors);
    14.                     return false;
    15.                 } else
    16.                     return true;
    17.             }
    18.         </script>
    19.     </head>
    20.     <body>
    21.         <form name="my_form" method="post" action="script.php" onsubmit="javascript:return checkForm()">
    22.             title: <input type="text" name="title" /> <br />
    23.             smalldescription: <input type="text" name="smalldescription" /> <br />
    24.             description: <input type="text" name="description" /> <br />
    25.             author: <input type="text" name="author" /><br />
    26.             <input type="submit" value="Send" />
    27.         </form>
    28.     </body>
    29. </html>
    На счёт второго - раз твоя форма передаётся методом POST - то и получать нужно из $_POST. Я же там просто для примера написал $_GET, можно было бы и догадаться. Можешь так сделать:

    PHP:
    1. <?php
    2. // ...
    3. $title = isset($_POST['title']) ? $_POST['title'] : '';
    4. $smalldescription = isset($_POST['smalldescription']) ? $_POST['smalldescription'] : '';
    5. $description = isset($_POST['description']) ? $_POST['description'] : '';
    6. $author = isset($_POST['author']) ? $_POST['author'] : '';
    7. $errors = array();
    8. if(empty($title))
    9.     $errors[] = 'Поле title пустое';
    10. if(empty($smalldescription))
    11.     $errors[] = 'Поле smalldescription пустое';
    12. if(empty($description))
    13.     $errors[] = 'Поле description пустое';
    14. if(empty($author))
    15.     $errors[] = 'Поле author пустое';
    16. if(count($errors) > 0)
    17.     echo(implode('<br />', $errors));
    18. else {
    19.     $title = mysql_real_escape_string($title);
    20.     $smalldescription = mysql_real_escape_string($smalldescription);
    21.     $description = mysql_real_escape_string($description);
    22.     $author = mysql_real_escape_string($author);
    23.     // У тебя там ещё какая-то переменная $date. Если столбец date в б.д.
    24.     // имеет тип DATE или DATETIME или TIMESTAMP, то можно такой запрос:
    25.     $sql = "INSERT INTO `news` (`title`, `smalldescription`, `description`, `author`, `date`) VALUES ('$title', '$smalldescription', '$description', '$author', NOW())";
    26.     mysql_query($sql);
    27. }
    28. ?>
    Почему не выводится ничего - не знаю. Смотри, какой запрос генерируется, смотри, нет ли ошибки, смотри, сколько строк вернул запрос и т.п. Не хочется описывать в миллионный раз, как это делается, тем более, что всё уже описано. Вот, почитай: http://www.phpfaq.ru/debug
     
  9. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    PHP:
    1. <?php
    2.  // ...
    3.  $title = isset($_POST['title']) ? $_POST['title'] : '';
    4.  $smalldescription = isset($_POST['smalldescription']) ? $_POST['smalldescription'] : '';
    5.  $description = isset($_POST['description']) ? $_POST['description'] : '';
    6.  $author = isset($_POST['author']) ? $_POST['author'] : '';
    7.  $errors = array();
    8.  if(empty($title))
    9.      $errors[] = 'Поле title пустое';
    10.  if(empty($smalldescription))
    11.      $errors[] = 'Поле smalldescription пустое';
    12.  if(empty($description))
    13.      $errors[] = 'Поле description пустое';
    14.  if(empty($author))
    15.      $errors[] = 'Поле author пустое';
    16.  if(count($errors) > 0)
    17.      echo(implode('<br />', $errors));
    18.  else {
    19.      $title = mysql_real_escape_string($title);
    20.      $smalldescription = mysql_real_escape_string($smalldescription);
    21.      $description = mysql_real_escape_string($description);
    22.      $author = mysql_real_escape_string($author);
    23.      // У тебя там ещё какая-то переменная $date. Если столбец date в б.д.
    24.      // имеет тип DATE или DATETIME или TIMESTAMP, то можно такой запрос:
    25.      $sql = "INSERT INTO `news` (`title`, `smalldescription`, `description`, `author`, `date`) VALUES ('$title', '$smalldescription', '$description', '$author', NOW())";
    26.      mysql_query($sql);
    27.  }
    28.  ?>
    Спасибо, теперь всё работает. С датой тоже учел. Так намного лучше:)

    HTML:
    1.  <html>
    2.      <head>
    3.          <title>Check form</title>
    4.          <script type="text/javascript">
    5.              var fields = new Array('title', 'smalldescription', 'description', 'author');
    6.              function checkForm() {
    7.                  var i = false;
    8.                  var errors = '';
    9.                  for(i in fields) {
    10.                      if(!document.my_form[fields[i]].value.length)
    11.                          errors += 'Поле ' + fields[i] + " пустое\n";
    12.                  }
    13.                  if(errors.length > 0) {
    14.                      alert(errors);
    15.                      return false;
    16.                  } else
    17.                      return true;
    18.              }
    19.          </script>
    20.      </head>
    21.      <body>
    22.          <form name="my_form" method="post" action="script.php" onsubmit="javascript:return checkForm()">
    23.              title: <input type="text" name="title" /> <br />
    24.              smalldescription: <input type="text" name="smalldescription" /> <br />
    25.              description: <input type="text" name="description" /> <br />
    26.              author: <input type="text" name="author" /><br />
    27.              <input type="submit" value="Send" />
    28.          </form>
    29.      </body>
    30.  </html>
    Тоже прекрасно работает. Благодарю за помощь:)

    Насчет вывода, чудесным образом всё заработало :)
     
  10. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Чуть переделал:
    HTML:
    1.          <script type="text/javascript">
    2.              var fields = new Array('title', 'smalldescription', 'description');
    3.              var fnames = new Array('заголовка', 'короткого описания', 'описания');
    4.              function checkForm() {
    5.                  var i = false;
    6.                  var errors = '';
    7.                  for(i in fields) {
    8.                      if(!document.form[fields[i]].value.length)
    9.                          errors += 'Ошибка! Поле ' + fnames[i] + " не заполнено.\n";
    10.                  }
    11.                  if(errors.length > 0) {
    12.                      alert(errors);
    13.                      return false;
    14.                  } else
    15.                      return true;
    16.              }
    17.          </script>
    Заметил очень маленькую ошибку.
    Если заполнено поле title и smalldescription, то при выводе видим:
    [sql]Ошибка! Поле описания не заполнен...[/sql]
    точнее эта ошибка возникает если заполнено 2 поля(любые) а 3 не заполнено.

    когда заполнено одно(или ноль), а остальные пусты в конце сообщения об ошибке видим какой-то квадратик...
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    [js]
    function valid()
    {
    var login=$('#login input[name="login"]').val();
    if(login=='')
    {
    alert('Не заполнено');
    }else{document.forms['login'].submit();}
    }
    [/js]

    HTML:
    1. <form name=""<-теперь не валидно используем -> id="login">
    2.    <input type="text" name="login" /> если xhtml ставим "с пробелом />"
    3.  
    4.    Можно так:
    5.    <input type="submit" onclick="valid();return false" value="Войти" />
    6.  
    7.    Или так:
    8.    <a href="/" onclick="valid();return false" class="link">Войти</a>
    9. </form>
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    ИМХО, глупость подключать jQuery ради такой мелочи.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вообще - то, весь сайт должен работать корректно, не ради мелочи.
    Чтобы не было много разного и куски кода, копии.
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В примере выше всё корректно работает, копий кода нету.
     
  15. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Подымаю тему т.к. проблема обнаружила себя вновь...
    В скрипт вывожу поле таким образом:
    Код (Text):
    1. <?echo (htmlspecialchars($news['description'], ENT_QUOTES));?>
    Содержимое поля:
    Код (Text):
    1. Обычные скобки ' ' ' и двойные скобки " " "
    Двойные скобки выводятся как &quot; (так и должно быть, всё ок)
    А вот одинарные скобки проходят мимо фильтра.

    В чем может быть проблема?
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если пишешь
    , то должен преобразовывать также и одинарные кавычки. Убедись, что там действительно это есть. У меня экранируются одинарные кавычки так.
     
  17. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    В том то и дело что должно нормально экранироваться.

    В редакторе:
    В браузере:
    Содержимое поля:
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ты, наверно, просматриваешь через FireBug или Opera DragonFly. Там, действительно, всякие &#039; преобразуются в соответствующие символы, видимо. Открой именно "Исходный код" и посмотри, что там (Ctrl + U).

    Тем не менее, JavaScript не срабатывает, не смотря на то, что там в исходном коде действительно &#039; ... Используй тогда

    Код (PHP):
    1. <?php echo(str_replace(array('"', '\''), array('"', '\\\''), $str)); ?>
     
  19. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Ошибка была в самом скрипте. Нашел вообщем ошибку.
    Всем спасибо. sobachnik в частности:)