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
Форумы портала PHP.SU :: Версия для печати :: Замена переменных в url
Форумы портала PHP.SU » » Если скрипт не работает » Замена переменных в url

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

1. Dezmonds - 20 Мая, 2011 - 11:59:34 - перейти к сообщению
Многоуважаемые, помогите разобраться... абсолютно не знаю как это называется и как с этим бороться...

есть ссылка
PHP:
скопировать код в буфер обмена
  1. <a href='./articles-item.php?id=%s&table=recipes_japan'>

В url Допустим следующее. articles-item.php?id=1&table=recipes_japan
в articles-item.php

PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['table'])) {$table = $_GET['table'];}
  2. if (!isset($table)){$table = "news_japan";}
  3.  
  4. $id_result = mysql_query("SELECT id FROM $table",$db);


Логика такая, что если есть переменная table тогда вытаскиваем данные с таблицы которая указана в url. Проблема в следующем, как реализовать, чтобы если пользователь ввел неверное значение допустим просто изменил url(пусть будет случайно) и вместо articles-item.php?id=1&table=recipes_japan написал articles-item.php?id=1&table=recipes_japans Если будет ошибка в url тогда и в articles-item.php будет ошибка. Mysql будет выдавать ошибку чтения базы.. Помогите разобраться пожалуйста
2. EuGen - 20 Мая, 2011 - 12:02:05 - перейти к сообщению
Сделайте обработку приходящих от пользователя данных. Например, создайте массив допустимых значений и проверяйте по нему. Если пользователь предает значение, которого нет в массиве - либо сообщать об ошибке, либо брать значение по-умолчанию.
Пример такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. //имена таблиц заменить на свои
  3. $rgTables=array('table0', 'table1');
  4. $sDefault='table0';
  5. $sTable=(isset($_GET['table'])&&in_array($_GET['table'], $rgTables))?$_GET['table']:$sDefault;
  6. //далее Ваши запросы с использованием в качестве имени таблицы уже $sTable
  7.  
3. Viper - 20 Мая, 2011 - 12:19:35 - перейти к сообщению
Все же проверка входных данных тут уместнее чем замена.
4. Dezmonds - 20 Мая, 2011 - 12:22:54 - перейти к сообщению
Спасибо большое, смысл понятен, только почему то если скажем пользователь напишет вместо
PHP:
скопировать код в буфер обмена
  1. http://.../articles-item.php?id=1&table=recipes_japan

http://.../articles-item.php?id=1&table= Тогда выдает ошибку чтения БД, Недовольство, огорчение

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include("admin/db.php");
  3. if (isset($_GET['table'])) {$table = $_GET['table'];}
  4. if (!isset($table)){$table = "news_japan";}
  5.  
  6. $id_result = mysql_query("SELECT id FROM $table",$db);
  7.  
  8. //имена таблиц заменить на свои
  9. $rgTables=array('news_japan', 'articles_japan', 'blogs_users', 'recipes_japan', 'recipes_world');
  10. $sDefault='news_japan';
  11. $table=(isset($_GET['table'])&&in_array($_GET['table'], $rgTables))?$_GET['table']:$sDefault;
  12. //далее Ваши запросы с использованием в качестве имени таблицы уже $sTable
  13.  
  14. if (!$id_result)
  15. {
  16.         echo "<p> Запрос на выборку данных из базы не прошел.Пожалуйста сообщение администратору: ";
  17.         exit(mysql_error());
  18. }
  19. if (mysql_num_rows($id_result) > 0)
  20. {
  21. $id_myrow = mysql_fetch_array($id_result);
  22. }
  23. else {echo "<p>Информация по запросу не может быть извлечена. В таблице нет записей.Пожалуйста сообщение администратору: </p>";
  24. exit();}
  25.  
  26. if (isset($_GET['id'])) {$id = $_GET['id'];}
  27. if (!isset($id)){$id = $id_myrow['id'];}
  28.  
  29.  
  30.  
  31. if (isset($_GET['page_name'])) {$page_name = $_GET['page_name'];}
  32. if (!isset($page_name)){$page_name = "Новости Японии";}
  33.  
  34.  
  35. $result = mysql_query("SELECT * FROM $table where id = '$id'",$db);
  36.  
  37. if (!$result)
  38. {
  39.         echo "<p> Запрос на выборку данных из базы не прошел.Пожалуйста сообщение администратору: ";
  40.         exit(mysql_error());
  41. }
  42. if (mysql_num_rows($result) > 0)
  43. {
  44. $myrow = mysql_fetch_array($result);
  45.  
  46. $new_view = $myrow["view"] + 1;
  47. $update_view = mysql_query("UPDATE $table SET view = '$new_view' WHERE id = '$id'",$db);
  48.  
  49.  
  50. }
  51. else
  52. {
  53.         echo "<p>Информация по запросу не может быть извлечена. В таблице нет записей.Пожалуйста сообщение администратору: </p>";
  54.         exit();
  55. }
  56.  
  57.  
  58. ?>
  59.  
  60.  
  61.  
  62.  
5. EuGen - 20 Мая, 2011 - 12:25:17 - перейти к сообщению
Потому что проверку имени таблицы нужно помещать до запроса, в этом её смысл.
6. Dezmonds - 20 Мая, 2011 - 12:28:01 - перейти к сообщению
EuGen Cпасибо большое Вам!!!! Что то я устал Улыбка такую глупость сморозил Улыбка) Спасибо!
(Добавление)
Еще один вопрос. Почему все отлично работает если я захожу с url
/articles-item.php?id=10&table=news_japan (спокойно меняю значение table и все ок)
А вот если захожу допустим с
articles-item.php?id=1&table=articles_japan
и пробую меня значение, тогда выдает опять же ошибку чтения бд (А ТОЧНЕЕ! Выдает ошибку : якобы в таблице нет записей!)

Вообще очень странно! Помогите разобраться. есть таблички "news_japan", "articles_japan", "blogs_users", "recipes_japan", "recipes_world"

с
articles-item.php?id=10&table=news_japan
articles-item.php?id=7&table=recipes_world
articles-item.php?id=7&table=blogs_users



все работает. в плане сам массив.
А почему, то с articles_japan и recipes_japan не работает. Например перехожу на страничку articles-item.php?id=7&table=recipes_japan пишет ошибку. Хотя табличка есть и записи в ней тоже.
7. Alex_pac - 20 Мая, 2011 - 15:15:56 - перейти к сообщению
8. EuGen - 20 Мая, 2011 - 15:18:26 - перейти к сообщению
Dezmonds пишет:
Хотя табличка есть и записи в ней тоже.

Но, быть может, в ней нет поля id ?
9. Dezmonds - 20 Мая, 2011 - 15:41:46 - перейти к сообщению
проблема в том, что поле есть...
(Добавление)
Alex_pac пишет:
жесть какая.
любой хакер сможет Ниндзя получить доступ к вашей базе через sql инъекции

Подскажите как сделать иначе ? более правильнее
10. EuGen - 20 Мая, 2011 - 15:56:31 - перейти к сообщению
Почитайте лучше вот http://phpfaq[dot]ru/debug
11. Dezmonds - 20 Мая, 2011 - 17:09:14 - перейти к сообщению
Почитал, попробовал. ничего из этого не вынес для данной ситуации..

Есть база, есть 5 таблиц, в которых есть поля. В чем проблема я так и не понял. почему 3 поля работаю, а 2 нет... не знаю Недовольство, огорчение

 

Powered by ExBB FM 1.0 RC1