AJAX . data ophalen uit mySQL en resultaat weergeven..
Ik heb een form:(ROOT/)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<p>Zoek resultaat: <span id="txtResult"></span></p>
<form class="form_border" action="http://www.site.nl/" method="post">
<p>
<input onkeyup="search(this.value); id="zoekterm" type="text" name="zoekterm" />
<input type="submit" name="zoeken" value="zoek" />
</p>
</form>
<form class="form_border" action="http://www.site.nl/" method="post">
<p>
<input onkeyup="search(this.value); id="zoekterm" type="text" name="zoekterm" />
<input type="submit" name="zoeken" value="zoek" />
</p>
</form>
Die tijdens het typen deze date moet ophalen (voor live resultaat) (ROOT/inc/ajax_zoek.php)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
require_once("initialize.php");
$query=$_GET['q'];
$mysql2 = "SELECT tags FROM nieuws WHERE tags ='".$query."'" ;
$tags = Blog_get::find_by_sql($mysql2);
//get the q parameter from URL
//lookup all hints from array if length of q>0
if (strlen($query) > 0)
{
$result="";
for($i=0; $i<count($tags); $i++)
{
if (strtolower($query)==strtolower(substr($tags[$i],0,strlen($query))))
{
if ($result=="")
{
$result=$tags[$i];
}
else
{
$result=$result." , ".$tags[$i];
}
}
}
}
// Set output to "No Search Results Found" if no results were found
// or to the correct values
if ($result == "")
{
$response="Geen resultaat";
}
else
{
$response=$result;
}
//output the response
echo $response;
?>
require_once("initialize.php");
$query=$_GET['q'];
$mysql2 = "SELECT tags FROM nieuws WHERE tags ='".$query."'" ;
$tags = Blog_get::find_by_sql($mysql2);
//get the q parameter from URL
//lookup all hints from array if length of q>0
if (strlen($query) > 0)
{
$result="";
for($i=0; $i<count($tags); $i++)
{
if (strtolower($query)==strtolower(substr($tags[$i],0,strlen($query))))
{
if ($result=="")
{
$result=$tags[$i];
}
else
{
$result=$result." , ".$tags[$i];
}
}
}
}
// Set output to "No Search Results Found" if no results were found
// or to the correct values
if ($result == "")
{
$response="Geen resultaat";
}
else
{
$response=$result;
}
//output the response
echo $response;
?>
de code van dit alles staat in een .js bestand: (ROOT/js/zoek.js)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function search(tags)
{
var xmlhttp;
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert("Sorry, your browser seems to not support XMLHTTP functionality.");
}
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
document.getElementById("txtResult").innerHTML=xmlhttp.responseText;
}
}
var url="../inc/ajax_zoek.php";
url=url+"?q="+tags;
url=url+"&sid="+Math.random();
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
/*It has been assumed here that ajax_zoek.php is in the same directory.*/
xmlhttp.send(null);
}
{
var xmlhttp;
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert("Sorry, your browser seems to not support XMLHTTP functionality.");
}
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
document.getElementById("txtResult").innerHTML=xmlhttp.responseText;
}
}
var url="../inc/ajax_zoek.php";
url=url+"?q="+tags;
url=url+"&sid="+Math.random();
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
/*It has been assumed here that ajax_zoek.php is in the same directory.*/
xmlhttp.send(null);
}
Ben vrij nieuw met Ajax, en zie het niet zo gauw waarom mijn resultaten niet live worden weergegeven.
Gewijzigd op 05/09/2010 12:28:21 door Www JdeRuijterNL
Je roept 2x xmlhttp.send() aan.
Je moet nog even de tags veilig maken zodat ze niet je URL overhoop gooien met encodeURIComponent:
Je roept nu de search-functie aan bij iedere letter. Het zoeken gaat asynchroon, wat betekent dat het best zou kunnen dat de zoek-aanroep naar "abc" eerder klaar is dan die ervoor "ab", waardoor je zoekresultaten voor "ab" die van "abc" overschrijven. Wat je beter kan doen is je vorige request dan annuleren. (wat ook helpt om je server niet onderuit te halen is om heel even te wachten met zoeken wanneer iemand heel snel letters in aan het typen is)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var xmlhttp;
function search(tags)
{
// stop request als hij nog bezig is
if(xmlhttp && xmlhttp.readyState < 4)
xmlhttp.abort();
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject)
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
else
return;
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
document.getElementById('txtResult').innerHTML = xmlhttp.responseText;
}
}
var url = 'inc/ajax_zoek.php?q=' + encodeURIComponent(tags) + '&sid=' + Math.random();
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
function search(tags)
{
// stop request als hij nog bezig is
if(xmlhttp && xmlhttp.readyState < 4)
xmlhttp.abort();
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject)
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
else
return;
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
document.getElementById('txtResult').innerHTML = xmlhttp.responseText;
}
}
var url = 'inc/ajax_zoek.php?q=' + encodeURIComponent(tags) + '&sid=' + Math.random();
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
Voor die vertraging kan je eventueel deze functie toevoegen, en onkeyup veranderen naar delayedSearch(this.value)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
var delayedSearchTimeout;
function delayedSearch(tags)
{
if(delayedSearchTimeout)
clearTimeout(delayedSearchTimeout);
delayedSearchTimeout = setTimeout(function() {
delayedSearchTimeout = null;
search(tags);
}, 250);
}
function delayedSearch(tags)
{
if(delayedSearchTimeout)
clearTimeout(delayedSearchTimeout);
delayedSearchTimeout = setTimeout(function() {
delayedSearchTimeout = null;
search(tags);
}, 250);
}
edit: Vanaf de pagina root/test.html is root/inc/ajax.php te benaderen via inc/ajax.php, dus zonder de ../.
Gewijzigd op 05/09/2010 12:43:27 door Jelmer -
Jelmer rrrr op 05/09/2010 12:42:08:
[..]
De wijzigingen toegepast maar nog geen resultaat.
Form:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<form class="form_border" action="http://www.overdatum.nl/" method="post">
<p>
<input onkeyup="delayedSearch(this.value);" id="zoekterm" type="text" name="zoekterm" />
<input type="submit" name="zoeken" value="zoek" />
</p>
</form>
<p>
<input onkeyup="delayedSearch(this.value);" id="zoekterm" type="text" name="zoekterm" />
<input type="submit" name="zoeken" value="zoek" />
</p>
</form>
.js:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var delayedSearchTimeout;
function delayedSearch(tags)
{
if(delayedSearchTimeout)
clearTimeout(delayedSearchTimeout);
delayedSearchTimeout = setTimeout(function() {
delayedSearchTimeout = null;
search(tags);
}, 250);
}
function search(tags)
{
// stop request als hij nog bezig is
if(xmlhttp && xmlhttp.readyState < 4)
xmlhttp.abort();
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject)
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
else
return;
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
document.getElementById('txtResult').innerHTML = xmlhttp.responseText;
}
}
var url = '../inc/ajax_zoek.php?q=' + encodeURIComponent(tags) + '&sid=' + Math.random();
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
function delayedSearch(tags)
{
if(delayedSearchTimeout)
clearTimeout(delayedSearchTimeout);
delayedSearchTimeout = setTimeout(function() {
delayedSearchTimeout = null;
search(tags);
}, 250);
}
function search(tags)
{
// stop request als hij nog bezig is
if(xmlhttp && xmlhttp.readyState < 4)
xmlhttp.abort();
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject)
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
else
return;
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
document.getElementById('txtResult').innerHTML = xmlhttp.responseText;
}
}
var url = '../inc/ajax_zoek.php?q=' + encodeURIComponent(tags) + '&sid=' + Math.random();
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
Gewijzigd op 05/09/2010 13:40:17 door www JdeRuijterNL
Wat zegt je browser eigenlijk? In Firefox in Firebug of in het 'extra's' menu de Error Console, of de web inspector in Safari, of de 'Extra's > JavaScript-console' in Chrome?
Jelmer rrrr op 05/09/2010 13:16:16:
Je kan die twee functies niet zo mengen, dat gaat niet werken. Als je de functies los houdt zoals in mijn code gaat dat wel goed. (jouw code heeft nu een oneindige lus trouwens)
Wat zegt je browser eigenlijk? In Firefox in Firebug of in het 'extra's' menu de Error Console, of de web inspector in Safari, of de 'Extra's > JavaScript-console' in Chrome?
Wat zegt je browser eigenlijk? In Firefox in Firebug of in het 'extra's' menu de Error Console, of de web inspector in Safari, of de 'Extra's > JavaScript-console' in Chrome?
dat is opgelost, en heb omdat ik iedere keer geen resultaat kreeg.
dit:
Code (php)
1
2
3
2
3
$query=$_GET['q'];
$mysql2 = "SELECT tags FROM nieuws WHERE tags ='".$query."'" ;
$tags = Blog_get::find_by_sql($mysql2);
$mysql2 = "SELECT tags FROM nieuws WHERE tags ='".$query."'" ;
$tags = Blog_get::find_by_sql($mysql2);
in dit veranderd:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$query=$_GET['q'];
$mysql2 = "SELECT tags ";
$mysql2 .= "FROM nieuws ";
$mysql2 .= "WHERE MATCH(title, post) ";
$mysql2 .= "AGAINST('".$query."') ";
$tags = Blog_get::find_by_sql($mysql2);
$mysql2 = "SELECT tags ";
$mysql2 .= "FROM nieuws ";
$mysql2 .= "WHERE MATCH(title, post) ";
$mysql2 .= "AGAINST('".$query."') ";
$tags = Blog_get::find_by_sql($mysql2);
Catchable fatal error: Object of class Blog_get could not be converted to string in /public/sites/www.overdatum.nl/inc/ajax_zoek.php on line 19
Gewijzigd op 05/09/2010 13:54:26 door www JdeRuijterNL
2. Die foutmelding zou je alleen maar moeten krijgen wanneer je bijvoorbeeld xmlhttp.send() aanroept, maar xmlhttp niet bestaat.
Heb je niet ergens een live voorbeeld?
Jelmer rrrr op 05/09/2010 13:52:48:
1. Let op dat Javascript hoofdletter-gevoelig is.
2. Die foutmelding zou je alleen maar moeten krijgen wanneer je bijvoorbeeld xmlhttp.send() aanroept, maar xmlhttp niet bestaat.
Heb je niet ergens een live voorbeeld?
2. Die foutmelding zou je alleen maar moeten krijgen wanneer je bijvoorbeeld xmlhttp.send() aanroept, maar xmlhttp niet bestaat.
Heb je niet ergens een live voorbeeld?
www.site.nl staat het voorbeeld
Gewijzigd op 05/09/2010 17:07:34 door www JdeRuijterNL
Je script werkt trouwens wel gewoon in Google Chrome, en ook in Firefox zolang ik Firebug maar uit zet. Vreemd dat hij met Firebug aan niet werkt, maar het verbaast me niet echt, aangezien die extensie met de dag onbetrouwbaarder wordt.
Jelmer rrrr op 05/09/2010 14:12:08:
Ik weet niet waarom je hem daar neer hebt gezet, maar die eerste onreadystatechange functie hoort daar niet (en wordt gelukkig overschreven door de tweede).
Je script werkt trouwens wel gewoon in Google Chrome, en ook in Firefox zolang ik Firebug maar uit zet. Vreemd dat hij met Firebug aan niet werkt, maar het verbaast me niet echt, aangezien die extensie met de dag onbetrouwbaarder wordt.
Je script werkt trouwens wel gewoon in Google Chrome, en ook in Firefox zolang ik Firebug maar uit zet. Vreemd dat hij met Firebug aan niet werkt, maar het verbaast me niet echt, aangezien die extensie met de dag onbetrouwbaarder wordt.
Opzich werkt het script bij mij in alle browsers, zelfs met firebug aan.
Dit wilt alleen nog niet helemaal:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php $query=htmlspecialchars($_GET['q']);
$mysql2 = "SELECT tags ";
$mysql2 .= "FROM nieuws ";
$mysql2 .= "WHERE MATCH(title, post) ";
$mysql2 .= "AGAINST('".$query."') ";
$tags = Blog_get::find_by_sql($mysql2);
//get the q parameter from URL
//lookup all hints from array if length of q>0
if (strlen($query) > 0)
{
$result="";
for($i=0; $i<count($tags->tags); $i++)
{
if (strtolower($query)==strtolower(substr($tags->tags[$i],0,strlen($query))))
{
if ($result=="")
{
$result=$tags->tags[$i];
}
else
{
$result=$result." , ".$tags->tags[$i];
}
}
}
}
// Set output to "No Search Results Found" if no results were found
// or to the correct values
if ($result == "")
{
$response="Geen resultaat";
}
else
{
$response=$result;
}
//output the response
echo $response;
?>
$mysql2 = "SELECT tags ";
$mysql2 .= "FROM nieuws ";
$mysql2 .= "WHERE MATCH(title, post) ";
$mysql2 .= "AGAINST('".$query."') ";
$tags = Blog_get::find_by_sql($mysql2);
//get the q parameter from URL
//lookup all hints from array if length of q>0
if (strlen($query) > 0)
{
$result="";
for($i=0; $i<count($tags->tags); $i++)
{
if (strtolower($query)==strtolower(substr($tags->tags[$i],0,strlen($query))))
{
if ($result=="")
{
$result=$tags->tags[$i];
}
else
{
$result=$result." , ".$tags->tags[$i];
}
}
}
}
// Set output to "No Search Results Found" if no results were found
// or to the correct values
if ($result == "")
{
$response="Geen resultaat";
}
else
{
$response=$result;
}
//output the response
echo $response;
?>