Zoekscript
Ik heb op internet al gezocht of ik iets met de xmlhttp.open iets kan doen maar dat werkt niet.....
http://www.w3schools.com/ajax/ajax_aspphp.asp
Kun je ons een query tonen die langzaam is en ook het resultaat van dezelfde query met EXPLAIN ervoor?
Wellicht kan ik je dan advies/tips geven om het sneller te maken.
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
45
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
45
<?php
$SQL = "SELECT * FROM Hoofd_Table
JOIN Locatie_Table ON (Locatie_Table.Locatie_ID=Hoofd_Table.Locatie_ID)
JOIN Mensen_Table ON (Mensen_Table.Mensen_ID=Hoofd_Table.Mensen_ID)
JOIN RegistratieType_Table ON (RegistratieType_Table.TypeRegistratie_ID=Hoofd_Table.TypeRegistratie_ID)
WHERE (
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q1) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq1) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter ) . "%'
)
AND
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q2) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq2) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter ) . "%'
)
AND
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q3) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq3) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter ) . "%'
)
)
ORDER BY Hoofd_Table.WeekDag DESC";
?>
$SQL = "SELECT * FROM Hoofd_Table
JOIN Locatie_Table ON (Locatie_Table.Locatie_ID=Hoofd_Table.Locatie_ID)
JOIN Mensen_Table ON (Mensen_Table.Mensen_ID=Hoofd_Table.Mensen_ID)
JOIN RegistratieType_Table ON (RegistratieType_Table.TypeRegistratie_ID=Hoofd_Table.TypeRegistratie_ID)
WHERE (
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q1) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq1) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter ) . "%'
)
AND
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q2) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq2) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q2_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q2_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q2_Hoofdletter ) . "%'
)
AND
(
Hoofd_Table.WeekDag LIKE '%" . mysql_real_escape_string( $q3) . "%' OR
Hoofd_Table.Datum LIKE '%" . mysql_real_escape_string( $datumoq3) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q3_Kleineletters) . "%' OR
Mensen_Table.Mensen_Naam LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter ) . "%' OR
Mensen_Table.Mensen_Inlognaam LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter ) . "%' OR
RegistratieType_Table.RegistratieType_Type LIKE '%" . mysql_real_escape_string( $q3_Eerste_hoofdletter ) . "%' OR
Locatie_Table.Locatie_Naam LIKE '%" . mysql_real_escape_string( $q3_Hoofdletter ) . "%'
)
)
ORDER BY Hoofd_Table.WeekDag DESC";
?>
Toevoeging op 24/01/2012 12:26:09:
De variable $q komt uit het zoekscript.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$Splitsing = explode(" ", $q);
$q1 = $Splitsing[0];
$q2 = $Splitsing[1];
$q3 = $Splitsing[2];
$q1_Eerste_hoofdletter = (ucfirst($q1));
$q1_Hoofdletter = (strtoupper($q1));
$q1_Kleineletters = (strtolower($q1));
$q2_Eerste_hoofdletter = (ucfirst($q2));
$q2_Hoofdletter = (strtoupper($q2));
$q2_Kleineletters = (strtolower($q2));
$q3_Eerste_hoofdletter = (ucfirst($q3));
$q3_Hoofdletter = (strtoupper($q3));
$q3_Kleineletters = (strtolower($q3));
?>
$Splitsing = explode(" ", $q);
$q1 = $Splitsing[0];
$q2 = $Splitsing[1];
$q3 = $Splitsing[2];
$q1_Eerste_hoofdletter = (ucfirst($q1));
$q1_Hoofdletter = (strtoupper($q1));
$q1_Kleineletters = (strtolower($q1));
$q2_Eerste_hoofdletter = (ucfirst($q2));
$q2_Hoofdletter = (strtoupper($q2));
$q2_Kleineletters = (strtolower($q2));
$q3_Eerste_hoofdletter = (ucfirst($q3));
$q3_Hoofdletter = (strtoupper($q3));
$q3_Kleineletters = (strtolower($q3));
?>
Ik heb even je code tussen code tags gezet, dit maakt alles veel beter leesbaar, gelieve in het vervolg hier rekening mee houden![/modedit]
Gewijzigd op 24/01/2012 12:31:31 door kees Schepers
Waarom is er gekozen voor Like en geen full-text? Draait alles onder InnoDB?
Ik denk dat geheel ook wel beter genormaliseerd kan worden..
Code (php)
1
2
3
4
5
2
3
4
5
<?php
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
?>
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
?>
Als ik in mijn database zoek op "username LIKE 'erwin'", of "username LIKE 'ERWIN'" of "username LIKE 'ErWiN'", het record met als username 'Erwin' wordt altijd wel gevonden. Ofwel..... case insensitive.
1 SIMPLE RegistratieType_Table ALL PRIMARY NULL NULL NULL 3 Using temporary; Using filesort
1 SIMPLE Hoofd_Table ALL NULL NULL NULL NULL 2831 Using where; Using join buffer
1 SIMPLE Mensen_Table eq_ref PRIMARY PRIMARY 4 Tabel.Hoofd_Table.Hoofd_Table... 1
1 SIMPLE Locatie_Table eq_ref PRIMARY PRIMARY 4 Table.Hoofd_Table.KHoofd_Table... 1 Using where
Erwin H op 24/01/2012 13:15:49:
Hmmm, heb je wel getest of dit nodig is:
Als ik in mijn database zoek op "username LIKE 'erwin'", of "username LIKE 'ERWIN'" of "username LIKE 'ErWiN'", het record met als username 'Erwin' wordt altijd wel gevonden. Ofwel..... case insensitive.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
?>
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Eerste_hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Hoofdletter) . "%' OR
Hoofd_Table.Opmerking LIKE '%" . mysql_real_escape_string( $q1_Kleineletters) . "%' OR
?>
Als ik in mijn database zoek op "username LIKE 'erwin'", of "username LIKE 'ERWIN'" of "username LIKE 'ErWiN'", het record met als username 'Erwin' wordt altijd wel gevonden. Ofwel..... case insensitive.
Daar heb je een heel goed punt. Standaard is de collatie latin1_swedish_ci <-- ci staat voor Case Insensitive. Dus dan klopt jouw stelling en zou voor de opmerking 1 criteria genoeg zijn.
Ik heb de case insensitive even geprobeerd maar ik snap niet helemaal wat je precies bedoelt? Als er Piet in mijn tabel staat dan komt de regel alleen naar voren als ik $q1_Eerste_hoofdletter gebruik met de Like...
Als je op een kolom in mysql de collect naam_*_ci zet dan is KeEs hetzelfde als KEES of KEEs. Dat geldt ook voor Like. Dan heb je alleen WHERE name LIKE "%KeEs%" nodig ;-)
ALTER TABLE Hoofd_Table ADD FULLTEXT (Opmerking) doe krijg ik de onderstaande foutmelding... Het veld is een blob type.. mag dat soms niet?
#1283 - Column 'Opmerking' cannot be part of FULLTEXT index
De onderstaande website is wel interessant (v.w.b Full index)
http://www.phptuts.nl/view/33/3/
Toevoeging op 24/01/2012 14:00:05:
Kees Schepers op 24/01/2012 13:51:10:
Als je op een kolom in mysql de collect naam_*_ci zet dan is KeEs hetzelfde als KEES of KEEs. Dat geldt ook voor Like. Dan heb je alleen WHERE name LIKE "%KeEs%" nodig ;-)
Ik mag alleen maar uit UTF8,ascii enzovoorts kiezen. Ik mag niet uit naam_*_ci kiezen. Ik gebruik phpmyadmin. Je bedoelt toch het veld Collatie in phpmyadmin? Sorry ik zie het al ik gebruik UTF8_general_CI Alleen dat mag je schijnbaar niet gebruiken met het veld type blob
Gewijzigd op 24/01/2012 14:03:45 door Piet Knaap
Maar waarom is er uberhaubt voor BLOB gekozen? Ik denk dat VARCHAR of TINYTEXT beter past. Ik denk dat je geen FULLTEXT index aan kan maken op BLOB velden.
Het beste wat je kunt doen is:
* Onderzoeken waarom er BLOB gebruikt is
* BLOB aanpassen naar een Text (varchar, char, tinytext, etc) datatype en ALLES UTF-8 maken
* Je query flink aanpassen omdat je niet alle verschillende hoofdletter mogelijkheden hoeft te testen
En om hoeveel records gaat het als je de tabellen Hoofd_Table, Locatie_Table, Mensen_Table, RegistratieType_Table bij elkaar optelt? Want als je het hier hebt over honderduizenden records biedt Solr misschien een betere oplossing. Met de data import handler voor MySQL kun je dan op basis van een MySQL-query delta-syncen met je solr index. Maar is wel iets complexere materie.
Maar om even terug te komen op mijn orginele vraag.
"weet iemand hoe ik er voor kan zorgen dat het script een melding geeft op het moment dat het script nog gegevens aan het ophalen is....."
Jquery:
Code (php)
1
2
3
2
3
$('input.button[name="zoeken"].click(function() {
$('<img src="loader.gif" alt="Laden.." />').appendTo($('#divofzo'));
});
$('<img src="loader.gif" alt="Laden.." />').appendTo($('#divofzo'));
});
Oldskool
Code (php)
1
2
3
2
3
document.getElementById('zoekbutton').onclick = function() {
//hier moet je met DOM een afbeelding appenden ofzo
};
//hier moet je met DOM een afbeelding appenden ofzo
};
Maar ik vindt zo'n oplossing hetzelfde als je kop in het zand steken, want je belast de server nu enorm voor iets super simpels.
Waarom zit je vast aan BLOB?
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
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
<script type="text/javascript">
function showHint(str)
{
if (str.length==0)
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","Overzicht_Query.php?q="+str,true);
xmlhttp.send();
}
</script>
<script type="text/javascript" language="JavaScript">
document.forms['myform2'].elements['mytextfield2'].focus();
</script>
function showHint(str)
{
if (str.length==0)
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","Overzicht_Query.php?q="+str,true);
xmlhttp.send();
}
</script>
<script type="text/javascript" language="JavaScript">
document.forms['myform2'].elements['mytextfield2'].focus();
</script>
Toevoeging op 24/01/2012 16:42:41:
Welke code tags moet ik ook alweer precies gebruiken om mijn code netjes weer te geven op de phphulp website
Gewijzigd op 25/01/2012 09:28:04 door Piet Knaap
Jij wilt iets maken waardoor, als iemand iets invult je hints toont in het zoekveld? Maar als je query extreem langzaam is dit niet echt gebruiksvriendelijk? Dan zul je toch eerst de query moeten optimaliseren lijkt me.
Ik weet ook niet of je showHint direct aanroept als iemand wat invult? Want dan krijg je behoorlijk wat AJAX requests, ik zou dan sowieso window.setTimeout() gebruiken die hem dan elke keer overschrijft.
Dus bijvoorbeeld (in jQuery omdat ik daar fan van ben :-) )
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<html>
<head>
<script type="text/javascript">
$(document).ready(function() {
$('#search').keyUp(function() {
window.setTimeout(function() {
$.get('url-naar-search.php?phrase=' + $('#search').val(), function(data) {
$('#search').val(data);
});
}, 1000);
});
});
</script>
</head>
<body>
<form method="post" action="">
<input type="text" id="search" />
</form>
</body>
</html>
<head>
<script type="text/javascript">
$(document).ready(function() {
$('#search').keyUp(function() {
window.setTimeout(function() {
$.get('url-naar-search.php?phrase=' + $('#search').val(), function(data) {
$('#search').val(data);
});
}, 1000);
});
});
</script>
</head>
<body>
<form method="post" action="">
<input type="text" id="search" />
</form>
</body>
</html>
Heb het niet getest overigens, maar zoiets zou moeten werken.
mytextfield2 = de naam van mijn input text box
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Zoekopdracht: <input type="text" name="mytextfield2" tabindex ="1" value="<?php echo $q_zoekbox; ?>" onblur="this.value=!this.value?'Test ':this.value;"
onload="document.myform2.mytextfield2.focus();" onkeyup="showHint(this.value)" onfocus="showHint(this.value)"
size="20" />
<script type="text/javascript">
$(document).ready(function() {
$('#mytextfield2').keyUp(function() {
window.setTimeout(function() {
$.get('Overzicht_Query.php?q=' + $('#mytextfield2').val(), function(data) {
$('#mytextfield2').val(data);
});
}, 1000);
});
});
</script>
onload="document.myform2.mytextfield2.focus();" onkeyup="showHint(this.value)" onfocus="showHint(this.value)"
size="20" />
<script type="text/javascript">
$(document).ready(function() {
$('#mytextfield2').keyUp(function() {
window.setTimeout(function() {
$.get('Overzicht_Query.php?q=' + $('#mytextfield2').val(), function(data) {
$('#mytextfield2').val(data);
});
}, 1000);
});
});
</script>
Maar ik zie ook helemaal niets verschijnen als ik de code gebruik op mijn webpagina...
Gewijzigd op 25/01/2012 09:59:37 door Piet Knaap
Heb je wel het jQuery-framework ingeladen?
Waarom heb ik het jQuery framework nodig voor het bovenstaande. Het is toch Javascript?
En dat zei Kees ook:
Kees Schepers op 24/01/2012 16:54:48:
Dus bijvoorbeeld (in jQuery omdat ik daar fan van ben :-) )
Gewijzigd op 25/01/2012 11:48:17 door - Ariën -