JS/Ajax And PHP sort

critrate

Registered
Здравейте.Не знаех къде да пусна темата,защото е свързана и с PHP и с js/ajax.

Идеята ми при изкарване на новина как да направя динамично сортиране на новините.Примерно попринцип ми се показват по дата,но ми се ще да направя отгоре няколко иконки и да може всеки да си ги сортира примерно по име, по рейтинг,по дата,по брой преглеждания, и това да става динамично(без презареждане на страницата).Знам как да си го направя с PHP,но не знам как да го направя с js/ajax.Гледах уроци,но видях само за сортиране само чрез js/ajax без PHP ...

Благодаря ви предварително.
 
Първото ще го погледна като се прибера у нас,но да питам трябва да изтегля Jquery sortable от сайта , безплатен ли е ? има ли някакъв лиценз?

А второто видях,че не работи и така и не са открили работещ вариант
 
Има много начини, може само с джаваскрипт, може и с ajax.

Щом така исакш да е, просто при натискане на съответния бутон правиш евент който праща към сървъра информация че искаш да ти даде резултатите под определен ред (дата, брой преглеждания или тн), пхп ти прави заявката обработва резултатите в хтмл вариант (може и направо да ги връща и в js да ги обработваш в хтм вариант) и след акто върне резултатите ги апендваш във дом дървото върху старите.

Не е сложно, въпрос на подход и начин на мислене е как ще си го направиш.

Давам ти само лесни за направа идеи как аз бих го направил, код няма да ти пиша нямам време сега.
 
като каза радко се сетих и за друго при зареждане на страница извиличаш всички данни сортирани по различен начин това обаче са много заявки и не ми се вижда удачно но всичко което си извлякъл държиш в различни дивове сортирани по различен начин и с Jquery при кликане скрива сегашния и на негово място идва новия див с различен сортинг.
Но както казах по горе това е неудачно а и сайта става в пъти по тежък : )
 
Аз се чудя дали ще стане с масив да изброя видовете сортиране на иконките ще е с a href="$sort[1]" и като клинеш заявката се сменя и където е ORDER BY id ще стане примерно ORDER BY date

?
 
critrate каза:
Аз се чудя дали ще стане с масив да изброя видовете сортиране на иконките ще е с a href="$sort[1]" и като клинеш заявката се сменя и където е ORDER BY id ще стане примерно ORDER BY date

?

Май мислиш точно като мене :D при четеното на горният пост си мислих за този вариянт и си мисля, че е доста удачно тъй като няма да пишеш 10000 заявки, но с js/ajax не мога да ти помогна :D
 
Като се прибера в нас ще ти дам един пример без да засягаш заявката отново и отново. ;) След 2-3ч. ще се прибера.

Междувременно можеш да кажеш в какъв вид изкарваш датата.
 
датата я записвам с time(),но при изкарване я обработвам и се изкарва така "преди 1 минута" , "Преди 3 дена" , "Преди 2 години" и така нататък

Благодаря за помоща :)
 
Извинявам се малко за закъснението:

main.php
PHP:
<?php
session_start(); #стартираме си сесийка

#сортираме според това как искаме
function build_sort($key) {
	return function ($a, $b) use ($key) {
		return strnatcmp($a[$key], $b[$key]); #възходящ ред, за низходящ използвай strnatcmp($b[$key], $a[$key])
	};
}

#връзваме се със MySQL
$ln = mysql_connect('localhost', 'root', '') or die (mysql_error());
mysql_select_db('test', $ln);

if(!isset($_SESSION['checkit']) || $_SESSION['checkit'] != true){ #проверяваме дали вече сме направили заявка

	#ако не сме, правим си заявката като изкарваме всички данни
	$query = mysql_query("SELECT * FROM `critrate`") or die(mysql_error());

	if(mysql_num_rows($query) > 0){ #проверяваме дали има някакви данни
		
		#ако има вкарваме в един празен масив
		$data = array();
		$i = 0;
		while($row = mysql_fetch_assoc($query)){
			
			#оформяме си масива според нуждите(според това как функцията горе иска)
			$data[$i]['name'] = $row['name'];
			$data[$i]['rating'] = $row['rating'];
			$data[$i]['date'] = $row['date'];
			$data[$i]['visits'] = $row['visits'];
			
			$i++;
		}
		$_SESSION['data'] = $data; #прикрепяме масива в една сесия, за да не се налага повторно извикване
		$_SESSION['checkit'] = true; #ако всичко е, както трябва отбелязваме, че е направена вече заявка
	}
	else{
		#ако няма записи, задаваме, че не е мината заявка и изкарваме на екрана, че няма данни
		$_SESSION['checkit'] = false;
		die("There's no data in the table!");
	}
}

if(isset($_POST['sort_by']) && is_int(+$_POST['sort_by']))
{
	switch($_POST['sort_by'])
	{
		case 1: usort($_SESSION['data'], build_sort('name')); break; #сортираме според името
		case 2: usort($_SESSION['data'], build_sort('rating')); break; #сортираме според рейтинга 
		case 3: usort($_SESSION['data'], build_sort('date')); break; #сортираме според датата
		case 4: usort($_SESSION['data'], build_sort('visits')); break; #сортираме според посещенията
		
		default: die("Incorrect type!"); break; #ако получим некоректни данни, изкарваме грешка
	}
	
	print_r($_SESSION['data']); #извеждаме на екрана резултатите
}
?>

Имай предвид, че аз сортирам по UNIX_TIMESTAMP, затова ако трябва след сортирането си форматирай датата.


index.php
HTML:
<!DOCTYPE html>
<html>
	<head>
		<title>Critrate Sort</title>
		<meta charset="UTF-8">
		<script src="http://code.jquery.com/jquery-1.8.2.js" type="text/javascript"></script>
	</head>
	
	<body>
		<form>
			Sort by:
			<select class="sort">
				<option value="1">Name</option>
				<option value="2">Rating</option>
				<option value="3">Date</option>
				<option value="4">Visits</option>
			</select>
		</form>
		
		<script type="text/javascript">
		$('.sort').change(function(){
			$.ajax({
				type: "POST",
				url: "main.php",
				data: "sort_by=" + $('.sort').attr('value'),
				success: function(data){
					$('#result').html(data);
				}
			});
		});
		</script>
		
		<div id="result"></div>
	</body>
</html>


Надявам се да съм помогнал :)


Между другото, можеш да ползваш и SQL_CACHE, за да предотвратиш повторна заявка.

П.П. Това print_r($_SESSION['data']); си го оправи да си извеждаш данните, както искаш, защото аз набързо го направих, колкото да го тествам.
 
Благодаря много.След малко ще го изпробвам,защото сега правя промени по дизайна.

само това не ти разбрах как да избегна повторна заявка?

+1 Благодаря много.Работи отлично
 
В момента съм го направил да прави само една заявка, като сортирането не го правя посредством заявката, а посредством PHP. Вадя всички резултати и след това си използвам масива със записите от базата данни, както си искам. Когато е пълен масива отбелязвам, че е минала заявка и повече не пускам заявки.
Оттам през AJAX подавам на метода POST вида сортировка и според това, кой номер е правя build_sort() функцията, която си върши това, което трябва.

А иначе SQL_CACHE ще е доста по-ефикасен от моите врътки, понеже, ако се добави нов запис в момента, докато не се изтрие сесията и не се направи нова заявка няма да се отрази новия запис, докато при SQL_CACHE си вкарва в кеша данните от заявката и след това не праща нова заявка, а взима от паметта данните, които са записани в кеша. Но разликата е там, че ако има нови записи, то ще си ги добави към кеша и ще обнови масива.

PHP:
SELECT SQL_CACHE * FROM `table`

така се прави SQL_CACHE.

Още един бонус е, че при много записи работи доста бързо(все пак вади от паметта, а не прави заявка).
 

Горе