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 :: Версия для печати :: Проверка номера страницы, когда ?page=0 выдает ошибку
Форумы портала PHP.SU » » Если скрипт не работает » Проверка номера страницы, когда ?page=0 выдает ошибку

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

1. kappa - 30 Апреля, 2011 - 09:17:03 - перейти к сообщению
Вот у меня есть такая проверка в начале скрипта постраничной навигации,
вроде и модуль числа взял и округлил а вот как пишу ?page=0 или ?page=-0 выдает ошибку
на выборку с БД , вот часть кода:
PHP:
скопировать код в буфер обмена
  1.  
  2. if (isset($_GET['page']))
  3. {
  4.   $page = abs(ceil($_GET['page']))-1; // текущая страница
  5.  
  6. }
  7. else
  8. {
  9.   $page = 0;
  10. }
  11.  
2. SAD - 30 Апреля, 2011 - 09:20:03 - перейти к сообщению
какую ошибку? мы не экстарсенсы.
приведите подробный код
3. kappa - 30 Апреля, 2011 - 09:35:15 - перейти к сообщению
Выдает такую ошибку:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in D:\USBWebserver v8_en\root\Site html\pages.php on line 26

А вот весь код полностью:
PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_connect($dblocation,$dbuser,$dbpasswd);  
  3. mysql_select_db($dbname);
  4.  
  5.  
  6. echo "<center>"; //Делаем вывод по центру
  7.  
  8. $link_sc = 'pages.php'; // путь
  9. if (isset($_GET['page']))
  10. {
  11.   $page = abs(ceil($_GET['page']))-1; // текущая страница
  12. }
  13. else
  14. {
  15.   $page = 0;
  16. }
  17.  
  18.  
  19.  
  20. $rpp = 5; //Сколько выводит на страницу
  21. $form = $page * $rpp; //Вычисляем по формуле (Тек. страницу * на количество выводимых строк на страницу) получаем число для запроса к БД
  22.  
  23.  
  24.  
  25. $result = mysql_query("SELECT * FROM pages ORDER BY id  LIMIT $form,$rpp"); //Запрашиваем результат в обратном порядке (начиная со старшего id
  26. while($row= mysql_fetch_row($result))  
  27.     {
  28.     echo "[".$row[0]."] ".$row[1]."<br>";  
  29.     }
  30.  
  31.        
  32. $res = mysql_query("SELECT count(id) FROM pages"); //определяем количество записей в таблице для составления ссылок
  33. $cnt = mysql_fetch_row($res); //общее количество записей во всём выводе
  34.  
  35.  
  36.  
  37.  
  38. $rad=1; // сколько ссылок показывать рядом с номером текущей страницы (2 слева + 2 справа + активная страница = всего 5)
  39.  
  40.  
  41.  
  42. $links=$rad*2+1;
  43. $pages=ceil($cnt[0]/$rpp);
  44. if ($page>0) { echo "<a href=\"$link_sc?page=1\">First</a> | <a href=\"$link_sc?page=".($page)."\">Previous</a> |"; }
  45. $start=$page-$rad;
  46. if ($start>$pages-$links) { $start=$pages-$links; }
  47. if ($start<0) { $start=0; }
  48. $end=$start+$links;
  49. if ($end>$pages) { $end=$pages; }
  50. for ($i=$start; $i<$end; $i++) {
  51.  echo " ";
  52.  
  53.  if ($i==$page) {
  54.   echo "<b>";
  55.  } else {
  56.   echo "<a href=\"$link_sc?page=".($i+1)."\">";
  57.  }
  58. // echo ($i*$rpp+1)."-";
  59. // if ($i!=($pages-1)) { echo $i*$rpp+$rpp; } else { echo $cnt; }
  60.  echo ($i+1);
  61.  if ($i==$page) {
  62.   echo "</b>";
  63.  } else {
  64.   echo "</a>";
  65.  }
  66.  if ($i!=($end-1)) { echo "&nbsp;|"; }
  67. }
  68. if ($pages>$links&&$page<($pages-$rad-1)) { echo " ... <a href=\"$link_sc?page=".($pages)."\">".($pages)."</a>"; }
  69. if ($page<$pages-1) { echo " <a href=\"$link_sc?page=".($page+2)."\">Next</a> | <a href=\"$link_sc?page=".($pages)."\">Last</a>";
  70.  
4. vsll - 30 Апреля, 2011 - 10:05:36 - перейти к сообщению
попробуйте в косые кавычки поля заключить и ...LIMIT ".$form.",".$rpp."')
5. OrmaJever - 30 Апреля, 2011 - 10:35:54 - перейти к сообщению
выведите mysql_erorr() после запроса и увидите ошибку
6. kappa - 30 Апреля, 2011 - 11:09:51 - перейти к сообщению
Vasiliya не помогает

OrmaJever
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5, 5' at line 1

Получается что при нуле попадает каким то образом -5 вместо 0
7. vsll - 30 Апреля, 2011 - 11:23:10 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['page'])) {
  2.         if (!empty($_GET['page'])) {
  3.                 $page = abs(ceil($_GET['page']))-1; // текущая страница
  4.         } else {
  5.                       $page = 0;
  6.         }
  7. }
  8.  
8. Uchkuma - 30 Апреля, 2011 - 11:27:48 - перейти к сообщению
kappa пишет:
$page = abs(ceil($_GET['page']))-1;

0 - 1 = сколько? правильно, -1
kappa пишет:
$form = $page * $rpp;

-1 * 5 = сколько? правильно, -5.

Чему вы удивляетесь?
9. Haron - 30 Апреля, 2011 - 11:56:55 - перейти к сообщению
Проверяйте данные на ожидаемое значение (В данном случае unsigned int (беззнаковое целое)) ПЕРЕД передачей в MySQL. Не доверяйте тому, что передают на сервер пользователи.

Правильнее всего приводить данные к необходимому виду.

Пример:

PHP:
скопировать код в буфер обмена
  1. function check_page($value)
  2. {
  3.     // Проверяем значение, а число ли это?
  4.     if (filter_var($value, FILTER_VALIDATE_INT))
  5.     {
  6.           // Если число, то выводим (с дополнительным приведением к unsigned если оно отрицательно)
  7.           return abs($value);
  8.     }
  9.     else
  10.     {
  11.           // Здесь я вывел 1, (Если это было не число, то отправим на первую страницу)
  12.           return 1;
  13.     }
  14. }


Такде добавлю...
ТВЁРДО помните:
- НИКОГДА не доверяйте тому что вводят пользователи, что они отправляют на сервер. ВСЕ кто не следовал этому правилу - БЫЛИ УНИЧТОЖЕНЫ.
10. OrmaJever - 30 Апреля, 2011 - 12:16:21 - перейти к сообщению
Да просто вначале скрипта добавить условие
PHP:
скопировать код в буфер обмена
  1. $page = (isset($_GET['page']) ? abs((int)$_GET['page']) : 1;
11. Haron - 30 Апреля, 2011 - 12:22:54 - перейти к сообщению
OrmaJever пишет:
Да просто вначале скрипта добавить условие
PHP:
скопировать код в буфер обмена
  1. $page = (isset($_GET['page']) ? abs((int)$_GET['page']) : 1;


При ?page=<>'`'` или типа того - вернёт ноль Улыбка.
12. OrmaJever - 30 Апреля, 2011 - 12:30:38 - перейти к сообщению
ок
PHP:
скопировать код в буфер обмена
  1. $page = (isset($_GET['page']) && (int)$_GET['page'] > 0) ? (int)$_GET['page'] : 1;
13. vsll - 30 Апреля, 2011 - 12:34:13 - перейти к сообщению
А так?
PHP:
скопировать код в буфер обмена
  1. $page = (isset($_GET['page']) && isnum($_GET['page']) && !empty($_GET['page'])) ? $_GET['page'] : 1;
  2. function isnum($value) {
  3.         if (!is_array($value)) {
  4.                 return (preg_match("/^[0-9]+$/", $value));
  5.         } else {
  6.                 return false;
  7.         }
  8. }
14. Haron - 30 Апреля, 2011 - 12:49:48 - перейти к сообщению
Vasiliya пишет:
...preg_match...

О-о-о...

Тогда уж можно и так...:
PHP:
скопировать код в буфер обмена
  1.  
  2. while($i < 100500)
  3. {
  4.         $array[] = $i;
  5.         $i++;
  6. }
  7.  
  8. if(isset($_GET('page')))
  9. {
  10.         if(array_search($_GET['page'], $array))
  11.         {
  12.                 return array_search($_GET['page'], $array);
  13.         }
  14.         else
  15.         {
  16.                         return 1;
  17.         }
  18. }
  19. else
  20. {
  21.         return 1;
  22. }
15. kappa - 30 Апреля, 2011 - 12:53:43 - перейти к сообщению
Большое спасибо всем за помощь, я нашел самое оптимальное решение (или может мне так кажется)
PHP:
скопировать код в буфер обмена
  1. function check_page($value)
  2. {
  3.     // Проверяем значение, а число ли это?
  4.     if (filter_var($value, FILTER_VALIDATE_INT))
  5.     {
  6.           // Если число, то выводим (с дополнительным приведением к unsigned если оно отрицательно)
  7.           return abs($value);
  8.     }
  9.     else
  10.     {
  11.           // Здесь я вывел 1, (Если это было не число, то отправим на первую страницу)
  12.           return 1;
  13.     }
  14. }
  15.  
  16. if (isset($_GET['page'])){
  17. $page = check_page($_GET['page'])-1; // текущая страница
  18. }
  19. else
  20. {
  21.   $page = 0;
  22. }  
  23.  


Фильтрует и отрицательные и дробные числа и при вводе ?page= или ?pae=
выводит первую страницу.,
p.s. много интересных решений для себя увидел Подмигивание

 

Powered by ExBB FM 1.0 RC1