За последние 24 часа нас посетили 16218 программистов и 1668 роботов. Сейчас ищут 877 программистов ...

Правильно ли я проверяю на незаполненность поля

Тема в разделе "PHP для новичков", создана пользователем Magnum, 2 май 2016.

  1. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Привет мастера. У меня вопрос по повышению мастерства в написании кода php. В моём коде всё работает, но хотелось бы услышать критику, и советы по улучшению "читабельности кода" и оптимизированной работы скрипта. У меня есть форма. И тут я проверяю, пустые ли поля (данные не фильтруются, это пока только начальная стадия написания). Подскажите, как лучше сделать. Как я, или, знаю, что можно сделать через switch?

    PHP:
    1. echo '<div class="activ">
    2.    <form method="POST" action="create_work.php" enctype="multipart/form-data">
    3.    Название работы:<br>
    4.    <input type="text" name="work_name"><br><br>
    5.    Описание:<br>
    6.  
    7.    <textarea name="opis" cols="40" rows="4"></textarea><br><br>
    8.  
    9.    Цена:<br>
    10.    <input type="number" name="price"><br><br>
    11.  
    12.    Категория:';
    13.  
    14.     $q = $db -> query("SELECT * FROM `cats`");
    15.     echo '
    16.    <select name="cat">';
    17.     while ($row = $q -> fetch_array()) {
    18.     echo '<option value="'.$row['id'].'">'.$row['name'].'</option>';
    19. }
    20.     echo '</select><br><br>
    21.  
    22.    Скрин:
    23.    <input type="file" name="img"><br><br>
    24.  
    25.    <input type="submit" value="Создать категорию">
    26.    </form>
    27.  
    28. </div>';
    29.  
    30.  
    31. if (isset($_POST['work_name'], $_POST['opis'], $_POST['price'], $_POST['cat'], $_FILES['img'])) {
    32.     if (empty($_POST['work_name'])) echo 'Вы не ввели имя работы<br>';
    33.     if (empty($_POST['opis'])) echo 'Вы не ввели описание работы<br>';
    34.     if (empty($_POST['price'])) echo 'Вы не ввели цену работы<br>';
    35.     if (empty($_POST['cat'])) echo 'Вы не выбрали категорию<br>';
    36.     if (!is_uploaded_file($_FILES['img']['tmp_name'])) echo 'Вы не выбрали файл для добавления';
    37.  
    38.     if (!empty($_POST['work_name']) && !empty($_POST['opis']) && !empty($_POST['price']) && !empty($_POST['cat']) && is_uploaded_file($_FILES['img']['tmp_name'])) {
    39.         $uploaddir = '../works/img/';
    40.         move_uploaded_file($_FILES['img']['tmp_name'], $uploaddir.$_FILES['img']['name']);
    41.         $filename = $_FILES['img']['name'];
    42.  
    43.         $q = $db -> query("INSERT INTO `works`(cat, name, screen, opis, price) VALUES ('".$_POST['cat']."', '".$_POST['work_name']."', '".$filename."', '".$_POST['opis']."', '".$_POST['price']."')");
    44.        
    45.         if (!$q) echo $db -> error;
    46.         echo 'файл добавлен';
    47.     }
    48. }
     
  2. CoolKid

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

    С нами с:
    24 сен 2014
    Сообщения:
    33
    Симпатии:
    5
    Во-первых, советую сменить подпись, мой вариант лучше как мне кажется)
    Пытаюсь говнокодить на PHP. Возможно вы говорите с будущим фрилансером-говнокодером, работающим за 30-40 тыщ в месяц

    Во-вторых, хочешь ревью кода? Ну получи, распишись...

    1. Золотое правило - сначала код на PHP, затем разметка. У тебя все наоборот, при этом почему-то разметка обернута в длиииииную инструкцию echo. Зачем? Почему нельзя вывести непосредственно?

    2. Зачем использовать $q->fetch_array(), если ты используешь только ассоциативные массивы? Используй $q->fetch_assoc()

    3. Вместо громоздкой и неудобной конструкции
    PHP:
    1. if (isset($_POST['work_name'], $_POST['opis'], $_POST['price'], $_POST['cat'], $_FILES['img'])) {
    нужно проверять на то, что текущий метод доступа - POST и размер суперглобального массива POST больше 0
    PHP:
    1. if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) > 0) {
    2. // ...
    3. }
    4. Ошибки валидации не нужно вываливать портянкой с помощью echo. Собери все сообщения об ошибках в массив, а потом выведи их с помощью foreach в одном месте, выделив красным
    Т.е. вместо
    PHP:
    1.    if (empty($_POST['work_name'])) echo 'Вы не ввели имя работы<br>';
    2.     if (empty($_POST['opis'])) echo 'Вы не ввели описание работы<br>';
    3.     if (empty($_POST['price'])) echo 'Вы не ввели цену работы<br>';
    4.     if (empty($_POST['cat'])) echo 'Вы не выбрали категорию<br>';
    Нужно что-то вроде
    PHP:
    1. $errors = []; //PHP >= 5.4
    2.  
    3. if (empty($_POST['work_name'])) {
    4.     $errors[] = 'Вы не ввели имя работы';
    5. }
    6.  
    7. if (empty($_POST['opis'])) {
    8.     $errors[] = 'Вы не ввели описание работы';
    9. }
    10. ...
    а затем, где-то в глубинах HTML вывести массив $errors с помощью короткого синтаксиса
    PHP:
    1. <? if (is_array($errors) && count($errors) > 0): ?>
    2. <ul>
    3.     <? foreach ($errors as $error): ?>
    4.         <li><?= $error ?></li>
    5.     <? endforeach; ?>
    6. </ul>
    7. <? endif; ?>
    5.
    PHP:
    1. $q = $db -> query("INSERT INTO `works`(cat, name, screen, opis, price) VALUES ('".$_POST['cat']."', '".$_POST['work_name']."', '".$filename."', '".$_POST['opis']."', '".$_POST['price']."')");
    Где проверка на безопасность? Где mysql_real_escape_string() ?
    Оставишь код вот так без экранирования и тебе "насуют за обе щеки" (с)

    6. Скорее всего еще есть уязвимости в загрузке файла: нет проверки на тип, небезопасно обрабатывается путь и т.д. Но это ты уже найдешь и исправишь сам :)
     
    Magnum нравится это.
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @CoolKid, согласен со всем кроме пункта 3 :)
     
  4. CoolKid

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

    С нами с:
    24 сен 2014
    Сообщения:
    33
    Симпатии:
    5
    @mahmuzar, ну раз не согласен - обоснуй в чем я не прав и расскажи как надо действовать в таком случае.
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @CoolKid, присмотрись что делает он, и что предлогаешь ты.
     
  6. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    @CoolKid спасибо за подсказки, буду работать над кодом;)
    :cool: