Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > нужна помощь в Mysql запросе


Автор: neoks 9.8.2011, 12:01
Вообщем делал скрипт, делал делал вроде все сделал, но тут заказчик решил немного подправить.
Казалось мелочь жизни, но тут я понял что это не так просто как кажется  smile .

Так вот, все ситуация в том чтобы сортировать строки по дате, казалось бы легко но суть в том что я не могу сортировать напрямую.

Сначала я выделяю из одной таблицы записи со значением id_link=1, и циклом WHILE начинаю парсить, в цикле я выделяю ужу другую таблицу у которой та самая дата которою нужно сортировать.

Вот отрывок кода по старому методу без сортировки.
Код

    $result = $db->select('curer','*',array('WHERE'=>"id_link='$id'",'LIMIT'=>$start_page.','.$news_number)); //Выделяю записи с нужным ID
    $count_curer    = $db->super_select('curer','COUNT(*) as count',array('WHERE'=>"id_link='$id'")); //Подсчитаю количество записей
    
     
    while($rows = $db->get_row($result)){
        
        $row = $db->super_select('pages','*',array('WHERE'=>"id='".$rows['id_pages']."'")); //Вытаскиваю записи у которой есть дата


В голову приходит только один вариант, пихать все в массивы и каким то образом сортировать.
Не знаю что делать, может есть более разумный способ отсортировать строки по дате, подскажите плиз что делать. smile 

Автор: CruorVult 9.8.2011, 12:50
Вам нужно отсортировать данные первой таблицы ('curer') по самой старшей/младшей дате из связанной таблицы('pages')? я так понял?
или может отношения 'curer':'pages' 1:1 ?

Автор: neoks 9.8.2011, 13:26
Мне нужна отсортировать pages, ну как видно я не могу отсортировать в цикле, так как выделяется одна строка в pages с уникальным id.

Я выделяю сначала curer затем в цикле выделяю pages и вывожу данные от pages.

Все было отлично пока заказчик не сказал что нужно отсортировать pages по дате, пришлось ему объяснять что это не так просто но он все равно хочет отсортировать  smile 

Автор: neoks 9.8.2011, 13:53
О и еше одно, не пойму как запустить php файл как делает AJAX только средствами php.
Я имею введу вместо include, пытаюсь сделать file_get_contents но возвращает целый код.

Автор: CruorVult 9.8.2011, 15:04
ничего не понятно!

в каком виде должно всё выглядеть?

Цитата(neoks @  9.8.2011,  13:26 Найти цитируемый пост)
Мне нужна отсортировать pages


каким образом? По каждой записи из 'curer'? или все скопом? тогда что мешает выбрать всё из 'pages'  отсортировав ?

Цитата(CruorVult @  9.8.2011,  12:50 Найти цитируемый пост)
отношения 'curer':'pages' 1:1 ?


Покажите какая связь между таблицами и какай должен быть вывод!

Автор: neoks 9.8.2011, 16:51
Оххх, как тяжело объяснять   smile .
Нужна pages отсортировать по дате, но это просто ORDER BY date если делать выборку pages.

Цитата(CruorVult @  9.8.2011,  15:04 Найти цитируемый пост)
тогда что мешает выбрать всё из 'pages'


Эх, как бы сказать, на сайте есть пользователи у которых свои данные, таблица pages общая для всех.
Так вот, через таблица curer  проходят все данные, в ней хранятся идентификаторы других таблиц.

Поэтому если мне нужна получить количество страниц (pages) от этого пользователя то все проходит через таблицу curer.

А проходит это так.

1. ID пользователя задается в переменную $id.
2. Делается выборка из таблицы curer где id пользователя равен переменной $id и с лимитом 500.
Код

$result = $db->select('curer','*',array('WHERE'=>"id_link='$id'",'LIMIT'=>$start_page.','.$news_number));

3. Начинаем циклом WHILE таблицы cucrer
Код

while($rows = $db->get_row($result))

4. Так как в таблице сurer хранятся только идентификаторы других таблиц и только, то мы выделям таблицу pages с подходящим идентификатором из таблицы curer и выводим на экран все что в этой строке.
 
Код

$row = $db->super_select('pages','*',array('WHERE'=>"id='".$rows['id_pages']."'"));


5. На экране появляется все о этой страницы и также дата.

Даже не знаю может кто поймет, так вот теперь перед мной стоит задача отсортировать таблицу pages по дате.

Автор: neoks 9.8.2011, 17:37
Как выполнить файл php.
Я хочу подгрузить файл на сервере в страницу но при этом готовый результат php.

Например если сделать так
Код

$test = file_get_contents('file.php'); 

$test //Содержит '<? echo"text" ?>'


А если вставить адрес сервера.
Код

$test = file_get_contents('http://url.ru/file.php'); 

$test //Содержит 'text'


Весь нет перерыл не могу найти, не хочу подставлять адрес сервера к то муже не увсех серверах есть возможность использовать адрес.

Автор: нуп 9.8.2011, 18:12
Подключить файл и вызвать нужную функцию  smile 

Автор: neoks 9.8.2011, 18:29
Цитата(нуп @  9.8.2011,  18:12 Найти цитируемый пост)
одключить файл и вызвать нужную функцию

Cуть в том что файл также вызывается через AJAX, не хочу отдельно делать и для AJAX и для PHP.
Вот и стало интересно а можно вообще это сделать через пхп, чтоб сразу приходил результат в виде строки.

Автор: GreatAntique 9.8.2011, 19:17
1) по поводу вызова файла:
Код

echo eval(file_get_contents('file.php'));


2) 
Код

/* составляем запрос */
$q="SELECT p.*
FROM curer c
LEFT JOIN pages p ON c.id_pages=p.id
WHERE id_link={$id}
ORDER BY p.date DESC
LIMIT {$start_page},{$news_number}"; 

$res = $db->query($q); /* достаем pages */

while($row = $db->get_row($res))
{
/* делаете что-то с $row */
/* $row - это ваша page */
}


Проверьте есть ли у вас метод $db->query.

Для кол-ва записей немного изменим запрос
Код

$q="SELECT COUNT(p.*) as count
FROM curer c
LEFT JOIN pages p ON c.id_pages=p.id
WHERE id_link={$id}"; 

Автор: neoks 9.8.2011, 20:19
GreatAntique Ох, наконец, спасибо огромное за помощь  smile  все работает.

А по поводу eval не то.

Вот функция которая возвращает уже готовый результат.

Код

function widget($widget,$mytheme = false){
    
    if(file_exists(ROOT_DIR.'/moduls/user_widgets/'.replase($widget).'/saite_mod.php')){
        /*
        ob_start();
        include(ROOT_DIR.'/moduls/user_widgets/'.replase($widget).'/saite_mod.php');
        $output = ob_get_contents();
        ob_end_clean();
        */
        return @file_get_contents('http://'.$_SERVER["HTTP_HOST"].'/moduls/user_widgets/'.replase($widget).'/saite_mod.php'.($mytheme ? '?mytheme='.replase($mytheme) : ''));
    }
}


Сам файл saite_mod.php содержит такое.

Код

define ( 'ROOT_DIR', '../../..' );
define ( 'SYSTEM_DIR', ROOT_DIR.'/system' );

header ('Content-type: text/html; charset=windows-1251');

require_once (SYSTEM_DIR . '/my_config.php');
require_once (SYSTEM_DIR . '/mysql/is_mysql.php');
require_once (SYSTEM_DIR . '/function.php');
require_once (SYSTEM_DIR . '/templates.php');

.......


Через eval не подходит по двум причинам, во первых результат выводится сразу на экран а не туда куда я захочу, во вторых я использую шаблон и переменных или класов в шаблоне нет  smile 

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

Автор: GreatAntique 9.8.2011, 21:29
Код

ob_start();
echo eval(file_get_contents('file.php'));
$content = ob_get_contents();  
ob_end_clean(); 

echo $content; // в этой переменной содержится весь вывод из файла


Цитата
во вторых я использую шаблон и переменных или класов в шаблоне нет

Что значит "нет"? Выдается ошибка?
Возможно это из-за путей
Код

define ( 'ROOT_DIR', '../../..' );


Но нужно конкретней знать в чем проблема. При eval не подключатюся файлы?

Автор: neoks 9.8.2011, 21:59
Цитата(GreatAntique @  9.8.2011,  21:29 Найти цитируемый пост)
Что значит "нет"? Выдается ошибка?

То и значит, в файле saite_mod.php используется конструкция require_once а значит второй раз уже не будет подключена.
А значит что классов и переменный не создано и возникают ошибки.

Это все должно вывести в шаблон, а шаблон генерируется через функции котором тоже не прописано global, вот такой нюанс  smile 

Как же так объяснить, мне не нужна загружать файл и затем обрабатывать через eval или еше что, мне нужно загрузить уже готовый результат как делает AJAX.

Успешно так справляется file_get_contents если подставлять адрес домена, но если убрать адрес домена то увы  smile 


Автор: GreatAntique 9.8.2011, 22:08
тогда не понятно почему не устраивает include файла smile

Автор: neoks 9.8.2011, 22:42
Охх, сейчас подробно покажу.

Файл index.php
Код

function load_team($name){
    ob_start();
    include($name);
    $output = ob_get_contents();
    ob_end_clean();

    return $output;
}

$result = load_team('team.php');

print '<h3>Файл index</h3>';
print $result;


Файл team.php
Код

<h3>Файл team</h3>
<? print widget('moduls'); ?>
...
конец шаблона



Функция widget
Код

function widget($widget,$mytheme = false){
    
    if(file_exists(ROOT_DIR.'/moduls/user_widgets/'.replase($widget).'/saite_mod.php')){
        return @file_get_contents('http://'.$_SERVER["HTTP_HOST"].'/moduls/user_widgets/'.replase($widget).'/saite_mod.php'.($mytheme ? '?mytheme='.replase($mytheme) : ''));
    }
}


Файл saite_mod.php
Код

<?
print 'результат виджета';
?>


В результате получается то что мне нужна, файл index.php покажет такой результат.
Код

Файл index
результат виджета
...
конец шаблона


Если использовать include вместо file_get_contents то получем такой результат
Код

результат виджета
Файл index
...
конец шаблона


Сейчас file_get_contents почти подходит но не совсем, как я знаю у некоторых серверах например у дешовых может быть отключена вставка адресов и использовать такую функцию можно только внутри сервера.

Даже не знаю что можно придумать, может как то сделать проверку можно или нет и показывать что мов так и так нельзя  smile 

Автор: нуп 9.8.2011, 22:51
Вы что не можете написать функцию которая возвращает html без всяких эвалов и прочего 
Цитата
@file_get_contents('http://'.$_SERVER["HTTP_HOST"]
? smile 

Автор: neoks 9.8.2011, 22:55
Цитата(нуп @  9.8.2011,  22:51 Найти цитируемый пост)
Вы что не можете написать функцию которая возвращает html без всяких эвалов и прочего 

Не понял ?

Автор: GreatAntique 10.8.2011, 08:24
И все-таки вы уверены что вам не подходит include?
Код

function widget($widget,$mytheme = false){
    
    if(file_exists(ROOT_DIR.'/moduls/user_widgets/'.replase($widget).'/saite_mod.php')){
        ob_start();
        include('/moduls/user_widgets/'.replase($widget).'/saite_mod.php');
        $content = ob_get_contents();  
        ob_end_clean(); 
        return $content;
    }
}


Переменная $mytheme будет доступна в saite_mod.
Это ваша функция replase или вы опечатались?

У вас должно получиться так:
Файл index
Файл team
результат виджета
конец шаблона

Автор: CruorVult 10.8.2011, 09:57
Код

SELECT p.* FROM pages p LEFT JOIN curer c ON c.id_pages=p.id WHERE c.id_link=$id ORDER BY p.date LIMIT$start_page,$news_number

?

Автор: neoks 10.8.2011, 10:41
Цитата(GreatAntique @  10.8.2011,  08:24 Найти цитируемый пост)
И все-таки вы уверены что вам не подходит include?

Уверен на 100% что не потходит  smile , лезут ошибки из за того что классы не найдены и переменные, нужно прописывать global что мне не охота  smile 

Пока два варианта, прописывать отдельно для AJAX и отдельно для include, но include значит мне на любой класс или необходимую переменную придется писать global $db,$html,$id,.....

Значит останусь с вариантом @file_get_contents('http://'.$_SERVER["HTTP_HOST"]
Но наверно поставлю проверку на существования этого файла, если нет то буду сообщать что так и так не найден файл  smile 

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

CruorVult
Не совсем понял что значит знак ? но код правильный и рабочий спасибо GreatAntique 

Добавлено через 9 минут и 34 секунды
А блин, не доступна не куки не сессии  smile 
Эх даже не знаю что теперь делать.

Наверно все таки сделаю подгрузку виджетом через AJAX.

Автор: neoks 10.8.2011, 11:04
Все сделал через jquery AJAX, теперь виджеты будут подружатся когда будет загружена страница  smile 
И самое главное что доступны куки и сессии для AJAX.

Все тема закрыта, спасибо всем за внимание.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)