imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 23.07.2003, 22:43     # 1
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
PHP & MySQL вопросы

вопросов наверно будет много, поэтому так назвал тему.
пока окончательно созрел только один.
есть база. надо вывести определенное количество строк (например 10) начиная с определенной (номер ее записан в переменной) вверх по таблице. Если че-нить непонятно, попробую объяснить.
d0rM03D вне форума  
Старый 23.07.2003, 23:16     # 2
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
добавление:
лучше это делать через цикл - в переменную поочереди чтобы записывались строки как массив и можно было бы в этом же цикле выводить определенные поля строки. Т.е вся проблема в функции доступа к базе.
d0rM03D вне форума  
Старый 23.07.2003, 23:21     # 3
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
SELECT * from table WHERE id<$i-1 AND id>$i+1
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 23.07.2003, 23:49     # 4
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
или
SELECT * from table LIMIT $id-1, 3;
(выбрать 3 ряда начиная с предстоящего номеру $id)

кстати, по моему Стас перепутал порядок - то что он написал выберет все ряды кроме $id и двух рядом с ним.
Aeon вне форума  
Старый 24.07.2003, 12:00     # 5
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
Вчера, пока не прочитал ваши предложения придумал свое решение с помощью функции:
Цитата:
mysql_Result($result,$i,field)
Msql_Result отображает поле из возвращенной записи. Параметры - идентификатор результата, возвращенный функцией msql(), целое число, которое является индексом записи, которую нужно просмотреть и имя поля.
Однако оно доволно запутанно, поэтому хочу спосить, какой из данных отрывков кода будет функционировать быстрее
Это с помощью вашего запроса:
PHP код:
$request "SELECT ntext, ntitle, date_format(ndate,'%e.%m.%y') as ndate1 FROM news"/*Вынемаемвсю таблицу*/
$result mysql_query($request);
$strnum=((mysql_numrows($result))-(10*$archivepage+3)); /*Такая уж у меня замысловатая формула формирования строки от которой происходит начало отсчета*/
$request "SELECT ntext, ntitle, date_format(ndate,'%e.%m.%y') FROM news LIMIT $strnum, 10"
$result mysql_query($request);
if (!
mysql_error()) {
/*Цикл вынимающий строку, как массив с числовым индексом*/
while ($row mysql_fetch_row($result)) {
    print (
"$row[1].$row[2].$row[0]);
    }
}
else {
print ("
Ошибка БД с запросе".$request. "MySQL пишет ". mysql_error());} 
Это мой вариант:
PHP код:
$request "SELECT ntext, ntitle, date_format(ndate,\'%e.%m.%y\') as ndate1 FROM news ORDER BY ndate DESC"/*Также приодиться вынимать всю таблицу*/
$result mysql_query($request);
if (!
mysql_error()) {
for (
$i=0;$i<=9;$i++) {/*Цикл вынимающий 10 строк начиная со $strnum*/
$strnum=((mysql_numrows($result))-$i-(10*($archivepage-1)+3));
print (
mysql_Result($result,$strnum,1).mysql_Result($result,$strnum,2).mysql_Result($result,$strnum,0));
if (
$strnum==0) {break;} /*При достижение начала таблице цикл прервется*/
}
else {
print (
"Ошибка БД с запросе".$request"MySQL пишет "mysql_error());}

Во втором варианте еще хорошо, что когда цикл достигнет начала базы то перестанет выводить строки на экран.
В первом же варианте плохо, что вывод идет вниз по таблице начиная с определенной строчки и если вывод начать с несуществующей строки, то ничего не выйдет. Так будет при выводе последних записей.
Я уже сам запутался.

Кстати, как проверить за сколько сгенерировалась страница? Я тогда сам и посмотрю что быстрее...
d0rM03D вне форума  
Старый 24.07.2003, 12:11     # 6
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
вынимать каждый раз всю таблицу? чувак, да у тебя база шлёпнется при хоть сколько-то значительной нагрузке как котёнок с двадцатого этажа, даже и не мявкнет.

во первых. правильно узнать количество записей с минимальной затратой времени и ресурсов можно так:
PHP код:
$request "SELECT count(id) FROM news";
$result mysql_query($request);
$total mysql_result($result0); 
топаем дальше. насколько я понял тебе нужна система навигации между страничками, показывая десять записей на страничку. проще всего это делается примерно так:
PHP код:
$archivepage = (!empty($archivepage)) ? $archivepage 0// номер странички
$offset $archivepage 10// умножаем номер странички на количество записей на страничке чтобы получить начальную строку.
$sql "SELECT ntext, ntitle, date_format(ndate,'%e.%m.%y') as ndate1 FROM news LIMIT $offset,10"// опять даём количество записей на страничке
$result mysql_query($sql) or die(mysql_error()); // посылаем запрос, убиваем скрипт в случае ошибки, показывая ошибку.
while($row mysql_fetch_row($result))
{
    print (
$row[1].$row[2].$row[0]);
}
// теперь заботимся о навигации
// используем переменную total успешно добытую так как я показал раньше.
if($archivepage 0)
{
    echo 
'<a href="archive.php?archivepage='.($archivepage-1).'" title="Previous 10 records">Previous 10</a>';
}
if(((
$archivepage+1)*10) <= $total)
{
    echo 
'<a href="archive.php?archivepage='.($archivepage+1).'" title="Next 10 records">Next 10</a>';

по крайней мере мне показалось что ты именно это пытаешься сделать из твоего кода... или нет?

Последний раз редактировалось Aeon; 24.07.2003 в 12:37.
Aeon вне форума  
Старый 24.07.2003, 19:12     # 7
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
Ой, да.. сорри
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 24.07.2003, 19:56     # 8
medved2002
Guest
 
Сообщения: n/a

Кстати LIMIT дает не всегда желаемый результат.
 
Старый 24.07.2003, 20:07     # 9
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
Aeon
Спасибо.Да именно это я и хотел сделать.
Меня тоже смущало постоянно вынимать базу, еще раз спасибо что подсказал как сделать.
Кстати, допустим у меня есть 18 записей, когда я перейду на вторую страницу архива $offset==20, как поведет себя скрипт - он же будет запршивать строки начиная с 20? Нормально себя ведет...

Последний раз редактировалось d0rM03D; 24.07.2003 в 22:12.
d0rM03D вне форума  
Старый 24.07.2003, 20:09     # 10
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
medved2002
будь чуть-чуть многословнее пожалуйста
что это за случаи?
d0rM03D вне форума  
Старый 24.07.2003, 20:36     # 11
medved2002
Guest
 
Сообщения: n/a

http://www.mysql.com/doc/ru/LIMIT_optimisation.html
 
Старый 24.07.2003, 23:59     # 12
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
d0rM03D
нет, смотри на то как я сделал навигацию - если ты показываешь 20 записей на страницу и у тебя всего 18 записей, у тебя просто не будет показан линк на следующую страницу.
Aeon вне форума  
Старый 25.07.2003, 05:46     # 13
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
Aeon
Я малость переделал этот кусок кода, мне надо чтобы показывались ссылки на все страницы архива. В последствие хочу сделать сортировку и ссылки на строки( да что тут говорить, это будет скрипт новостей), на новости по месяцам года.
Вот как я сделал.
PHP код:
$pnumbs=(mysql_result($result0))/10+1//Подсчитываем число архива
settype($pnumbs,integer);                //Отбрасываем дробную часть 
Кстати, есть какая-нибудь функция для отбрасывания дробной части, я потому что тут извратился.
А вот и вывод самих ссылок:
PHP код:
print Архив новостей";
$counter=1;
    while ($counter<=$pnumbs)            //Формирование ссылок на страницы архива
    {
        print "
<a href=/newsarchive.php?archivepage=".$counter.">".$counter."</a> | ";
        $counter++;
    } 

Последний раз редактировалось d0rM03D; 25.07.2003 в 05:54.
d0rM03D вне форума  
Старый 25.07.2003, 07:04     # 14
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
есть, конечно. floor() для округления вниз, ceil() для округления вверх. делаем так
PHP код:
$ct ceil($total/10); // округляем вверх
for($i 1$i <= $ct$i++)
{
    echo 
'<a href=/newsarchive.php?archivepage='.$i.'>'.($i).'</a>';
    if((
$i) < $ct// если это не последняя запись, показываем разделитель.
    
{
        echo 
' | ';
    }

Aeon вне форума  
Старый 03.08.2003, 17:45     # 15
d0rM03D
::VIP::
 
Аватар для d0rM03D
 
Регистрация: 14.11.2001
Адрес: In dA HAus
Сообщения: 1 007

d0rM03D Нимб уже пробиваетсяd0rM03D Нимб уже пробивается
Почти дописал систему администрирования новостей. ВОзник следующий вопрос.
Как лучше с точки зрения безопасности и быстродействия организовать эту систему:
1. Все скрипты (удаление, изменение etc.) засунуть в главный файл администрирования. В этом файле сделать ссылки на самого себя и в зависимости например от $QUERY_STRING или других переменных переданных GET'om уже производить действия.
2. Отличается от предыдущего что код скриптов удаления, изменения новостей etc. находиться в отдельных файлах. И в зависимости все от того же вставляеться includ'om.
3. Ссылки из основного файла будут вести не на самого себя, а на те скрипты передавая различные параметры все тем же Get'om.

Или стоит сделать как-то иначе?
И параллельно овзникает вопрос о том как лучше ограничить доступ к этим скриптам? .htaccess, сессии, coockies, 401?
d0rM03D вне форума  
Старый 03.08.2003, 18:00     # 16
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
d0rM03D
imho, зависит от личного предпочтения больше чем от чего-либо другого. Для безопасности один вариант ничем не предпочтительнее другого - могу посоветовать лишь все переменные настроек (как то, паролями для базы, итд.) положить в отдельный файл вне www-директории и использовать include() с абсолютной тропой для того чтобы его включать - таким образом даже при какой-нибудь грубой ошибке никто не сможет получить прямой доступ к файлу с паролями и чувствительной инфой. Все запросы от пользователей хорошо бы проверять на соответствие ожиданиям - не очень хорошо давать им возможность как-то ввести произвольный исполнимый код в систему... но это уже зависит от обстоятельств. А так, флаг в руки. Тут где-то пробегала ссылочка от Programmer`a на книжку "Secure PHP Development", советую скачать и прочитать, там много чего интересного и полезного...

А насчёт того держать в одном файле или в нескольких, по моему просто зависит от твоего личного удобства. В более сложных проектах (особенно если над проектом работает несколько человек) бывает удобнее разбить код на отдельные файлы - легче разбираться что отвечает за что. Если проект небольшой, можно всё сделать и одним файлом - главное всегда хорошо комментировать секции чтобы через пять месяцев вернувшись к коду можно было разобратся что к чему.

А для прямого ограничения доступа в Апаче ничего проще и удобнее .htaccess/.htpasswd ещё не придумано. Сессии и кукисы, это хорошо если ты пишешь свою собственную систему опознания и регистрации пользователей, но если нужно лишь ограничить доступ на страничку администрации, обычно .htaccess/.htpasswd хватает с головой.

Последний раз редактировалось Aeon; 03.08.2003 в 18:05.
Aeon вне форума  
Старый 03.08.2003, 21:03     # 17
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
Цитата:
ничего проще и удобнее .htaccess/.htpasswd ещё не придумано
проще ? удобнее ? не согласен. надежнее - да.
RaZEr вне форума  
Старый 04.08.2003, 00:11     # 18
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
RaZEr
а что по твоему проще или удобнее? .htaccess/.htpasswd я могу настроить чтобы закрыть любую директорию на сервере меньше чем за пять минут... покажи мне какую-то систему которую я могу поставить так-же быстро... Я не говорю что это самый лёгкий метод для новичка, но если знаешь как это делается, он действительно самый быстрый и наименее трудоёмкий.
Aeon вне форума  
Старый 04.08.2003, 00:21     # 19
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
Я говорю применительно к сайтам ... нередко нужно ограничить доступ к script.php?action=modify, но разрешить к script.php?action=show ... так вот тут твой htpasswd отдыхает ...
RaZEr вне форума  
Старый 04.08.2003, 00:28     # 20
Aeon
::VIP::
 
Аватар для Aeon
 
Регистрация: 28.06.2002
Адрес: neverwhere
Сообщения: 1 166

Aeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собойAeon Имеются все основания чтобы гордиться собой
RaZEr
пфф... я почти всегда разбиваю административную и клиентскую секции на независимые скрипты... потому что если что-то криво написано в твоей системе (тьфу-тьфу-тьфу, не к ночи будь сказано), человек сразу получает возможность всё редактировать... а так, если оно в отдельном скрипте в отдельной директории под .htpasswd, всё таки безопасность выше... о чём собственно и спрашивал наш уважаемый d0rM03D.... (а мы с тобой тут в оффтоп ударились )
Aeon вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 23:24.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.