1 Востаннє редагувалося Faraon (13.03.2015 00:19:32)

Тема: Посторінкова навігація на PHP

Привіт всім. Є код який виводить на екран 8 останніх доданих полів які були записані в базу. Раніше я його юзав і все булу кул... а тепер вибиває помилку:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\shop\mobile.php on line 57
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\shop\mobile.php on line 69
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\shop\mobile.php on line 90

код:

<?php
session_start();
include_once ("connect.php");
//mysql_query("SET NAMES 'utf8'"); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><<<OnlineShop>>></title>
<link rel="shortcut icon" href="img/icon.gif" type="image/x-icon">
<link rel="stylesheet" href="index.css" type="text/css">
</head>
<body>
<img class="ua" src="img/ua.png">
<center>

<div class="nazad_blok">
    <hr>    
    <a href='index.php'><img src='img/nazad.png' style="width: 100%; height: 100%;"></a>
    <hr>    
</div>

<div class="top_blok">
    <hr>    
    <u>Телефоны, смартфоны</u> >> ...
    <hr>
</div>

<div class="big_blok">
    <div class="menu">
        <hr>
            <a href="#" class="pid_menu">Iphone</a> 
            <a href="#" class="pid_menu">Nokia</a> 
            <a href="#" class="pid_menu">HTC</a> 
            <a href="#" class="pid_menu">Lenovo</a> 
            <a href="#" class="pid_menu">Samsung</a> 
            <a href="#" class="pid_menu">Другие</a> 
            <a href="#" class="pid_menu">Аксесуары</a> 
        <hr>
    </div>
    
    <div class="korzina">
        <hr>
            Корзина: <a href="#">0</a>
        <hr>
    </div>
    
    <div class="tovar">
    
    
    <?php
// постраничная навигация php mysql
$num = 8;
@$page = $_GET["page"];
$result00 = mysql_query("SELECT COUNT (*) FROM products");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
$total = (($posts - 1) / $num) + 1;
$total =  intval($total);
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
$start = $page * $num - $num;



$query = mysql_query ("SELECT * FROM products ORDER BY id DESC LIMIT $start, $num");
  $row = mysql_fetch_array($query);
  do
       {
            $name_row = $row['name'];
            $mini_opes_row = $row['mini_opes'];
            $img_row = $row['img'];
            $price_row = $row['price'];
            
            echo "<div class='elem_tovar'>
                    <div class='top_shapka_tov'>

                    <img src='img/$img_row' style='margin:20px 10px 2px 0px; height: 70%; width: 100%;'>
                    </div>
                    <div class='botoom_shapka_tov'>
                        <br>
                        $name_row <br> <b style='color: red;'>$price_row</b> грн
                        <hr>
                        <a href='#'> <img src='img/plus.png' align='middle' style='padding: 5px 5px;'></a> <a href='#' style='text-decoration: none; color: #FFFFFF;'>Посмотреть</a>
                    </div>
                </div>";
       }
 while($row = mysql_fetch_array($query));


// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=mobile.php?page=1#example3>Первая</a> | <a href=mobile.php?page='. ($page - 1) .'#example3>Предыдущая</a> | ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=mobile.php?page='. ($page + 1) .'#example3>Следующая</a> | <a href=mobile.php?page=' .$total. '#example3>Последняя</a>';

// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 5 > 0) $page5left = ' <a href=mobile.php?page='. ($page - 5) .'#example3>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=mobile.php?page='. ($page - 4) .'#example3>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=mobile.php?page='. ($page - 3) .'#example3>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=mobile.php?page='. ($page - 2) .'#example3>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=mobile.php?page='. ($page - 1) .'#example3>'. ($page - 1) .'</a> | ';

if($page + 5 <= $total) $page5right = ' | <a href=mobile.php?page='. ($page + 5) .'#example3>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=mobile.php?page='. ($page + 4) .'#example3>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=mobile.php?page='. ($page + 3) .'#example3>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=mobile.php?page='. ($page + 2) .'#example3>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=mobile.php?page='. ($page + 1) .'#example3>'. ($page + 1) .'</a>';

// Вывод меню если страниц больше одной

if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;
echo "</div>";
}
?>
        
    </div>
</div>
<br>

<div class="inf">
    <a href="#" class="a_inf">Контакт со Службой поддержки</a> 
    <a href="#" class="a_inf">Отправить жалобу</a> 
    <a href="#" class="a_inf">Помощь</a> 
</div>
</center>
</body>
</html>

Нерозумію в чому проблема... допоможіть будь ласка

2

Re: Посторінкова навігація на PHP

А база підключена норм?

3 Востаннє редагувалося Faraon (12.03.2015 23:00:10)

Re: Посторінкова навігація на PHP

Chemist-i написав:

А база підключена норм?

Так, тому що на іншій сторінці сайту дані з бази витягуються успішно.

4 Востаннє редагувалося Faraon (13.03.2015 00:22:08)

Re: Посторінкова навігація на PHP

Я не маю настрою зараз гадати в чому проблема, тому вирішив замінити весь код на інший. Найшов в інтернеті робочий код (кому потрібно то Вам лишається тільки дещо підправити):

<?php
// Змінна зберігає число повідомлень які виводяться на сторінці
$num = 8;  
// Витягаємо з URL поточну сторінку 
@$page = $_GET['page'];  
// Визначаємо загальне число повідомлень у базі даних 
$result = mysql_query("SELECT COUNT(*) FROM products");  
$posts = mysql_result($result, 0);  
// Знаходимо загальне число сторінок 
$total = intval(($posts - 1) / $num) + 1;  
// Визначаємо початок повідомлень для поточної сторінки  
$page = intval($page);  
// Якщо значення $page менше одиниці чи негативне
// Переходимо на першу сторінку
// А якщо занадто велике, то переходимо на останню
if(empty($page) or $page < 0) $page = 1;  
  if($page > $total) $page = $total;  
// Обчислюємо починаючи до якого номера
// Слід виводити повідомлення 
$start = $page * $num - $num;  
// Вибираємо $num повідомлень починаючи з номера $start  
$result = mysql_query("SELECT * FROM products ORDER BY id DESC LIMIT $start, $num");  
// У циклі переносимо результати запиту в масив $postrow  
while ( $postrow[] = mysql_fetch_array($result));  
      
    for($i = 0; $i < $num; $i++)  
    {     
               $name_row = $postrow[$i]['name'];
            $mini_opes_row = $postrow[$i]['mini_opes'];
            $img_row = $postrow[$i]['img'];
            $price_row = $postrow[$i]['price'];
            
            echo "<div class='elem_tovar'>
                    <div class='top_shapka_tov'>
                    <img src='img/$img_row' style='margin:20px 10px 2px 0px; height: 70%; width: 100%;'>
                    <h4><b style='color: red;'>$price_row грн</b></h4>
                    </div>
                    <div class='botoom_shapka_tov'>
                        <br>
                        $name_row
                        <hr>
                        <a href='#'> <img src='img/plus.png' align='middle' style='padding: 5px 5px;'></a> <a href='#' style='text-decoration: none; color: #FFFFFF;'>Посмотреть</a>
                    </div>
                </div>";
                
    }  
echo "<br>";
// Перевіряємо чи потрібні стрілки назад  
if ($page != 1) $pervpage = '<a href= mobile.php?page=1><<</a>  
                               <a href= mobile.php?page='. ($page - 1) .'><</a> ';  
// Перевіряємо чи потрібні стрілки вперед
if ($page != $total) $nextpage = ' <a href= mobile.php?page='. ($page + 1) .'>></a>  
                                   <a href= mobile.php?page=' .$total. '>>></a>';  

// Знаходимо дві найближчі станиці з обох країв, якщо вони є 
if($page - 2 > 0) $page2left = ' <a href= mobile.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';  
if($page - 1 > 0) $page1left = '<a href= mobile.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';  
if($page + 2 <= $total) $page2right = ' | <a href= mobile.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';  
if($page + 1 <= $total) $page1right = ' | <a href= mobile.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>'; 

// Виводимо меню  
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;  
?>

5

Re: Посторінкова навігація на PHP

Дам 2 рекомендації і Вам і тим хто буде заходити у цю тему :)
1. якщо код працює і просто шукати інший та заміняти - не завжди добра ідея
2. оцим ніхто користуватись не буде так як уже всі юзають pdo ;)

6

Re: Посторінкова навігація на PHP

funivan написав:

Дам 2 рекомендації і Вам і тим хто буде заходити у цю тему :)
1. якщо код працює і просто шукати інший та заміняти - не завжди добра ідея
2. оцим ніхто користуватись не буде так як уже всі юзають pdo ;)

Дозволю погодитись по пункту 1.
А що до 2 пункту, то чому так категорично всі => pdo?
Якщо я буду позиціонувати ситуацію зі своєї сторони: PHP-MYSQLi, то я не зустрічав поки що якихось вимог, що необхідно писати в процедурному стилі, чи в обєктноорієнтовному, чи то в PDO... Лише на розсуд програміста, що йому до вподоби.
Якщо у Вас є вагомі аргументи, що потрібно саме в PDO програмувати, був би вдячний якби Ви їх вказали.

7

Re: Посторінкова навігація на PHP

http://code.tutsplus.com/tutorials/pdo- … -net-24059  досить непогана стаття ;) рекомендую
Якщо в загальному ось аргументи:
1. підтримує різні типи баз
2. prepared statements
3 є мапінг з обєктом

8

Re: Посторінкова навігація на PHP

Анатолій написав:

... я не зустрічав поки що якихось вимог, що необхідно писати в процедурному стилі, чи в обєктноорієнтовному, чи то в PDO...

Ні, насправді, такі рекомендації є, і хоча я сходу не маю лінка на такі рекомендації, але вони говорять, що краще вибирати об'єктно-орієнтований стиль.

Що до PDO, то я теж особливо вагомих підстав не знайшов його використовувати, бо тіж prepare statement є і в MySQL. Мабуть PDO підходить краще для інших баз даних, не для MySQL.

Як не дуже вагому перевагу PDO перед MySQL, бачу, хіба що, в іменованих параметрах.

9

Re: Посторінкова навігація на PHP

Що до PDO, то я теж особливо вагомих підстав не знайшов його використовувати,

Тобто, той факт, що prepared statements у PDO автоматично санітизують дані для уникнення ін'єкцій (а mysqli - ні) - це не аргумент? А той факт, що PDO працює з багатьма базами даних, внаслідок чого заміна бд, наприклад, з MySQL на PostgreSQL вийде досить безболісною у разі потреби - також не аргумент? Тоді я вже навіть не знаю, що є аргументом.

Але як би там не було, використовувати функції `mysql_*` не потрібно у будь-якому разі. Deprecated на них поставили не просто так.

10

Re: Посторінкова навігація на PHP

TwiStar написав:

...
Тобто, той факт, що prepared statements у PDO автоматично санітизують дані для уникнення ін'єкцій (а mysqli - ні) - це не аргумент? А той факт, що PDO працює з багатьма базами даних, внаслідок чого заміна бд, наприклад, з MySQL на PostgreSQL вийде досить безболісною у разі потреби - також не аргумент? Тоді я вже навіть не знаю, що є аргументом.

Був би вам вдячний, якщо б ви навели лінк на ресурс, де говориться що mysqli prepared statements не екранують введені дані.

Я в себе перевірив на коротенькому прикладі, то mysqli в мене все екранує як і очікувалось. Можливо є якісь особливі випадки...

Стосовно безболісного переходу, то це не є аргументом для мене, оскільки я не збираюсь переходити на інші БД, а якщо все таки переходитиму, то мій код не складно буде переписати на PDO.

Як на мене, значно кращий варіант - зайвий раз зробити рефакторинг під конкретну БД, якщо в цьому є потреба, ніж роками програвати в продуктивності заради примарних перспектив "а може ми колись захочемо перейти на іншу БД"

Подякували: Анатолій1

11

Re: Посторінкова навігація на PHP

Для всіх наступних обговорень про pdo & mysqli пропоную створити нову тему і там обговорювати. Дякую ;)