Как "красиво" занести значения из формы

Тема в разделе "Базы данных", создана пользователем jon4god, 12 окт 2011.

Модераторы: latteo
  1. jon4god

    jon4god

    Регистр.:
    13 авг 2009
    Сообщения:
    213
    Симпатии:
    50
    Уважаемые эксперты...
    Есть форма с большим количеством вводимых значений и на данный момент запрос в базу для переноса в нее значений таков:
    PHP:
    INSERT INTO `таблицаVALUES('','$_POST[значение]','$_POST[значение]','$_POST[значение]','$_POST[значение]','$_POST[значение]',... ,$_POST[значение]')
    и так порядка 45 значений заносятся, но...
    Есть ли возможность оптимизировать запрос с использованием массивов например?
     
  2. solarb

    solarb Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    64
    Симпатии:
    15
    для начала то что ты делаеш открывает дыру для msql injection.
    информация в POST-е должна быть фиртрирована перед добавлением в базы.
    для запроса то что можешь сделать ето:
    1.
    убрать излишное из POST ... как содержание submit бутона.
    unset($_POST['imq_submit_buttona']);
    2. один foreach со филтром POST (htmlspecialchars).
    foreach($_POST as $index=>$value)
    {
    $masiv[$index] = htmlspecialchars($value);
    }
    потом делаешь
    INSERT INTO `таблица` VALUES('',$masiv) // правильно сделано, что первый незаполненый

    П.С. Не проверял для ошибок но сама идея думаю понятна.
     
    jon4god нравится это.
  3. jon4god

    jon4god

    Регистр.:
    13 авг 2009
    Сообщения:
    213
    Симпатии:
    50
    А если какое-то значение в форме не введено? Конструкция фильтра и вставки значений в таблицу не нарушится?
    Вообще вот что пока имею:
    PHP:
    if(isset($_POST['submit']))
    {
                unset(
    $_POST['button']);
                foreach(
    $_POST as $index=>$value)
                {
                
    $masiv[$index] = htmlspecialchars($value);
                }
                
    $query mysql_query("INSERT INTO `tab` VALUES('',$masiv)");
                if(
    $query == 'true'
                {
                    echo 
    "<div class=message>ИНФОРМАЦИЯ УСПЕШНО ДОБАВЛЕНА</div>";
                }
    }
     
  4. solarb

    solarb Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    64
    Симпатии:
    15
    будут содержать NULL или "" т.е. не нарушиться структура.
     
  5. jon4god

    jon4god

    Регистр.:
    13 авг 2009
    Сообщения:
    213
    Симпатии:
    50
    А что сделать с 4 чекбоксами? Как они среагируют на эту конструкцию?
     
  6. barabula

    barabula Нарушитель

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Таким образом этого достаточно ? или ещё что-то нужно дописывать?
    P.S. не подумайте что набираю посты, просто пхп учу, вот интерисуюсь разнообразными вариантами решения подобных задачь.
     
  7. solarb

    solarb Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    64
    Симпатии:
    15
    зависит от имя чекбоксов и ихняя стойность. но должно получится масив в масиве
    (если в name чекбокса есть пример "<input type="checkbox" name="chk[]" />"). если нет только одна стойность.
    если не сложно можешь дать mysql damp структуры таблицы и форму под хайд или на файл?


    @barabula ето хватит для стандартной заявки и фильтра.

    и впрочем ты проверяешь:

    ->if(isset($_POST['submit']))

    а потом убераешь $_POST['button'].
    не думаю что у формы должны быти 2 бутона для отправки информации :D (может я не прав если так поправьте)

    идея такая:
    проверяешь нажата ли кнопка если да убераешь ее стойность из POST, потому что она ненужна для mysql запроса и выйдет ошибка.
    тоже относится если есть RESET бутон.
     
  8. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    314
    Симпатии:
    98
    хороший стиль программирования предполагает при вставке значений в таблицу, упоминать названия полей, т.к. если в таблице изменятся поля (добавятся, удалятся), ваш insert не сработает. иногда так бывает на плохо написанных движках - добавишь поле в таблицу, и двиг перестает работать. кол-во значений не соответствует количеству полей. посему хорошо бы перечислять названия полей.

    например

    //
    $legal_variables=array(
    'var1','var2','var3','field1','field2','field3','field4'
    );
    //наполняем массив post
    reset ($_POST); $post=array_fill_keys($legal_variables, '');
    while (list($k,$v)=each($_POST)){
    //если имя поля не встречается в нужных, то не обрабатываем его вовсе.
    if (! in_array($k,$legal_variables)){continue;}
    //тут можно дополнительно обработать переменную $v - например htmlspecialchars
    //trim тоже важно, иногда в посте в начале или конце встречаются пробелы
    $post[$k]=addslashes(trim($v));
    }

    $keys=join(', ',array_keys($post);
    $values='"'.join('", "',array_keys($post).'"';

    $sql="insert into tablename (".$keys.") values (".$values.");";
    mysql_query($sql);

    Добавлено через 4 минуты
    чем интересен этот код?
    1. если у вас в таблице не используются значения по умолчанию, то пропуск какого-то из значений будет выдавать ошибку (cannot be NULL или как его там). этот код по умолчанию ставит не NULL значение
    2. вы всегда знаете какие точно поля у вас будут обработаны - вне зависимости от количества переданных полей.
     
  9. jon4god

    jon4god

    Регистр.:
    13 авг 2009
    Сообщения:
    213
    Симпатии:
    50
    Так'с... Как я понял вот это убрать: unset($_POST['button']); , т.к. масло масленное получается.
    А чекбоксы у меня в виде:
    PHP:
    <input type=checkbox id=formation_of_groups value=3 name=formation_of_groups[]> Другое
    Дамп дать не могу, т.к. только пишу сейчас запрос на создание таблицы, а форма просто огромная. :) Сейчас выкину в инет то, что накодил(или нашкодил) и могу в личку адресок кинуть проекта.
     
  10. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    314
    Симпатии:
    98
    есть второй вариант
    тупейший

    но мало ли, вдруг ваша задача просто перенести данные в базу

    $sql="insert into table tablename (value) values (".addslashes(serialize($_POST)).")";

    поле value - типа longtext
    остальные поля - по вкусу :)