[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод данных, сортировка по имени/дате
Гость_sherilyn
Возникла проблема с выводом данных. Данные то выводяться , но только три записи. Кнопки внизу вперед, назад не отображаються. Что тут сделал не правильно? И как лучше внеднить еще сортировку?
PHP
<?php 
$postnums
=3;// число записей на странице
if($_GET[vor])  {$start=$_GET[limit]+$postnums;}
if(
$_GET[back]) {$start=$_GET[limit]-$postnums;}
if(!
$start){$start=0;}
//чтение из базы данных
$tablename="units";
$sql="SELECT * FROM $tablename ORDER BY datum DESC LIMIT ".$start." , ".$postnums;
$link=mysql_connect("localhost","root","pass");
mysql_select_db("projects"$link);
$result=mysql_query($sql$link);

for (
$i=0;$i<mysql_num_rows($result);$i++)
{
    
$massive[$i]=mysql_fetch_array($result); 
     
    }
// определение числа записей
$sql1="SELECT COUNT(*) FROM $tablename WHERE check=1";
$result1=mysql_query($sql1,$link);
$max=mysql_result($result1,0,0);
?>
<html>
<body>
бла бла бла
<?php
    
    
for ($i=0;$i<count($massive);$i++)
    {
        echo 
"<table width=\"600\" height=\"150\" border=\"0\"><tr><td><img src='".$massive[$i]['pic']."' alt=".$massive[$i]['names']."></td><td width=\"10\" height=\"178\" background=\"pics/liniys.png\" ></td><td>".$massive[$i]['text']."</td></tr></table><br><br>";
                
        }
    
//ссылки назад , вперед
    
echo "<table border=\"0\" width=\"600\"><tr><td align=\"left\">";
    if(
$start>=$postnums)     {echo "<a href=\"".$PHP_SELF."?limit=".$start."&back=1 \">Назад</a>";}
    echo 
"</td><td align=\"right\">";
    if(
$start+$postnums<$max) {echo "<a href=\"".$PHP_SELF."?limit=".$start."&vor=1 \">Вперед</a>";}
    echo 
"</tr></table>";
    
?><




Спустя 13 минут, 25 секунд (19.05.2009 - 22:15) jetistyum написал(а):
ты не ошибся с именованием элементов массива?
PHP
if($_GET[vor])  {$start=$_GET[limit]+$postnums;}
if(
$_GET[back]) {$start=$_GET[limit]-$postnums;}


Спустя 15 минут, 52 секунды (19.05.2009 - 22:30) jetistyum написал(а):
IT IS REALY REALY BAAAD WAY:

PHP
for ($i=0;$i<mysql_num_rows($result);$i++)
{
    
$massive[$i]=mysql_fetch_array($result); 
     
}


вместо этого :

PHP
$res mysql_query();
$data = array();
while (
$r mysqk_fetch_array()){
   
$data[] = $r;
}


Спустя 3 минуты, 9 секунд (19.05.2009 - 22:34) twin написал(а):
Заем функцию гонять в цикле? А если много записей... Перегреется и взорвется biggrin.gif
PHP
$count mysql_num_rows($result)
for (
$i=0;$i $count$i++)
{
    
$massive[$i]=mysql_fetch_array($result); 
     
}

Спустя 39 минут, 9 секунд (19.05.2009 - 23:13) sherilyn написал(а):
Цитата (jetistyum @ 19.05.2009 - 23:30)
IT IS REALY REALY BAAAD WAY:

PHP
for ($i=0;$i<mysql_num_rows($result);$i++)
{
    $massive[$i]=mysql_fetch_array($result); 
     
}


вместо этого :

PHP
$res = mysql_query();
$data = array();
while ($r = mysqk_fetch_array()){
   $data[] = $r;
}

PHP
$result=mysql_query($sql$link);
$massive = array();
while (
$result mysql_fetch_array()){
   
$massive[$i] = $result;
}


Страница загружается, но не выводится ничего.

Спустя 9 минут, 33 секунды (19.05.2009 - 23:22) jetistyum написал(а):
ну а ошибки тут телепаты искать будут???
поставь error_reporting(E_ALL);
вначале скрипта
поставь mysql_error() вывод..... после запроса.. может в запросе проблема.
сделай дамп полученных переменных. сделай дамп запроса перед запуском, чтобы посмотреть как он у тебя сформировался..
ну что же Вы совсем мозг свой не включаете....

Спустя 8 минут, 44 секунды (19.05.2009 - 23:31) sergeiss написал(а):
Цитата (sherilyn @ 19.05.2009 - 23:13)
PHP
$result=mysql_query($sql, $link);
$massive = array();
while ($result = mysql_fetch_array()){
   $massive[$i] = $result;
}


Страница загружается, но не выводится ничего.

Готов поспорить, что именно в таком виде и был вставлен текст в скрипт, без добавления хотя бы одной буковки, говорящей о выводе данных wink.gif Кто "за" это предположение?

Спустя 1 минута, 56 секунд (19.05.2009 - 23:33) sherilyn написал(а):
Цитата (jetistyum @ 20.05.2009 - 00:22)
ну а ошибки тут телепаты искать будут???
поставь error_reporting(E_ALL);
вначале скрипта
поставь mysql_error() вывод..... после запроса.. может в запросе проблема.
сделай дамп полученных переменных. сделай дамп запроса перед запуском, чтобы посмотреть как он у тебя сформировался..
ну что же Вы совсем мозг свой не включаете....

да я уверен просто что там дурость какая-то. сижу ищу ошибки. mysql_error() это край для меня. Ща буду пробовать.

Спустя 2 минуты, 23 секунды (19.05.2009 - 23:35) jetistyum написал(а):
sergeiss
в этом коде есть скрытая CAPTCHA - защита от бота - копипастера wink.gif

Спустя 10 минут, 47 секунд (19.05.2009 - 23:46) sherilyn написал(а):
jetistyum
Спасибо за то что заставил сделать mysql_error(). Проблема была вот тут
PHP
$sql1="SELECT COUNT(*) FROM $tablename WHERE check=1";

убрал WHERE check=1 и проявились кнопки вперед и назад. Параметр check, раньше пользовал, поэтому и остался.

Вообщем теперь вопрос остался только, как грамотно реализовать сортировку по дате и названию.

[update]

сделаю скрипт посмотрим что выйдет.

Спустя 4 минуты, 53 секунды (19.05.2009 - 23:51) sergeiss написал(а):
Цитата (sherilyn @ 19.05.2009 - 23:46)
Вообщем теперь вопрос остался только, как грамотно реализовать сортировку по дате и названию.

В ORDER BY укажи, по каким полям и в какой последовательности нужна сортировка - и будет тебе счастье.

Спустя 4 минуты, 27 секунд (19.05.2009 - 23:55) jetistyum написал(а):
SQL
ORDER BY `date` [ASC|DESC]

ORDER BY `name` [ASC|DESC]

Спустя 9 минут, 49 секунд (20.05.2009 - 00:05) jetistyum написал(а):
и еще замечания по коду
старайся избегать запуска функций в цикле


популярнее:

PHP
while($i<count($a)){
//dosomething
}

предположим массив $a содержит 1000 элементов, значит цикл пройдет 1000 раз и
1000 раз будет запущена функция count();

делаем иначе
PHP
$c count($a) ;

while(
$i<$c){
//dosomething
}

но уже гораздо легче ....
а тем более когда ты в цикле подсчитываешь каждый раз кол-во строк результата запроса.


2. строки принято КОНКАТЕНИРОВАТЬ с переменными, а не "смешивать"....

PHP
//wrong:
$query "SELECT * FROM $tablename WHERE 1";
//correct:
$query 'SELECT * FROM '.$tablename.' WHERE 1';

даже тут .. в подсветке синтаксиса сразу видно что это не просто строка.. а переменная..


3. если ключ массива это строка, то нужно обращаться к этому элементу, указывая, что это строка

PHP
//wrong 
$i $_GET[vor];
//correct 
$i $_GET['vor'];


ошибка непременно возникнет при обращении к элементу массива чье имя совпадает с константой, либо если ключ элемента массива содержит пробел


Спустя 1 час, 1 минута, 30 секунд (20.05.2009 - 01:07) sherilyn написал(а):
jetistyum
Спасибо за замечания.

Цель такая, чтобы выдавала 3 записи на странице и если нажимаешь "по дате" то, должно все быть по дате + чтобы можно было листать страницы. Аналогично "по имени". На данном этапе в скрипте работает только листание страниц
Код
PHP
$postnums=3;// число записей на странице
if($_GET['vor'])  {$start=$_GET['limit']+$postnums;}
if(
$_GET['back']) {$start=$_GET['limit']-$postnums;}
if(!
$start){$start=0;}
//чтение из базы данных
require("connect.php");
$sql="SELECT * FROM " .$tablename;
$sql.= $sql2;
$sql.=" LIMIT ".$start." , ".$postnums; 
if($_GET['sort']=="names" OR $_GET['sort']=="datum")
{
    $sql2=" ORDER BY ";
    $sql2.= $_GET['sort'];
    $sql2.=" DESC ";
}
$result=mysql_query($sql, $link);
$count = mysql_num_rows($result);
for ($i=0;$i < $count; $i++)
{
    $massive[$i]=mysql_fetch_array($result); 
     
}
// определение числа записей
$sql1="SELECT COUNT(*) FROM $tablename";
$result1=mysql_query($sql1,$link);
$max=mysql_result($result1,0,0);
?>
<html>
<body>
<?php 
// ссылки "по имени" и "по дате"
        echo "<table border=\"0\" width=\"600\"><tr><td align=\"left\">";
    echo "<a href=\"".PHP_SELF."?sort=names \">По имени</a>";
    echo "</td><td align=\"right\">";
    echo "<a href=\"".PHP_SELF."?sort=datum \">По дате</a>";
    echo "</tr></table>";
    ?>
              <?php
    $count1
=count($massive);
    for ($i=0;$i<$count1;$i++)
    {

        echo "<table width=\"600\" height=\"150\" border=\"0\"><tr><td><img src='".$massive[$i]['pic']."' alt=".$massive[$i]['names']."></td><td width=\"10\" height=\"178\" background=\"pics/liniys.png\" ></td><td>".$massive[$i]['text']."</td></tr></table><br><br>";
                
        
}
    //ссылки назад , вперед
    echo "<table border=\"0\" width=\"600\"><tr><td align=\"left\">";
    if($start>=$postnums)     {echo "<a href=\"".$PHP_SELF."?limit=".$start."&back=1 \">Назад</a>";}
    echo "</td><td align=\"right\">";
    if($start+$postnums<$max) {echo "<a href=\"".$PHP_SELF."?limit=".$start."&vor=1 \">Вперед</a>";}
    echo "</tr></table>";

Спустя 1 час, 23 минуты, 46 секунд (20.05.2009 - 02:31) jetistyum написал(а):
ну начинай следующий этап, или ты ждешь подробных инструкций?smile.gif)

Спустя 10 часов, 25 минут, 5 секунд (20.05.2009 - 12:56) Guest написал(а):
Да вообщем то я написал, просто не могу понять почему не работает.
может задание $_SERVER['PHP_SELF'] не так?
в строке у меня пока что только либо сортировка либо листание.

Спустя 8 часов, 58 минут, 45 секунд (20.05.2009 - 21:54) sherilyn написал(а):
Сделал сортировку. Все достаточно банально оказалось
PHP
if($_GET['sort']=="names" OR $_GET['sort']=="datum")
{
    $sql2=" ORDER BY ";
    $sql2.= $_GET['sort'];
    $sql2.=" DESC ";
    
}
$sql="SELECT pic, datum, names, text FROM " .$tablename;
$sql.= $sql2;
$sql.=" LIMIT ".$start." , ".$postnums;


Последняя проблема это то чтобы они(сортировка и листание) вместе работали.

Спустя 23 минуты, 21 секунда (20.05.2009 - 22:18) sergeiss написал(а):
Только одно примечание: этот код не защищен от SQL-инъекций!

Спустя 33 минуты, 29 секунд (20.05.2009 - 22:51) twin написал(а):
Этот код не защищен от возможных варнингов, а со шприцами там нормально всё.

Спустя 7 минут, 12 секунд (20.05.2009 - 22:58) sherilyn написал(а):
Над защитой буду работать когда скрипт работать будет.

Дык подскажете может. Как сделать чтобы и сортировка и листинг работали одновременно.
Как запомнить php?sort=names или php?limit=2&vor=1 ?

Спустя 6 минут, 51 секунда (20.05.2009 - 23:05) twin написал(а):
Просто всё в кучу собрать не получается?
Код
php?sort=names&limit=2&vor=1

Спустя 3 минуты, 36 секунд (20.05.2009 - 23:09) sherilyn написал(а):
Цитата (twin @ 21.05.2009 - 00:05)
Просто всё в кучу собрать не получается?
Код
php?sort=names&limit=2&vor=1

дело в том что когда нажимаешь допустим "По дате" в строке имеем php?sort=datum далее я жму назад и появляеться php?limit=0&vor=1, sort=datum не сохраняется.

Спустя 9 часов, 27 минут, 5 секунд (21.05.2009 - 08:36) glock18 написал(а):
В сессию клади текущий критерий сортировки:
PHP
session_start(); // это должно быть перед первым использованием переменной $_SESSION

if (isset($_GET['sort']))
$_SESSION['sort-column'] = $_GET['sort'];


а для выбора сортировки используй уже не $_GET['sort'], а переменную в сессии

PHP
$sql2.= $_SESSION['sort-column'];


2 sergeiss:
Кстати, не факт, что не защищен в sql-injection))) В пхп может быть включен magic_quotes. Тогда как раз и не нужно экранировать кавычки.

2 sherilyn:
sergeiss прав. просто перед вставкой в запрос нужно проверять не включен ли magic_quotes (кажется, функцией get_magic_quotes_npc), и, если выключен, переменные в запросе заключать в mysql_real_escape_string.

Это, конечно, если у тебя там функции из стандартной php_mysql.dll используются. Если другая какая либа, то должен быть свой механизм.

Спустя 1 час, 20 минут, 57 секунд (21.05.2009 - 09:57) twin написал(а):
С сессией не совсем удачный вариант. Её нужно будет как то обнулять, иначе так и будет висеть сортировка. На всех страницах.
Ну а просто в ссылки прописать этот параметр, почему нельзя то?

Кстати, на счет кавычек. Внимательно посмотрите, там же условие на входе у него. Какие кавычки если возможны только два варианта. А вот то, что обращение напрямую к массиву $_GET, это не есть прекрасно.

Спустя 2 часа, 12 минут, 38 секунд (21.05.2009 - 12:10) glock18 написал(а):
2 twin:
$start тоже, очевидно, передается через $_GET. И он и является дырой в безопасности.

Цитата
С сессией не совсем удачный вариант. Её нужно будет как то обнулять, иначе так и будет висеть сортировка. На всех страницах.
Ну а просто в ссылки прописать этот параметр, почему нельзя то?


Так тоже можно. Одно Но то, что во все ссылки не всегда есть возможность дописать параметр.

Кстати, согласен с тобой в том случае, если как раз сортировку нужно обнулять. А на случай, если необходимо запомнить ее, лучше использовать сессию. Хотя, возможно, это чисто гипотетический случай.

Спустя 2 часа, 9 минут, 43 секунды (21.05.2009 - 14:19) sherilyn написал(а):
Цитата (twin @ 21.05.2009 - 10:57)
С сессией не совсем удачный вариант. Её нужно будет как то обнулять, иначе так и будет висеть сортировка. На всех страницах.
Ну а просто в ссылки прописать этот параметр, почему нельзя то?

Кстати, на счет кавычек. Внимательно посмотрите, там же условие на входе у него. Какие кавычки если возможны только два варианта. А вот то, что обращение напрямую к массиву $_GET, это не есть прекрасно.

А можно узнать как в ссылки это прописывать. Я пытался не получилось. Как при первом заходе на страницу сделать так чтобы он сразу сортировал по дате? Исходя из моего кода. Сессию попробую вечером.

Спустя 19 минут, 34 секунды (21.05.2009 - 14:39) sergeiss написал(а):
Вот смотри.
Проверяем, было ли что-то передано насчет сортировки, и если да, то берем это значение. Иначе - выставляем сортировку по дате. И всё в одной строке.
PHP
$sort=isset( $_GET['sort'] ) ? $_GET['sort'] : 'datum';

Спустя 1 день, 1 час, 34 минуты, 2 секунды (22.05.2009 - 16:13) Guest написал(а):
Цитата (sergeiss @ 21.05.2009 - 11:39)
Вот смотри.
Проверяем, было ли что-то передано насчет сортировки, и если да, то берем это значение. Иначе - выставляем сортировку по дате. И всё в одной строке.
PHP
$sort=isset( $_GET['sort'] ) ? $_GET['sort'] : 'datum';

не работает ни в случае с сессией не, в этом случае..

Спустя 38 минут, 55 секунд (22.05.2009 - 16:52) sherilyn написал(а):
как это значение в адресную строчку поместить?

Спустя 58 минут, 46 секунд (22.05.2009 - 17:51) sherilyn написал(а):
Цитата (glock18 @ 21.05.2009 - 09:36)
В сессию клади текущий критерий сортировки:
PHP
session_start(); // это должно быть перед первым использованием переменной $_SESSION

if (isset($_GET['sort']))
$_SESSION['sort-column'] = $_GET['sort'];


а для выбора сортировки используй уже не $_GET['sort'], а переменную в сессии

PHP
$sql2.= $_SESSION['sort-column'];


2 sergeiss:
Кстати, не факт, что не защищен в sql-injection))) В пхп может быть включен magic_quotes. Тогда как раз и не нужно экранировать кавычки.

2 sherilyn:
sergeiss прав. просто перед вставкой в запрос нужно проверять не включен ли magic_quotes (кажется, функцией get_magic_quotes_npc), и, если выключен, переменные в запросе заключать в mysql_real_escape_string.

Это, конечно, если у тебя там функции из стандартной php_mysql.dll используются. Если другая какая либа, то должен быть свой механизм.

в случае с сессиями каким образом должна выглядеть ссылка?
исходя из кода
для сортировки
PHP
echo "<a href=\"".$PHP_SELF."?sort=names \">По имени</a>";

для листания
PHP
echo "<a href=\"".$PHP_SELF."?limit=".$start."&back=1& \">Назад</a>";

Спустя 16 часов, 57 минут, 1 секунда (23.05.2009 - 10:48) glock18 написал(а):
Цитата
в случае с сессиями каким образом должна выглядеть ссылка?

Получится, что ссылки на листание будут такие же как и без нее. То есть просто указать страницу(ну или элемент с которого начинать).

Ссылка на сортировку должна иметь параметр sort.

В скрипт надо вставить то, что я тебе выше давал.

Спустя 11 часов, 11 минут, 33 секунды (23.05.2009 - 21:59) sherilyn написал(а):
обошел сессию ,причем успешно.
вписал в ссылку на листание параметр sort
PHP
echo "<a href=\"".$PHP_SELF."?sort=".$_GET['sort']."&limit=".$start.


при листании он сохраняется.

Спустя 10 дней, 23 минуты, 11 секунд (3.06.2009 - 22:22) sherilyn написал(а):
Вообщем настало время защиты. как данный скрипт лучше защитить от sql-инъекций?
я сделал вот так
PHP
require('conf.php');
error_reporting(E_ALL);
$sql3='SELECT * FROM '.$tablename1.'';
$result2=mysql_query($sql3$link1);
$postnums=mysql_result($result20'postnums');// число записей на странице
if($_GET['vor'])  {$start=$_GET['limit']+$postnums;}
if(
$_GET['back']) {$start=$_GET['limit']-$postnums;}
if(!
$start){$start=0;}
//чтение из базы данных
require("connect.php");
if(
$_GET['sort']=="datum")
{
    
$sql2=" ORDER BY ";
    
$sql2.=$_GET['sort'];
    
$sql2.=" DESC ";
    
}
elseif(
$_GET['sort']=="names"){
    
$sql2=" ORDER BY ";
    
$sql2.=$_GET['sort'];
    
$sql2.=" ASC ";
}

$sql='SELECT pic, datum, names, text FROM '.$tablename.'';
$sql.= $sql2;
$sql.=' LIMIT '.$start.' , '.$postnums;

Спустя 10 часов, 8 минут, 43 секунды (4.06.2009 - 08:31) glock18 написал(а):
Оберни все переданные из $_GET и $_POST переменные в mysql_real_escape_string, если у тебя выключены magic_quotes в настройке php. Если включены, то php сам будет экранировать \ и '.

Если переменная численная, то можешь привести ее к нужному типу, например
PHP
$_GET['intvar'] = intval($_GET['intvar']);

Спустя 3 дня, 6 часов, 2 минуты, 14 секунд (7.06.2009 - 14:33) sherilyn написал(а):
glock18
спс вам.

Еще вопрос, как грамотно стили заставить работать в скрипте? класс в таблице прописываю и он не работает.

Спустя 5 часов, 29 минут, 54 секунды (7.06.2009 - 20:03) glock18 написал(а):
не совсем понял вопрос.

В общем случае, стили подключаются 4 способами:
1. В head'e помещаешь теги в тег ( smile.gif ) <style>
2. Подключать стили при помощи @import.
3. Указывать стили для элемента при помощи атрибута style:
HTML
<a style="text-decoration: none;">Link</a>


4. подключается в head css файл при помощи тега link.

определяешь в стилях класс (не касается 3 варианта) так:

HTML
.myclass
{
color: #ff0000;
font-weight: bold;
}


с теге ставишь:

HTML
<div class="myclass">Красный текст</div>


Если все сделал так, но не работает, то:
1. проверь подключился ли файл (для 4 варианта), и правильный ли путь прописан к нему.

2. проверь, чтобы в определении класса не было ошибки - тогда стили не будут применены.

Спустя 46 минут, 41 секунда (7.06.2009 - 20:50) sherilyn написал(а):
спасибо за урок css но дело не в этом..

я вставляю скрипт в файл и оброменяю его div, там же прописываю стиль
PHP
<div align="center" class="myclass">
        <?php
        require
('proj1in.php');

в это случае текст не меняется.
второй способ как я пробовал. в самом скрипте прописать в таблице. вот
PHP
<?php 
       
echo "<table border=\"0\" width=\"600\" class=\"myclass\"><tr><td align=\"left\">";
       
    echo 
"<a href=\"".$PHP_SELF."?sort=names \">По имени</a>";
    echo 
"</td><td align=\"right\">";
    echo 
"<a href=\"".$PHP_SELF."?sort=datum \">По дате</a>";
    echo 
"</tr></table>";
    

Спустя 1 час, 38 минут, 30 секунд (7.06.2009 - 22:28) glock18 написал(а):
В студию описание класса в css и хтмл, который на выходе получаешь.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.