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]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: проблемы при выводе
Muxa
Отправлено: 04 Января, 2013 - 21:52:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Март 2012  
Откуда: Россия, Тверь


Помог: 5 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. mysql_connect ('localhost', 'user', '12345') or die ("Нет соединения" .mysql_error());
  3.  
  4. function _esc($val) { return trim(mysql_real_escape_string($val)); }
  5.  
  6. $author = isset($_POST['author']) ? _esc($_POST['author']) : '';
  7. $name = isset($_POST['name']) ? _esc($_POST['name']) : '';
  8. $meta_d = isset($_POST['meta_d']) ? _esc($_POST['meta_d']) : '';
  9. $meta_k = isset($_POST['meta_k']) ? _esc($_POST['meta_k']) : '';
  10. $date = isset($_POST['date']) ? _esc($_POST['date']) : '';
  11. $link = isset($_POST['link']) ? _esc($_POST['link']) : '';
  12. $mini_img = isset($_POST['mini_img']) ? _esc($_POST['mini_img']) : '';
  13. $img = isset($_POST['img']) ? _esc($_POST['img']) : '';
  14. $description = isset($_POST['description']) ? _esc($_POST['description']) : '';
  15. $categories = isset($_POST['categories']) ? _esc($_POST['categories']) : '';
  16.  
  17. $result = mysql_query("INSERT INTO data (author, name, meta_d, meta_k, date, link, mini_img, img, description, categories) VALUES
  18. ('$author', '$name', '$meta_d', '$meta_k', '$date', '$link', '$mini_img', '$img', '$description', '$categories')");
  19. //Если запрос пройдет успешно то в переменную result вернется true
  20. if($result)
  21. {echo "Ваши данные успешно добавлены";}
  22. else{echo "Ваши данные не добавлены";}
  23. ?>

(Отредактировано автором: 04 Января, 2013 - 21:52:39)

 
 Top
OrmaJever Модератор
Отправлено: 04 Января, 2013 - 22:07:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Muxa Вот как можно записать ваш скрипт в более компактном и правельном варианте.
PHP:
скопировать код в буфер обмена
  1. $data = array('author', 'name', 'meta_d', 'meta_k', 'date', 'link', 'mini_img', 'img', 'description', 'categories');
  2. $T = array();
  3.  
  4. foreach($data as $v)
  5. {
  6.    $T[] = isset($_POST['author']) ? trim(mysql_real_escape_string($_POST['author'])) : '';
  7. }
  8.  
  9. $result = mysql_query('INSERT INTO data ('.join(',', $data).') VALUES ('.join(',', $T).')';
  10. echo $result ? 'Ваши данные успешно добавлены' : 'Ваши данные не добавлены';

Предпологается что названия полей в бд такие же как и в форме.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Muxa
Отправлено: 05 Января, 2013 - 11:17:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Март 2012  
Откуда: Россия, Тверь


Помог: 5 раз(а)





Цитата:
Вот как можно записать ваш скрипт в более компактном и правельном варианте.

Это не мой скрипт, я лишь подправил и убрал предупреждения.

И почему этот вариант правильнее будет? Красивее - да, не спорю. Получается что здесь
массив $data - результат array_keys() или чего-то подобного (или foreach). Да, хорошо, рутинная работа убралась, писать в два раза меньше кода. Тогда уж проще сразу так, зачем циклы

PHP:
скопировать код в буфер обмена
  1. function _esc($val) { return trim(mysql_real_escape_string($val)); }
  2.  
  3. $result = mysql_query('INSERT INTO data ('.join(',', array_keys($_POST)).') VALUES ('.join(',', array_map('_esc', $_POST).')';
  4.  
  5. echo $result ? 'Ваши данные успешно добавлены' : 'Ваши данные не добавлены';

Еще красивее. Только три минуса (в обоих примерах кода):
1. Мы уже не можем назначить какое-либо имя для кнопки, и не должно быть никаких левых значений
2. Независимо от того, какой должен быть тип поля - все поля проэкранируются (хотя если какое-то поле должно быть числом - гораздо проще привести его к целому типу и все, не так ли?)
3. Мы полностью полагаемся на "доброту и щедрость" пользователя, забывая о том, что никто ему не мешает взять да изменить к примеру имя поля.
Догадаться что используется такой синтаксис - труда не составит, альтернативный синтаксис с использованием SET используется редко. В таком случае, я могу попробовать в первом же попавшемся поле прописать например author) VALUES (NULL) -- f и спокойно создастся пустая запись, причем никаких ошибок не возникнет.
Но нам же это не надо, верно? Значит нужно и их обработать от инъекций. Но кроме обычных символов также еще необходимо убрать из названий полей скобки и запятые - итого получается код уже должен выглядеть таким образом

PHP:
скопировать код в буфер обмена
  1. function _escV($val) { return trim(mysql_real_escape_string($val)); }
  2. function _escF($fields) { return trim(mysql_real_escape_string(str_replace(array(')','(',','),'',$fields))); }
  3.  
  4. $result = mysql_query('INSERT INTO data ('.join(',', array_map('_escF', array_keys($_POST))).') VALUES ('.join(',', array_map('_escV', $_POST).')';
  5.  
  6. 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 рулят Улыбка
 
 Top
DelphinPRO
Отправлено: 05 Января, 2013 - 11:44:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Muxa, нет, вы немного неправы. В примере OrmaJever четко заданы те названия полей, которые есть в таблице БД. Если в ПОСТ есть лишние данные - они не попадут в запрос, если каких-то не хватает - будет записана пустая строка.

ps у OrmaJever опечатка, должно быть так

(Добавление)
пункт 3 не сработает
имена полей берутся из заданного в коде массива $data, а не из вне
(Добавление)
Muxa пишет:
Получается что здесь
массив $data - результат array_keys() или чего-то подобного
а с чего вы это взяли? это просто массив с перечислением доступных полей. то же самое что у вас в тернарниках, только красивее и лаконичнее.

в общем вы вникните в код поподробнее

(Отредактировано автором: 05 Января, 2013 - 11:50:51)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Muxa
Отправлено: 05 Января, 2013 - 12:00:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Март 2012  
Откуда: Россия, Тверь


Помог: 5 раз(а)




теперь понял (сбило как раз $_POST['author']), тогда да, лучше (если все поля - текстовые), иначе все же нет Подмигивание
 
 Top
sew810i9
Отправлено: 09 Января, 2013 - 17:28:55
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)

[+]


как в списке <select></select> сделать выборку категорий из базы данных? Сам пробовал чет не получается, при этом и ошибок не каких не показывает php!
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB