Autor Zpráva
candiess
Profil
Dobrej, jelikož jsem asi 3 dny strávil na Internetu přemýšlením jak udělat našpetávač, nyní se s vámi chci o něj podělit..
Index.php
<html>
<body>
<?php include "ajax-script.php";?>
<input type="text" id="texty" onKeyUp="change()" />
<div id="vysledek"></div>
</body>
</html>


ajax-script.php
<script language="javascript" type="text/javascript"> 
<!-- 
//Browser Support Code
function change(){
 var ajaxRequest;  // The variable that makes Ajax possible!
	
 try{
   // Opera 8.0+, Firefox, Safari
   ajaxRequest = new XMLHttpRequest();
 }catch (e){
   // Internet Explorer Browsers
   try{
      ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
   }catch (e) {
      try{
         ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
      }catch (e){
         // Something went wrong
         alert("Your browser broke!");
         return false;
      }
   }
 }
 // Create a function that will receive data 
 // sent from the server and will update
 // div section in the same page.
 ajaxRequest.onreadystatechange = function(){
   if(ajaxRequest.readyState == 4){
      var ajaxDisplay = document.getElementById('vysledek');
      ajaxDisplay.innerHTML = ajaxRequest.responseText;
   }
 }
 
 // Now get the value from user and pass it to
 // server script.
 var hodnota = document.getElementById('texty').value;
 
 if(hodnota=="") {
 document.getElementById('vysledek').innerHTML="";
 } else {
 
 var queryString = "?hodnota=" + hodnota;
 ajaxRequest.open("GET", "ajax-process.php" + 
                              queryString, true);
 ajaxRequest.send(null); }
}
//-->
</script> 


ajax-process.php
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
<?php
include "db.php"; //include databáze
$hodnota = $_GET['hodnota'];
$hodnota = strtolower($hodnota); //zmenšení písma

$query = mysql_query("SELECT * FROM eshop"); //vybrání produktu
while($V = mysql_fetch_array($query)) {
$nazev = $V['nazev'];
$low_nazev = $V['nazev'];
$low_nazev = strtolower($low_nazev);
//Výpis produktu a následné zmenšení písma

/*Tady začíná část našeptáváče*/

//kde začíná řetězec,
$pocet = StrPos(" ". $low_nazev, $hodnota)-1; // Vypíše číslo 
$zacatek = SubStr($nazev,0,$pocet);

//Prostředek řetězce (hodnota v inputu) bude TUČNÁ
$prostredek = $hodnota;

//konec řetězce
$delka_zacatku = StrLen($zacatek);
$delka_prostredku = StrLen($prostredek);
$soucet = $delka_zacatku + $delka_prostredku; 
$delka_nazvu = StrLen($nazev);

$konec = SubStr($nazev,$soucet,$delka_nazvu);

if (StrPos (" ". $low_nazev, $hodnota)) { //Pokud je hodnota v inputu je obsažena v některém produktu
echo $zacatek."<b>".$prostredek."</b>".$konec."<br>";
}
}
?>


Tímto vám chci ulehčit práci a případné vylepšení zcel rád uskutečním, případné dotazy rád vysvětlím..:)
Tento našeptávač byl dělán pro E-shop, tkže kdybyjste ho použili. pozměňte data :)

Ukázka..?
ZDE
a jako příklad tam napište Bambulák nebo zajíc nebo mimi...:)
Radovan789
Profil *
candiess:
Zajímavé a užitečné jen tam nemáš ochranu proti tomu když tam někdo napíše mezeru, hodí to nepříjemný error.
candiess
Profil
jojo..:) a jak to ošetřit..? :D asi funkcí trim() ne.?
Radovan789
Profil *
candiess:
Buď trim a nebo stačí podmínka $text != " ". Ale trim se vtomto příkladu hodí víc.
Keeehi
Profil
Pár poznámek, jak to vylepšit:
1) Z databáze netahat všechny data (*) ale jen požadovaný sloupec (nazev).
2) Selekci položek nedělat až v PHP, ale rovnou v MYSQL.
3) Tvůj script má problémy s diakritikou. Kde nevím, to se mi zkoumat nechce. (viz. "dudlíkem")
4) Celé to obalování tagem <b> by šlo zkrátit na několik málo řádků (1-2), pokud by se použilo preg_replace
5) Koukni na stránku http://www.koval-crew.g6.cz/ajaaax.php, pokud není v adrese hodnota=xxx tak to hodí moře chyb. Chtělo by to ošetřit.
Chamurappi
Profil
Reaguji na candiesse:
alert("Your browser broke!");
To je fakt geniální, napsat anglicky člověku, jehož prohlížeč nepodporuje AJAX, že se mu rozbil prohlížeč.

queryString = "?hodnota=" + hodnota
Pro adresy snad žádná syntaktická pravidla neplatí, že je možné je slepovat jen tak? Plus, ampersand, mřížka a při troše smůly i jakýkoliv znak s diakritikou selžou. Použij encodeURIComponent.

Proč máš ve skriptu, který posílá výstup, <meta> značku s kódováním? Ta funguje jen v obyčejné HTML stránce. Pokud chceš nastavit kódování výstupu (to bys opravdu měl chtít), nastav HTTP hlavičku s charsetem.

Pochopil jsem správně, že pokaždé vytáhneš z DB úplně všechna slova a pak teprve zkoumáš, která vyhovují?
candiess
Profil
jop, hoši překvapili ste mě, mužu se jit zahrabat..:((
Radovan789
Profil *
candiess:
Dobré je že jsi dostal chuť něco sám vyřešit a navrhnout, těd to stačí vylepšovat jak psal Keeehi a Chamurappi, potom ve finální verzi to bude špička.
Keeehi
Profil
Chamurappi:
Proč máš ve skriptu, který posílá výstup, <meta> značku s kódováním? Ta funguje jen v obyčejné HTML stránce. Pokud chceš nastavit kódování výstupu (to bys opravdu měl chtít), nastav HTTP hlavičku s charsetem.
Za to on moc nemůže, neboť je to automaticky vkládaná reklama endorou.

6) Chtělo by to výsledek načítat do nějaké oblasti nad stránkou, aby ti celá neposkakovala. Např. do absolutně pozicovaného divu.
7) Aby ten našeptávač vlastně plnil účel, mělo by se nechat kliknout na to, co našeptává.
8) Vypisovat třeba maximáně 10 návrhů. Pak by to chtělo řadit výsledky z databáze podle počtu zobrazení daného výrobku, oblíbenosti výrobku, nebo počtu nákupů výrobku.
8b) Toto už by bylo složitější a není to nutnost. Ještě by z toho našeptávaného seznamu šly odebrat opakující se podobné výrobky (liší se jen v barvě, atd.)
TomasJ
Profil
Keeehi:
Ta reklama se dá jednoduše obejít ;) prostě po načtení stránky si načteš poslední div na stránce a tomu vymažeš obsah... (JS)
Keeehi
Profil
TomasJ:
1) Tím porušuješ pravidla.
2) Jako výstup který přijde do JS se to opravdu moc nehodí. Pokud bych si nechal poslat jako výstup {"a":1,"b":2,"c":3,"d":4,"e":5} a něco se mi před to automaticky vložilo, asi by to moc nefungovalo, jak by mělo. Tady by bylo potřeba se s podporou hostingu domluvit na nějaké výjimce pro tento script.
Radovan789
Profil *
TomasJ:
Jenže porušíš pravidla a smažou ti obsah webu bez předchozího upozornění. Nedoporučuji.
Leomato
Profil
Ako mam tento skript upraviť aby mi pridával príspevky do shoutboxu nie pomocou GET ale POST
ajaxRequest.open("GET", "ajax-process.php" + 
Darker
Profil
TomasJ:
Když už, existují daleko inteligentnější metody, než ta tvoje, které nepotřebují žádný Javascript.

Keeehi:
Za to on moc nemůže, neboť je to automaticky vkládaná reklama endorou.
Doporučuju předávat data mezi ajaxem a stránky jako text/plain. Pak tam endora nic nevloží. A na endoře doporučuju používat UTF kódování. Takové kódování totiž endora používá.
Leomato:
Jsi vedle jak ta jedle, založ si vlastní vlákno. A skus jQuery, mě se osvědčilo.
Leomato
Profil
dik
Darker
Profil
Není zač.
TomasJ
Profil
Keeehi:
a něco se mi před to automaticky vložilo
Endora má reklamu před </html>(úplně na konci dokumentu) - Oprava: před </body> (Darker máš pravdu)
Darker
Profil
TomasJ:
Ne. Před </body>. Věř mi.
TomasJ
Profil
Darker:
Ano, promiň, máš pravdu. Nevšiml jsem si toho </body> na konci řádku...

EDIT: Jedinné proč jsem si vůbec toto řešil, je, že reklama není nastylovaná. Kdyby byla jako u IC, tak nic nepíšu. Jenže ty jejich škaredě modré odkazy...
Vím že se to dá nastylovat do <body> v CSS, ale i tak je špatně umístěna...
candiess
Profil
Endora už mi právě smázla pár webu, tk tam tu reklamu nechavam..:((
BTW: kdybych měl kodování v utf-8, jak tam mam psat normální text s diakritikou, aby to nepsalo otazníky..?
Darker
Profil
Kdybys to měl všude stejné, tak ti to fungovat bude.
Keeehi
Profil
candiess:
To s UTF-8 je nejspíše kec. Ještě jsem neviděl server, který by vyžadoval soubory v UTF-8. Jde o to, mít kódování všude stejně nastavené a i soubor v tom kódování uložit. Jestli to je UTF-8 nebo třeba iso-8859-2 je šmafuk, hlavně aby to všude sedělo.
Darker
Profil
To je pravda. Evidentně to ale máš pokaždé jinak, tak jsem ti poradil s tím něco udělat. A pokud nepoužiješ UTF, budeš mít paznaky v reklamě, na to vem jed.
candiess
Profil
Jojo, vim co myslíte...seberu všechny tyhle návrhy a zkusím to předělat, pak zde zkusím (pokud admin dovolí) hodit novou verzi pro volné užití..:-)
Chamurappi
Profil
Reaguji na Keeehiho:
Za to on moc nemůže, neboť je to automaticky vkládaná reklama endorou.
Endora vkládá samotnou <meta> značku bez reklamy a jen do souboru, který se načítá AJAXem? V mateřské stránce deklarace kódování chybí (nebo aspoň chyběla, když jsem koukal).


Reaguji na candiesse:
Neházej flintu do žita, jako základ to je dobré a to, že ses o něj chtěl podělit, je chvályhodné.

mužu se jit zahrabat
Zahrabat, opravit a zase vyhrabat :-)
__construct
Profil
candiess:
toto je dosť zlý krok:
$hodnota = $_GET['hodnota']; Pozri si niečo o bezpečnosti DB a escapovaní. Vlastne by si mal celkovo popracovať na svojich znalostiach čo sa týka DB; kopec tých operácií z reťazcami zvládne MySQL

Chamurappi:
… napsat anglicky člověku, …
Výstižnejšie by bolo „napísať tri anglické slová“ :-)
imploder
Profil
Keeehi:
Ještě jsem neviděl server, který by vyžadoval soubory v UTF-8. Jde o to, mít kódování všude stejně nastavené a i soubor v tom kódování uložit. Jestli to je UTF-8 nebo třeba iso-8859-2 je šmafuk, hlavně aby to všude sedělo.
Ještě to musí sedět v HTTP hlavičce, kterou posílá server. A pokud je tvrdohlavý a posílá napevno třeba iso-8859-2 nebo utf-8, tak s tím kódování nastavené v HTML nic nenadělá (kódování v HTTP hlavičce má přednost. Server vyžadující soubory v utf-8 není kec. Je to sice zlý server, ale existovat klidně může.
imploder
Profil
candiess:
Endora.cz ale kódování neposílá, takže můžeš použít kódování jaké chceš. Dej mezi tagy <head> takovýto meta tag:
<meta http-equiv="content-type" content="text/html; charset=utf-8">

To říká prohlížeči, že stránka je v kódování utf-8. Takže se už nikomu nebudou zobrazovat otazníky.

<head> se dává před <body>, viz http://www.jakpsatweb.cz/zaklady-html.html

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: