Versio

Zoekscript

Overzicht Reageren

Piet Knaap

Piet Knaap

24/01/2012 11:55:54
Quote Anchor link
Ik heb het onderstaande script gedownload en wat aangepast naar een Mysql variant. Nu is het alleen zo dat mijn database wat groot is waardoor het net lijkt of het script niet werkt. Het duurt +/- 30 seconde voordat het script resultaat terug geeft. Nu is mijn 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.....

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
 
PHP hulp

PHP hulp

25/05/2012 20:08:06
Gesponsorde koppelingen:
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 11:57:45
Quote Anchor link
Ik zou eerst eens kijken waarom het langzaam is. Want in veel gevallen kun je het flink optimaliseren.

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.
 
Piet Knaap

Piet Knaap

24/01/2012 12:22:39
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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"
;
?>

Toevoeging op 24/01/2012 12:26:09:

De variable $q komt uit het zoekscript.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
?>


Kees Schepers:
Ik heb even je code tussen code tags gezet, dit maakt alles veel beter leesbaar, gelieve in het vervolg hier rekening mee houden!
Gewijzigd op 24/01/2012 12:31:31 door kees Schepers
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 12:33:58
Quote Anchor link
Heb je ook een explain statement? Dan doe je gewoon echo $SQL; en kopieer je en plak je de string in bijvoorbeeld PhpMyAdmin en zet je er 'EXPLAIN ' voor.

Waarom is er gekozen voor Like en geen full-text? Draait alles onder InnoDB?

Ik denk dat geheel ook wel beter genormaliseerd kan worden..
 
Erwin H

Erwin H

24/01/2012 13:15:49
Quote Anchor link
Hmmm, heb je wel getest of dit nodig is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

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.
 
Piet Knaap

Piet Knaap

24/01/2012 13:29:43
Quote Anchor link
id select_type table type possible_keys key key_len ref rows Extra
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
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 13:34:01
Quote Anchor link
Erwin H op 24/01/2012 13:15:49:
Hmmm, heb je wel getest of dit nodig is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

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.
 
Piet Knaap

Piet Knaap

24/01/2012 13:36:30
Quote Anchor link
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...
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 13:51:10
Quote Anchor link
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 ;-)
 
Piet Knaap

Piet Knaap

24/01/2012 13:57:47
Quote Anchor link
Als ik

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
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 14:40:28
Quote Anchor link
Wtf blob? Ja dan begrijp ik het wel. In BLOB wordt alle data namelijk binair opgeslagen en dan begrijp ik de hoofdletter gevoeligheid wel.

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.
 
Piet Knaap

Piet Knaap

24/01/2012 14:51:36
Quote Anchor link
Aan Blob zit ik helaas vast.

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....."
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 15:01:10
Quote Anchor link
Je zou als er op de knop gelikt wordt een plaatje inladen:

Jquery:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$('input.button[name="zoeken"].click(function() {
  $('<img src="loader.gif" alt="Laden.." />').appendTo($('#divofzo'));
});


Oldskool
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
document.getElementById('zoekbutton').onclick = function() {
  //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?
 
Piet Knaap

Piet Knaap

24/01/2012 16:41:32
Quote Anchor link
Het is niet een knop waar je op klikt maar een textbox die je invult. zie code

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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>


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
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 16:54:48
Quote Anchor link
Code moet je in code tags zetten, je doet het bijna goed maar dan moet het met [ ] en daar tussen code.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>


Heb het niet getest overigens, maar zoiets zou moeten werken.
 
Piet Knaap

Piet Knaap

25/01/2012 09:42:28
Quote Anchor link
De reden waarom ik een BLOB gebruik is vanwege een "hoteditor_bbcode_ouput_editor" scriptje. Dit script vereist een BLOB veld type. Ik heb jouw voorbeeld geprobeerd maar helaas. Ik heb jouw script iets aangepast....

mytextfield2 = de naam van mijn input text box

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

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
 
- Aar -

- Aar -

25/01/2012 10:49:00
Quote Anchor link
Heb je wel het jQuery-framework ingeladen?
 
Piet Knaap

Piet Knaap

25/01/2012 11:43:17
Quote Anchor link
Waarom heb ik het jQuery framework nodig voor het bovenstaande. Het is toch Javascript?
 
- Aar -

- Aar -

25/01/2012 11:46:45
Quote Anchor link
Ja, met jQuery functies. jQuery is namelijk een JavaScript-framework.

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 - Aar -
 



Overzicht Reageren

Get Adobe Flash player