Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вывод данных через printf [2]
$result=mysql_query('INSERT INTO data ('.join(',',$data).') VALUES ('.join(',',$T).')';
echo$result ? 'Ваши данные успешно добавлены':'Ваши данные не добавлены';
Предпологается что названия полей в бд такие же как и в форме.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Muxa
Отправлено: 05 Января, 2013 - 11:17:18
Частый гость
Покинул форум
Сообщений всего: 247
Дата рег-ции: Март 2012 Откуда: Россия, Тверь
Помог: 5 раз(а)
Цитата:
Вот как можно записать ваш скрипт в более компактном и правельном варианте.
Это не мой скрипт, я лишь подправил и убрал предупреждения.
И почему этот вариант правильнее будет? Красивее - да, не спорю. Получается что здесь
массив $data - результат array_keys() или чего-то подобного (или foreach). Да, хорошо, рутинная работа убралась, писать в два раза меньше кода. Тогда уж проще сразу так, зачем циклы
echo$result ? 'Ваши данные успешно добавлены':'Ваши данные не добавлены';
Еще красивее. Только три минуса (в обоих примерах кода):
1. Мы уже не можем назначить какое-либо имя для кнопки, и не должно быть никаких левых значений
2. Независимо от того, какой должен быть тип поля - все поля проэкранируются (хотя если какое-то поле должно быть числом - гораздо проще привести его к целому типу и все, не так ли?)
3. Мы полностью полагаемся на "доброту и щедрость" пользователя, забывая о том, что никто ему не мешает взять да изменить к примеру имя поля.
Догадаться что используется такой синтаксис - труда не составит, альтернативный синтаксис с использованием SET используется редко. В таком случае, я могу попробовать в первом же попавшемся поле прописать например author) VALUES (NULL) -- f и спокойно создастся пустая запись, причем никаких ошибок не возникнет.
Но нам же это не надо, верно? Значит нужно и их обработать от инъекций. Но кроме обычных символов также еще необходимо убрать из названий полей скобки и запятые - итого получается код уже должен выглядеть таким образом
echo$result ? 'Ваши данные успешно добавлены':'Ваши данные не добавлены';
От третьего пункта избавились, от первого можно избавиться если поставить условие на проверку ключа/значения в обоих функциях, ок. Второй пункт остался. Теперь, если посмотреть с другой стороны - а так ли уж нужна эта красота?
При 10 полях в таблице - 10 лишних вызовов trim, mysql_real_escape_string, str_replace + array_keys. Имхо, это лишнее, и лучше перечислить поля вручную. Но тут появляется еще одна проблема. Если юзер просто-напросто в консоли удалит какое-то поле - то у нас будет ошибка column count doesn't match values count.. или как она там. Следовательно, нам еще необходимо проверить число записей, чтобы оно соответствовало числу полей.
Итого, добавляется еще лишний if-else. И по прежнему остается невозможность приведения к целому типу при надобности (можно проверять is_numeric - но что толку если ввести заведомо не число?).
Имхо, в данном случае, красота кода не стоит того, чтобы ее использовать только потому, что она красивее..
P.S. поправьте если я в чем то ошибся, буду рад признать неправоту..
prepared statements рулят
DelphinPRO
Отправлено: 05 Января, 2013 - 11:44:07
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Muxa, нет, вы немного неправы. В примере OrmaJever четко заданы те названия полей, которые есть в таблице БД. Если в ПОСТ есть лишние данные - они не попадут в запрос, если каких-то не хватает - будет записана пустая строка.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.