получается слишком много запросов, помогите спростить php код:
<?
function tags ($tags_expert) {
$tags_exp = explode(" ", $tags_expert); /* В $tags_expert информация "1 2 3 4" */
foreach($tags_exp as $key => $type) {
$tags_db = "SELECT * FROM `tags` WHERE `tags`.`id` = ".$type."";
$tags_sql = mysql_query($tags_db) or die ("Error in query : $query. -" . mysql_error( ));
$tags_result = mysql_fetch_assoc($tags_sql);
echo "<a href=\"index.php?tags=".$tags_result['id']."\">".$tags_result['tags']."</a>";
}
}
?>
Спустя 27 минут, 59 секунд (15.10.2010 - 19:10) aH6y написал(а):
<?
function tags ($tags_expert) {
$tags_exp = explode(" ", $tags_expert); /* В $tags_expert информация "1 2 3 4" */
foreach($tags_exp as $key => $type) {
$tags_sql = mysql_query("SELECT * FROM `tags` WHERE `tags`.`id` = '".$type."'") or die ("Error in query : $query. -" . mysql_error( ));
$tags_result = mysql_fetch_assoc($tags_sql);
echo '<a href="index.php?tags='.$tags_result['id'].'">'.$tags_result['tags'].'</a>';
}
}
?>
Спустя 39 минут, 53 секунды (15.10.2010 - 19:50) BzenkoSergey написал(а):
Цитата (aH6y @ 15.10.2010 - 16:10) |
<? |
мда... мне количество запросов уменьшить нужно, чтоб SELECT не в цикле был.
Спустя 48 минут, 49 секунд (15.10.2010 - 20:38) aH6y написал(а):
всё равно придёться перебирать массив.
можно выбрать все записи в массив:
а затем перебирать сам массив $tags_result . скорее всего будет быстрее, т.к. будет один запрос, а далее только работа с массивом.
можно выбрать все записи в массив:
$tags_sql = mysql_query("SELECT * FROM `tags`") or die ("Error in query : $query. -" . mysql_error( ));
$tags_result = mysql_fetch_assoc($tags_sql);
а затем перебирать сам массив $tags_result . скорее всего будет быстрее, т.к. будет один запрос, а далее только работа с массивом.
Спустя 9 минут, 8 секунд (15.10.2010 - 20:47) sergeiss написал(а):
Цитата (BzenkoSergey @ 15.10.2010 - 19:42) |
function tags ($tags_expert) { $tags_exp = explode(" ", $tags_expert); /* В $tags_expert информация "1 2 3 4" */ foreach($tags_exp as $key => $type) { $tags_db = "SELECT * FROM `tags` WHERE `tags`.`id` = ".$type.""; $tags_sql = mysql_query($tags_db) or die ("Error in query : $query. -" . mysql_error( )); $tags_result = mysql_fetch_assoc($tags_sql); echo "<a href=\"index.php?tags=".$tags_result['id']."\">".$tags_result['tags']."</a>"; } } |
Упрощаем
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
function tags ($tags_expert)
{
/* В $tags_expert информация "1 2 3 4" */
$tags_expert=str_replace( ' ', ',' , $tags_expert);
$tags_db = "SELECT * FROM `tags` WHERE `tags`.`id` in ($tags_expert)";
$tags_sql = mysql_query($tags_db) or die ("Error in query : $tags_db. -" . mysql_error( ));
while( $tags_result = mysql_fetch_assoc($tags_sql) )
echo '<a href="index.php?tags='.$tags_result['id'].'">'.$tags_result['tags'].'</a>';
}
Спустя 14 минут, 30 секунд (15.10.2010 - 21:02) aH6y написал(а):
sergeiss
точно)
получаеть str_replace быстрее explode ?
точно)
получаеть str_replace быстрее explode ?
Спустя 9 минут, 21 секунда (15.10.2010 - 21:11) sergeiss написал(а):
Цитата (aH6y @ 15.10.2010 - 22:02) |
получаеть str_replace быстрее explode ? |
При чем тут вообще "быстрее"? Алгоритм другой. Через explode будем создавать массив. А str_replace просто заменит пробелы на запятые, чтобы получить список, который потом используем в условии. Если передавать уже готовый список с запятыми (в виде символьной строки), то и эта процедура не нужна будет.
Спустя 6 минут, 44 секунды (15.10.2010 - 21:18) BzenkoSergey написал(а):
Цитата (sergeiss @ 15.10.2010 - 17:47) | ||
Упрощаем ![]()
|
Спасибо помог! +1
Спустя 34 минуты, 1 секунда (15.10.2010 - 21:52) twin написал(а):
Ужос
![sad.gif](http://phpforum.ru/html/emoticons/sad.gif)
Спустя 10 часов, 11 минут, 5 секунд (16.10.2010 - 08:03) Basili4 написал(а):
twin
Цитата (twin @ 15.10.2010 - 22:52) |
Ужос |
Что мне в Вас нравится это аргументированная критика
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
а как не ужос ???
Спустя 2 часа, 13 минут, 46 секунд (16.10.2010 - 10:17) twin написал(а):
Да просто смотреть страшно... echo в функции, в запрос голые данные, or die()...
Куда такая функция применяться будет интересно
Куда такая функция применяться будет интересно
Спустя 11 минут, 41 секунда (16.10.2010 - 10:29) sergeiss написал(а):
twin - а чем тебе не нравится эхо в функции? Я иногда тоже пишу эхо в функции, особенно когда функция формирует нечто такое, что многократно (но с вариациями) будет повторено на странице. Это, по-твоему, говорит о том, что я - "лох ушастый"? ![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
В данном случае сам вопрос от ТС говорит о том, что человек только начал программировать. Ну и пусть разбирается потихоньку... Если ты считаешь, что тут что-то неправильно, то объясни, что же именно (по твоему мнению). Просто сказать "ужос нах" - это проще всего.
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
В данном случае сам вопрос от ТС говорит о том, что человек только начал программировать. Ну и пусть разбирается потихоньку... Если ты считаешь, что тут что-то неправильно, то объясни, что же именно (по твоему мнению). Просто сказать "ужос нах" - это проще всего.
Спустя 4 минуты, 1 секунда (16.10.2010 - 10:33) arvitaly написал(а):
twin,
Данные кстати может и не голые а die может только в отладке у него (вряд ли он собирается пользователям выводить ошибки mysql). Кстати на этом форуме именно так и сделано.
Данные кстати может и не голые а die может только в отладке у него (вряд ли он собирается пользователям выводить ошибки mysql). Кстати на этом форуме именно так и сделано.
Цитата |
twin - а чем тебе не нравится эхо в функции? Я иногда тоже пишу эхо в функции, особенно когда функция формирует нечто такое, что многократно (но с вариациями) будет повторено на странице. Это, по-твоему, говорит о том, что я - "лох ушастый"? |
Каждый программирует как хочет, но разделение код - отображение - это прям как азбукиведи.
Спустя 25 минут, 28 секунд (16.10.2010 - 10:58) sergeiss написал(а):
Цитата (arvitaly @ 16.10.2010 - 11:33) |
но разделение код - отображение - это прям как азбукиведи |
А когда доводим эту идею до абсурда... То получаем один из самых больших маразмов, которые я когда-либо видел и слышал
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Основное, что должно быть (тот самый "азбукиведи") - это максимальная чёткость и логичность скрипта. И если для формирования элемента меню или строки таблицы мне нужна функция, то я её сделаю и весь вывод в браузер (для этого одного элемента) буду делать внутри функции. Потому что это чётко и логично. И ни один апологет MVC не убедит меня в том, что я не прав. Потому что не надо до абсурда всё доводить.
И я не буду для реализации такой хрени изобретать свой шаблонизатор. Хотя бы потому, что View будет всё равно кодом формироваться...
Спустя 1 час, 54 минуты, 10 секунд (16.10.2010 - 12:52) twin написал(а):
sergeiss
Цитата |
Потому что это чётко и логично. И ни один апологет MVC не убедит меня в том, что я не прав. Потому что не надо до абсурда всё доводить. И я не буду для реализации такой хрени изобретать свой шаблонизатор. Хотя бы потому, что View будет всё равно кодом формироваться... |
Ту не в разделении дело вовсе. Я тоже иногда пишу разметку в исполняемых файлах. И тоже ни кто не убедит меня прикручивать шаблонизатор из-за пары тегов <li>
Но тут совсем другое. Если ты выводишь что то в поток, должно быть видно, что ты это делаешь. А если это функция, то она скорее всего находится в другом файле. И вот ты делаешь вывод:
<div><?php tags ('1,2,3') ?></div>что тут делает функция... Считает теги, устанавливает, модифицирует или выводит в поток? Нихрена не понятно. Другое дело через ретурн
<div><?php echo tags ('1,2,3') ?></div>
сразу видно, что результат отправится в поток.
arvitaly
Цитата |
Данные кстати может и не голые |
Вот именно. Начинаем гадать на кофейной гуще - голые не голые.
Если есть запрос, должно быть видно обработку. Это как презерватив в тревожную ночь. Защищаться обязательно. А гдето когдато может быть... это не разговор.
Если есть запрос, должно быть видно обработку. Это как презерватив в тревожную ночь. Защищаться обязательно. А гдето когдато может быть... это не разговор.
Цитата |
а die может только в отладке у него |
Тоже самое... Может не может.
Если пользуешься or die то именно в момент отладки. И тут же уберись за собой. Иначе забудешь и повиснет навсегда. А лучше обертку юзать, тогда гарантия.
И не нужно оправдывать топикстартера и оправдываться самим - мол он мал и не смышлен. Ужос, он и есть ужос. Мне просто некогда было объяснять тогда.
Если пользуешься or die то именно в момент отладки. И тут же уберись за собой. Иначе забудешь и повиснет навсегда. А лучше обертку юзать, тогда гарантия.
И не нужно оправдывать топикстартера и оправдываться самим - мол он мал и не смышлен. Ужос, он и есть ужос. Мне просто некогда было объяснять тогда.
Спустя 39 минут, 4 секунды (16.10.2010 - 13:31) arvitaly написал(а):
Это <li> хороши пока вы один разрабатываете проект. А верстальщик как будет в коде искать их?
Спустя 25 минут, 16 секунд (16.10.2010 - 13:57) sergeiss написал(а):
Цитата (twin @ 16.10.2010 - 13:52) |
что тут делает функция... Считает теги, устанавливает, модифицирует или выводит в поток? Нихрена не понятно. Другое дело через ретурн |
Это зависит еще и от того, КАК ты функцию назвал
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Вот есть у меня такая функция, написана где-то на 2-3-й неделе изучения мной ПХП. Работает до сих пор и я не вижу смысла её менять:
function create_main_menu( $active, $ref, $text )
{
if( $active )
echo ' <td class="menu_active" >';
else
echo " <td class=\"menu_inactive\" onmouseover=\"this.className ='menu_inactive_over';\" onmouseout =\"this.className='menu_inactive';\">
<a href=\"$ref\">";
echo $text;
if( !$active ) echo '</a>';
echo '</td>';
}
Вызывается она так (один из пунктов):
if( $user_abilities->en_users_edit ) // выводим возможность редактирования пользователей
create_main_menu( isset($usersediting), 'usersediting.php', 'Редактирование пользователей');
Далее, если мне надо создать новую строку меню, то я просто добавлю новый вызов функции с нужными параметрами. И я "набираю" меня динамически, в зависимости от имеющихся у данного юзера прав.
Если я захочу изменить ПРЕДСТАВЛЕНИЕ, то мне достаточно только поменять начинку этой функции. В скрипте от этого НИЧЕГО не изменится. Т.е. тут как раз получается хорошее соответствие модели MVC.
И учитывая, что данная фунция нужна только в одном скрипте, она в нем же и определена. Как раз с точки зрения удобства. Максимум, что можно сделать, это с кавычками разобраться
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Вопрос твину: и ты считаешь, что надо всё это усложнить, исходя из чьих-то туманных предствлений?
Спустя 10 минут, 42 секунды (16.10.2010 - 14:07) arvitaly написал(а):
sergeiss,
По сути твоя функция является частью шаблона (наверное и находится там же), т.е. оптимизация шаблона. Ну такая еще куда ни шло - под определение верстальщика подходит.
Верстка + начальное знание php.
Когда то в phpbb - эта задача гораздо хуже решалась...
По сути твоя функция является частью шаблона (наверное и находится там же), т.е. оптимизация шаблона. Ну такая еще куда ни шло - под определение верстальщика подходит.
Верстка + начальное знание php.
Когда то в phpbb - эта задача гораздо хуже решалась...
Спустя 10 минут, 36 секунд (16.10.2010 - 14:18) sergeiss написал(а):
arvitaly - может быть, можно и шаблоном назвать... Это уже зависит от желания человека давать известные ему определения ![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Вся эта шняга находится в скрипте, который формирует меню. И который через инклуд подцепляется там и тогда, где это нужно.
Хочешь назвать шаблоном? Да нет проблем
Мне не жалко. Назови.
Но вот возгласы типа твиновского "ужос" меня удивляют.
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Вся эта шняга находится в скрипте, который формирует меню. И который через инклуд подцепляется там и тогда, где это нужно.
Хочешь назвать шаблоном? Да нет проблем
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Но вот возгласы типа твиновского "ужос" меня удивляют.
Спустя 1 час, 14 минут, 32 секунды (16.10.2010 - 15:32) twin написал(а):
arvitaly
Цитата |
Это <li> хороши пока вы один разрабатываете проект. А верстальщик как будет в коде искать их? |
Да не надо иму они. Если стоит CSS класс, этого вполне достаточно.
sergeiss
Ну как хочешь. Я просто за прозрачность кода ратую всегда. Из функций (методов), которые содержат вывод в теле на мой згляд приемлимы только те, токорые называются display(), потому что это уже стало общепринятой практикой и не вызывает неоднозначных толкований.
У меня в пагинаторе есть функция createMenu()
Так вот она выполняет именно то, что и обязывает название - генерирует меню.
Но не выводит в поток. По этому толкование названия твоей функции ни как не дает однозначного ответа на её предназначение.
Вот открываешь чей-нибудь скрипт, а там адская смесь какого-нибудь такого безобразия:
<?phpи полез в доку или еще хуже (чаще всего) в функции и классы смотреть, как же именно там происходит это create...
tags("1,2,3");
create_main_menu( isset($usersediting), 'usersediting.php', 'Редактирование пользователей');
getReklama();
setFooter();
Спустя 7 минут, 50 секунд (16.10.2010 - 15:40) sergeiss написал(а):
twin - да, я согласен, что не должно быть "адского безобразия"
Но для этого существуют еще и каменты. Вот насчет того, чтобы их писать - это да, надо требовать. Тогда не будет особых вопросов у того, кто потом код читает.
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 минуты, 53 секунды (16.10.2010 - 15:43) twin написал(а):
Комменты комментами, но вот так и без них ясно все
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
<?php
echo create_main_menu( isset($usersediting), 'usersediting.php', 'Редактирование пользователей');
Спустя 3 минуты, 57 секунд (16.10.2010 - 15:47) sergeiss написал(а):
Не знаю... Мне и так ясно, что функция create_main_menu создаёт_главное_меню. Даже без каментов
А каменты только уточняют (в моём случае), для чего именно создаётся данный пункт меню. Хотя это даже и так понятно из параметров. Но всё равно пишу каменты.
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Спустя 3 минуты, 51 секунда (16.10.2010 - 15:51) twin написал(а):
Вот я и говорю про прозрачность. Тебе ясно - естественно. Ты же писал.
А мне не ясно и режет слух, потому что у меня созвучная функция делает совсем другое.
А прозрачность, это когда ясно всем. Комменты это конечно очень хорошо, но и сам код должен быть максимально говорящим.
А мне не ясно и режет слух, потому что у меня созвучная функция делает совсем другое.
А прозрачность, это когда ясно всем. Комменты это конечно очень хорошо, но и сам код должен быть максимально говорящим.
Спустя 18 часов, 18 минут, 42 секунды (17.10.2010 - 10:10) linker написал(а):
twin прав, функция должна только возвращать результат, всегда и везде.
Спустя 29 минут, 26 секунд (17.10.2010 - 10:39) arvitaly написал(а):
Цитата |
twin прав, функция должна только возвращать результат, всегда и везде. |
Так то оно так, да только есть ведь еще такая вещь как процедура, а в php они одно и то же
Спустя 1 час, 42 минуты, 8 секунд (17.10.2010 - 12:21) Guest написал(а):
а если функция(метод) должна вывести большой кусок HTML кода.
Спустя 5 минут, 26 секунд (17.10.2010 - 12:27) arvitaly написал(а):
Цитата |
а если функция(метод) должна вывести большой кусок HTML кода. |
Что значит должна? Кому?
Спустя 23 минуты, 27 секунд (17.10.2010 - 12:50) Guest написал(а):
arvitaly
ну допустим у меня на сайте все элементы интерфейса(инпуты, текстареа, списки) изменены и занимают не одну строчку как стандартные, а побольше. я создал класс, где каждый метод выводит уже готовый измененный HTML нужного элемента.
например $html->show_input(........)
так мне, что теперь для того чтобы кто-то врубился в поток выйдет результат или нет, нужно весь HTML код запихнуть в переменную и вернуть, чтобы потом написать так:
echo $html->show_input(........);
глупость какая-то.
ну допустим у меня на сайте все элементы интерфейса(инпуты, текстареа, списки) изменены и занимают не одну строчку как стандартные, а побольше. я создал класс, где каждый метод выводит уже готовый измененный HTML нужного элемента.
например $html->show_input(........)
так мне, что теперь для того чтобы кто-то врубился в поток выйдет результат или нет, нужно весь HTML код запихнуть в переменную и вернуть, чтобы потом написать так:
echo $html->show_input(........);
глупость какая-то.
Спустя 40 минут, 41 секунда (17.10.2010 - 13:31) arvitaly написал(а):
Эта функция должна вызываться в шаблоне, а внутри ее должен быть код из другого шаблона, и тогда да - можно внутри нее делать echo
Спустя 1 час, 55 минут, 54 секунды (17.10.2010 - 15:27) GRean написал(а):
Цитата (sergeiss @ 16.10.2010 - 10:57) | ||
|
а нельзя ли вместо \" использовать одинарные кавычки?
Спустя 4 минуты, 12 секунд (17.10.2010 - 15:31) Guest написал(а):
GRean
ты не видишь там js , в любом случаи что-то да надо будет экранировать.
но я бы вообще по-другому выводил бы html
ты не видишь там js , в любом случаи что-то да надо будет экранировать.
но я бы вообще по-другому выводил бы html
Спустя 51 минута, 2 секунды (17.10.2010 - 16:22) sergeiss написал(а):
Цитата (GRean @ 17.10.2010 - 16:27) |
а нельзя ли вместо \" использовать одинарные кавычки? |
Не везде. Вот смотри, надо вывести такой HTML код
onmouseover="this.className ='menu_inactive_over';"
Тут, как ни крути, и одинарные, и двойные кавычки. Или одно экранировать, или другое. Я решил делать всё в двойных кавычках, потому что дальше в строке выводится переменная $ref.
И уже если я что-то внутри сделал в двойных кавычках, то и остальное тоже надо так сделать. Чтобы было всё единообразно. Чтобы стиль был определенный.
Спустя 27 минут, 11 секунд (17.10.2010 - 16:49) GRean написал(а):
Цитата (sergeiss @ 17.10.2010 - 13:22) | ||
Не везде. Вот смотри, надо вывести такой HTML код onmouseover="this.className ='menu_inactive_over';" Тут, как ни крути, и одинарные, и двойные кавычки. Или одно экранировать, или другое. Я решил делать всё в двойных кавычках, потому что дальше в строке выводится переменная $ref. И уже если я что-то внутри сделал в двойных кавычках, то и остальное тоже надо так сделать. Чтобы было всё единообразно. Чтобы стиль был определенный. |
ява скрипт сразу не заметил
Спустя 17 часов, 19 минут, 39 секунд (18.10.2010 - 10:09) BzenkoSergey написал(а):
Всем спасибо разобрался