[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите спростить код
BzenkoSergey
Здраствуйте,
получается слишком много запросов, помогите спростить 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)
<?
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>';

}
}

?>

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

Спустя 48 минут, 49 секунд (15.10.2010 - 20:38) aH6y написал(а):
всё равно придёться перебирать массив.

можно выбрать все записи в массив:
 $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 Где-то так получается:

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 ?

Спустя 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)
Цитата (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 Где-то так получается:

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>';

}

Спасибо помог! +1

Спустя 34 минуты, 1 секунда (15.10.2010 - 21:52) twin написал(а):
Ужос sad.gif

Спустя 10 часов, 11 минут, 5 секунд (16.10.2010 - 08:03) Basili4 написал(а):
twin
Цитата (twin @ 15.10.2010 - 22:52)
Ужос


Что мне в Вас нравится это аргументированная критика 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

В данном случае сам вопрос от ТС говорит о том, что человек только начал программировать. Ну и пусть разбирается потихоньку... Если ты считаешь, что тут что-то неправильно, то объясни, что же именно (по твоему мнению). Просто сказать "ужос нах" - это проще всего.

Спустя 4 минуты, 1 секунда (16.10.2010 - 10:33) arvitaly написал(а):
twin,
Данные кстати может и не голые а die может только в отладке у него (вряд ли он собирается пользователям выводить ошибки mysql). Кстати на этом форуме именно так и сделано.

Цитата
twin - а чем тебе не нравится эхо в функции? Я иногда тоже пишу эхо в функции, особенно когда функция формирует нечто такое, что многократно (но с вариациями) будет повторено на странице. Это, по-твоему, говорит о том, что я - "лох ушастый"?


Каждый программирует как хочет, но разделение код - отображение - это прям как азбукиведи.

Спустя 25 минут, 28 секунд (16.10.2010 - 10:58) sergeiss написал(а):
Цитата (arvitaly @ 16.10.2010 - 11:33)
но разделение код - отображение - это прям как азбукиведи

А когда доводим эту идею до абсурда... То получаем один из самых больших маразмов, которые я когда-либо видел и слышал 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 то именно в момент отладки. И тут же уберись за собой. Иначе забудешь и повиснет навсегда. А лучше обертку юзать, тогда гарантия.

И не нужно оправдывать топикстартера и оправдываться самим - мол он мал и не смышлен. Ужос, он и есть ужос. Мне просто некогда было объяснять тогда.

Спустя 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, а ткже от того, как ты её используешь.
Вот есть у меня такая функция, написана где-то на 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

Вопрос твину: и ты считаешь, что надо всё это усложнить, исходя из чьих-то туманных предствлений?

Спустя 10 минут, 42 секунды (16.10.2010 - 14:07) arvitaly написал(а):
sergeiss,

По сути твоя функция является частью шаблона (наверное и находится там же), т.е. оптимизация шаблона. Ну такая еще куда ни шло - под определение верстальщика подходит.

Верстка + начальное знание php.

Когда то в phpbb - эта задача гораздо хуже решалась...

Спустя 10 минут, 36 секунд (16.10.2010 - 14:18) sergeiss написал(а):
arvitaly - может быть, можно и шаблоном назвать... Это уже зависит от желания человека давать известные ему определения smile.gif
Вся эта шняга находится в скрипте, который формирует меню. И который через инклуд подцепляется там и тогда, где это нужно.
Хочешь назвать шаблоном? Да нет проблем smile.gif Мне не жалко. Назови.

Но вот возгласы типа твиновского "ужос" меня удивляют.

Спустя 1 час, 14 минут, 32 секунды (16.10.2010 - 15:32) twin написал(а):
arvitaly
Цитата
Это <li> хороши пока вы один разрабатываете проект. А верстальщик как будет в коде искать их?

Да не надо иму они. Если стоит CSS класс, этого вполне достаточно.

sergeiss
Ну как хочешь. Я просто за прозрачность кода ратую всегда. Из функций (методов), которые содержат вывод в теле на мой згляд приемлимы только те, токорые называются display(), потому что это уже стало общепринятой практикой и не вызывает неоднозначных толкований.

У меня в пагинаторе есть функция createMenu()
Так вот она выполняет именно то, что и обязывает название - генерирует меню.
Но не выводит в поток. По этому толкование названия твоей функции ни как не дает однозначного ответа на её предназначение.

Вот открываешь чей-нибудь скрипт, а там адская смесь какого-нибудь такого безобразия:

<?php  
tags("1,2,3");
create_main_menu( isset($usersediting), 'usersediting.php', 'Редактирование пользователей');
getReklama();
setFooter();
и полез в доку или еще хуже (чаще всего) в функции и классы смотреть, как же именно там происходит это create...

Спустя 7 минут, 50 секунд (16.10.2010 - 15:40) sergeiss написал(а):
twin - да, я согласен, что не должно быть "адского безобразия" smile.gif Но для этого существуют еще и каменты. Вот насчет того, чтобы их писать - это да, надо требовать. Тогда не будет особых вопросов у того, кто потом код читает.

Спустя 2 минуты, 53 секунды (16.10.2010 - 15:43) twin написал(а):
Комменты комментами, но вот так и без них ясно все smile.gif
<?php
echo create_main_menu( isset($usersediting), 'usersediting.php', 'Редактирование пользователей');


Спустя 3 минуты, 57 секунд (16.10.2010 - 15:47) sergeiss написал(а):
Не знаю... Мне и так ясно, что функция create_main_menu создаёт_главное_меню. Даже без каментов 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(........);

глупость какая-то.


Спустя 40 минут, 41 секунда (17.10.2010 - 13:31) arvitaly написал(а):
Эта функция должна вызываться в шаблоне, а внутри ее должен быть код из другого шаблона, и тогда да - можно внутри нее делать echo

Спустя 1 час, 55 минут, 54 секунды (17.10.2010 - 15:27) GRean написал(а):
Цитата (sergeiss @ 16.10.2010 - 10:57)
Цитата (twin @ 16.10.2010 - 13:52)


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>';
}


а нельзя ли вместо \" использовать одинарные кавычки?

Спустя 4 минуты, 12 секунд (17.10.2010 - 15:31) Guest написал(а):
GRean
ты не видишь там 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)
Цитата (GRean @ 17.10.2010 - 16:27)
а нельзя ли вместо \" использовать одинарные кавычки?

Не везде. Вот смотри, надо вывести такой HTML код
onmouseover="this.className ='menu_inactive_over';"

Тут, как ни крути, и одинарные, и двойные кавычки. Или одно экранировать, или другое. Я решил делать всё в двойных кавычках, потому что дальше в строке выводится переменная $ref.
И уже если я что-то внутри сделал в двойных кавычках, то и остальное тоже надо так сделать. Чтобы было всё единообразно. Чтобы стиль был определенный.

ява скрипт сразу не заметил

Спустя 17 часов, 19 минут, 39 секунд (18.10.2010 - 10:09) BzenkoSergey написал(а):
Всем спасибо разобрался
Быстрый ответ:

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