Autor Zpráva
stepanka
Profil *
Ahoj,

měla bych takový dotaz, možná obecný k Ajaxu. Můžu v rámci jedné stránky bez reloadu odeslat a přijmout více požadavků na server?

Mám stránkách vyhledávání před jQuery quickSearch. Najedu na stránku, ta se načte. A nyní pokračuju bez reloadu. Začnu psát vyhledávací slovo. Přes jQuery hlídám počet napsaných znaků a až uživatel napíše znak třetí, odešlu Ajaxem na server POST požadavek v těmito třemi znaky. Tam bude SQL dotaz, který vyhledá produkty s těmito třemi písmeny a odešle výsledek uživateli. A tento výsledek se pak zobrazí v našeptávači u vyhledávání.

Zatím mi to funguje tak, že do vyhledávání nacpu všechny produkty a ony se pomocí jQuery quickSearch třídí. To ale zabírá hodně paměti. Je totiž zbytečné vybírat všechny produkty hned na začátku.

Kód vypadá takto:

<input autocomplete="off" id="searchInput" class="tl-hledat" size="20" type="text" name="vyhledat" value="<?php if (isset($g_vyhledat)) echo htmlspecialchars($g_vyhledat);?>" />
<table class="searchContent">
<?php $sql = mysql_query("SELECT m.nazev as nazev, m.id, f.file
                              FROM produkty m
                              LEFT JOIN produkty_foto f ON f.id_produkt = m.id
                              GROUP BY m.id
                              ORDER BY m.nazev") or die (mysql_error()); ?>
<?php while($row_hledej = mysql_fetch_object($sql)){ ?>
  <tr>
    <?php 
    echo '<td><img src="'.__URL__.'img_produkty/male/'.$row_hledej->file.'"></td>';
    echo '<td><a href="'.ZjistiUrl($row_hledej->id).'" title="'.$row_hledej->nazev.'">'.$row_hledej->nazev.'</a></td>'; 
    ?>							
  </tr>
<?php } ?>
</table>  


JavaScript:

$(document).ready(function(){
  quickSearchInit('searchInput','searchContent');	
});
 
function quickSearchInit(searchInput,searchContent){

	if(document.getElementById(searchInput)){
 	
 		$('input#'+searchInput).quicksearch('table.'+searchContent+' tr');
 		
 		$('input#searchInput').keyup(function(){
 		  $('table.'+searchContent).show();
 		});
		
 		$("body").click(function(e){
		   var target = $(e.target);
  
		   if(!target.is("input#"+searchInput)){
			   if($('table.'+searchContent).is(':visible')){
		 			$('table.'+searchContent).fadeOut(400);
		 	   }
	 	   }
		});	 		
 	}
}


Chtěla bych už do toho SQL dotazu nacpat alespoň první 3 vyhledávané znaky, aby těch výsledků nebylo hned tolik. Asi jako mají vyhledávání na těchto stránkách: http://www.po-bp.cz/
Jde to nějak udělat?
Moc děkuju.
Michel
Profil
Hledá to hned, ale to nebude problém upravit: w3schools.com
stepanka
Profil *
Michel:
Děkuju za reakci, ale to řešení, které uvádíš, už víceméně mám. Že by se mi to chtělo předělávat na XML, abych se dostala do bodu, ve kterém jsem teď, to moc ne :)
Nebo se pletu? Je v těch řešeních nějaký podstatný rozdíl?
Michel
Profil
stepanka:
To jsem nemyslel, abys to předělávala do xml. Já jen, že na řádku 11 v php souboru toho příkladu si nastavíš, od kolika znaků to bude hledat.
if (strlen($q)>0)

Práce s databází je kdyžtak o dvě lekce zpět - tady.
stepanka
Profil *
Michel:
Oba příklady, které jsi uvedl, jsou typu toho mého, tzn. nejdříve vyberu všechny záznamy z databáze a pak se rozhoduju, co s nima. Já bych právě chtěla napasovat prvních pár znaků do toho SQL dotazu, aby už při prvotním vyhledání jich nebylo tolik. Ale to by prohlížeč a server museli neustále spolupracovat, protože uživatel může řetězec měnit. Možná se špatně vyjadřuju, a možná taky chci něco, co ani nejde..
o_O
Profil
stepanka:
protože uživatel může řetězec měnit
Co takto ukládat poslední čas změny řetězce a díky toho pak naplánovat další dotaz na server? V případě změny by se pak odpočet restartoval.
motik
Profil
stepanka:
aby už při prvotním vyhledání jich nebylo tolik.
tak dej do dotazu LIMIT
stepanka
Profil *
o_O:
Děkuji za reakci, ovšem to neřeší můj problém, jak do dotazu nacpat něco, co uživatel na stránce zadal a bez reloadu to má přejít na server, vykonat a výsledek dojít zpátky.

motik:
tak dej do dotazu LIMIT
Ne, to je nesmysl, to by bylo vyhledávání v 10ti (20ti, 30ti,...) produktech, já potřebuju prohledat všechny.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0