Zoeken op alles

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Carel

Carel

08/01/2008 17:35:00
Quote Anchor link
Uhm bij nade inzien leek me dat allemaal een beetje te complex om met full text search aan de haal te gaan. Daarom heb ik de volgende code in elkaar gezet om te zoeken op een bepaald type (dus zoeken op omschrijving alleen, zoeken op categorie alleen). Dat is mij uitstekend gelukt, alleen probeer ik nu te zoeken op alles (dus zoeken op categorie EN omschrijving met de explode functie en AND operator erin). Tot zover heb ik dit gemaakt:

Ik weet dat ik iets ergens tussen 37 en 40 iets moet toevoegen. Alleen begrijp ik niet wat en of dat zomaar mag...ik dacht aan dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
if($k == 0) {
$like .= "`trefwoord` LIKE '%".$v."%' ";
$like .= "`omschrijving` LIKE '%".$v."%' ";
} else {
$like .= "AND `trefwoord` LIKE '%".$v."%' ";
$like .= "AND `omschrijving` LIKE '%".$v."%' ";
}
}


Maar ik weet zeker dat dat niet werkt en dat doet het dus ook niet....

Alvast bedankt voor suggesties...

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
?>

<?php require_once("databaseconnectionuploaden.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zoeken</title>
</head>

<body>

<form form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
Zoek op:<br>
<select name="zoekenop">
<option value="omschrijving">Omschrijving</option>
<option value="trefwoord">Trefwoord</option>
<option value="alles" selected="selected">alles</option>
</select><p>
<input name="zoeken" type="text" id="zoeken" size="30"><p>
<input type="submit" value="zoeken">
</form>
      <?php      
      if($_SERVER['REQUEST_METHOD'] == 'POST')
      {

      $zoekenop = mysql_real_escape_string($_POST['zoekenop']);
      $zoeken = mysql_real_escape_string($_POST['zoeken']);
// je query dan:

if ($zoekenop == 'alles'){
$zoekexploded = explode(' ', $zoeken);
$like = "";
foreach($zoekexploded as $k=>$v) {
if($k == 0) {
$like .= "`trefwoord` LIKE '%".$v."%' ";
}
else {
$like .= "AND `trefwoord` LIKE '%".$v."%' ";
}
}

$sql = "
SELECT thumbnail, trefwoord, omschrijving
FROM afbeelding
WHERE "
.$like." OR
"
.$like."
"
;
 }
else {
$zoekexploded = explode(' ', $zoeken);
$like = "";
foreach($zoekexploded as $k=>$v) {
if($k == 0) {
$like .= "`$zoekenop` LIKE '%".$v."%' ";
}
else {
$like .= "AND `$zoekenop` LIKE '%".$v."%' ";
}
}

$sql = "
SELECT thumbnail, trefwoord, omschrijving
FROM afbeelding
WHERE "
.$like."
"
;
}

    
$res = mysql_query($sql);

if(!$res)
{

    trigger_error(mysql_error().'<br />In query: '.$sql);
}

else
{
    if (mysql_num_rows($res) >= 1)
    {

    while ($row = mysql_fetch_array($res))
    {

    echo '<img src="'.$row['thumbnail'].'" alt="thumbnail" /></p>';
    }

    echo "<a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
}

      else
      {
      echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoeken]</b></p>";

      echo "<p><a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a></p>";
      }
      }
      }

      ?>

</body>
</html>
 
PHP hulp

PHP hulp

28/04/2024 08:07:58
 
Joren de Wit

Joren de Wit

08/01/2008 17:42:00
Quote Anchor link
Waarom explode je elke keer de waarde waarop een gebruiker wil zoeken? Als je op verschillende woorden in een zoekstring wilt zoeken is de fulltext search de oplossing...

Verder, wat betreft dat op 'alles' zoeken. Dat zou je zo kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if($_POST['zoekenop'] == 'alles')
{

    $zoekstring = mysql_real_escape_string($_POST['zoeken']);
    $sql = "
        SELECT thumbnail, trefwoord, omschrijving
        FROM afbeelding
        WHERE trefwoord LIKE '%"
.$zoekstring."%'
        OR omschrijving LIKE '%"
.$zoekstring."%'
    "
;
}

?>

Tenslotte zou ik je willen aanraden om netjes te gaan scripten. Je script is nu zo onoverzichtelijk als maar kan zijn, en dat zal alleen maar fouten op gaan leveren.
 
Martijn B

Martijn B

08/01/2008 17:45:00
Quote Anchor link
Als je een index hebt op trefwoord en omschrijving.
Dan wordt in jou query deze index niet gebruikt.

Met deze query wel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$sql
= "SELECT thumbnail, trefwoord, omschrijving
        FROM afbeelding
        WHERE trefwoord LIKE '"
.$zoekstring."%'
        OR omschrijving LIKE '"
.$zoekstring."%'";
?>
 
Carel

Carel

08/01/2008 18:40:00
Quote Anchor link
Ik zei toch fulltext search behoorlijk complex voor mij is. Ik explode omdat ik wil zoeken op verschillende woorden wil zoeken zoals je zegt. Ik probeer dus dat full text search te omzeilen.

Wat is die $zoekstring overigens? Begrijp niet wat die doet.

Ik snap ook niet waarom in die zoeken op alles code van jouw niet explode....Ik wil dus wel met exploden zoeken zonder complex te gaan doen met full text search. Dat wat jij me gaf begreep ik ook al (alleen dat met die $_post is idd handiger all komt het min of meer op hetzelfde uit met wat ik had.

Met netjes scripten bedoel je waarschijnlijk de openening...Ik doe mijn best ik hoop dat je het er nu wel goed uit vind zien dan....zeg me of het er goed uit ziet. En help mij aub een oplossing te vinden met die explode.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require_once("databaseconnectionuploaden.php");
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zoeken</title>
</head>

<body>

<form form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
    Zoek op:<br>
    <select name="zoekenop">
        <option value="omschrijving">Omschrijving</option>
        <option value="trefwoord">Trefwoord</option>
        <option value="alles" selected="selected">alles</option>
    </select><p>
    <input name="zoeken" type="text" id="zoeken" size="30"><p>
    <input type="submit" value="zoeken">
</form>

<?php      
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    $zoekenop = mysql_real_escape_string($_POST['zoekenop']);
    $zoeken = mysql_real_escape_string($_POST['zoeken']);

        if ($zoekenop == 'alles')
        {

            $zoekexploded = explode(' ', $zoeken);
            $like = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`trefwoord` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `trefwoord` LIKE '%".$v."%' ";
                }
            }

            $sql = "
                SELECT thumbnail, trefwoord, omschrijving
                FROM afbeelding
                WHERE "
.$like." OR
                "
.$like."
            "
;
        }

        else
        {
            $zoekexploded = explode(' ', $zoeken);
            $like = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`$zoekenop` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `$zoekenop` LIKE '%".$v."%' ";
                }
            }

            $sql = "
            SELECT thumbnail, trefwoord, omschrijving
            FROM afbeelding
            WHERE "
.$like."
        "
;
        }

            
        $res = mysql_query($sql);
        
        if(!$res)
        {

            trigger_error(mysql_error().'<br />In query: '.$sql);
        }

        else
        {
            if (mysql_num_rows($res) >= 1)
            {

                while ($row = mysql_fetch_array($res))
                {

                echo '<img src="'.$row['thumbnail'].'" alt="thumbnail" /></p>';
                echo "<a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
                }
            }

            else
            {
                echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoeken]</b></p>";
                echo "<p><a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a></p>";
            }
        }
}

?>

</body>
</html>
Gewijzigd op 01/01/1970 01:00:00 door Carel
 
Joren de Wit

Joren de Wit

08/01/2008 19:15:00
Quote Anchor link
Carel, dat ziet er al een stuk netter uit! Dat is een stuk makkelijker lezen, zeg nou zelf...

Die $zoekstring komt uit $_POST['zoeken'] waar mysql_real_escape_string() overheen gehaald is om de input te beveiligen.

Tja en dat exploden op de spatie, ik zou het gewoon niet doen. Maar dit is een voorbeeldje voor 1 kolom:
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
<?php
if($_POST['zoekenop'] == 'trefwoord' || $_POST['zoekenop'] == 'omschrijving')
{

    $sql = "
        SELECT
            trefwoord,
            omschrijving,
            thumbnail
        FROM
            afbeelding
    "
;
    
    $and = false;
    foreach(explode(' ', $_POST['zoeken']) as $zoekwoord)
    {

        if(!$and)
        {

            $sql .= " WHERE "
            $and = true;
        }

        else
        {
            $sql .= " AND "
        }
        $sql .= $_POST['zoekenop']." LIKE '%".mysql_real_escape_string($zoekwoord)."%'";
    }
}

?>

Zoals je ziet, een hele omslachtige benadering. Maar het zal wel werken.

ps. Niet getest overigens, dus er kunnen foutjes in staan...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Carel

Carel

08/01/2008 19:24:00
Quote Anchor link
Ik heb dit gemaakt het werkt...alleen de weergave van de resultaten is raar. ( http://aycu39.webshots.com/image/40798/2005854193985186024_rs.jpg ) De tekst zoek opnieuw wordt op verschillende locaties geplaatst. Ik zag trouwens dat ik nog 2 foutjes had in opmaak: Is die van mij onveilig met mijn

$zoekenop = mysql_real_escape_string($_POST['zoekenop']); ???

of moet ik die methode van jouw toepassen? Puur om te weten wat ik heb gedaan goed is of niet. Ongetwijfeld dat die van jouw beter is en werkt. Ik probeer het ook te leren ;) En het ziet idd beter uit en makkelijker om te lezen.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require_once("databaseconnectionuploaden.php");
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zoeken</title>
</head>

<body>

<form form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
    Zoek op:<br>
    <select name="zoekenop">
        <option value="omschrijving">Omschrijving</option>
        <option value="trefwoord">Trefwoord</option>
        <option value="alles" selected="selected">alles</option>
    </select><p>
    <input name="zoeken" type="text" id="zoeken" size="30"><p>
    <input type="submit" value="zoeken">
</form>

<?php      
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    $zoekenop = mysql_real_escape_string($_POST['zoekenop']);
    $zoeken = mysql_real_escape_string($_POST['zoeken']);

        if ($zoekenop == 'alles')
        {

            $zoekexploded = explode(' ', $zoeken);
            $like = "";            
            $like2 = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`trefwoord` LIKE '%".$v."%' ";
                    $like2 .= "`omschrijving` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `trefwoord` LIKE '%".$v."%' ";
                    $like2 .= "AND `omschrijving` LIKE '%".$v."%' ";
                }
            }

            $sql = "
                SELECT
                    thumbnail,
                    trefwoord,
                    omschrijving
                FROM
                    afbeelding
                WHERE
                    "
.$like." OR
                    "
.$like2."
            "
;
        }

        else
        {
            $zoekexploded = explode(' ', $zoeken);
            $like = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`$zoekenop` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `$zoekenop` LIKE '%".$v."%' ";
                }
            }

            $sql = "
            SELECT
                thumbnail,
                trefwoord,
                omschrijving
            FROM
                afbeelding
            WHERE
                "
.$like."
        "
;
    }

        
    $res = mysql_query($sql);
    
    if(!$res)
    {

        trigger_error(mysql_error().'<br />In query: '.$sql);
    }

    else
    {
        if (mysql_num_rows($res) >= 1)
        {

            while ($row = mysql_fetch_array($res))
            {

            echo '<img src="'.$row['thumbnail'].'" alt="thumbnail" /></p>';
            echo "<a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
            }
        }

        else
        {
            echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoeken]</b></p>";
            echo "<p><a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a></p>";
        }
    }
}

?>

</body>
</html>
Gewijzigd op 01/01/1970 01:00:00 door Carel
 
Joren de Wit

Joren de Wit

08/01/2008 19:31:00
Quote Anchor link
Je echot die 'zoek opnieuw' in de while loop. Dus hij wordt na elk resultaat uit de database weergegeven. Haal die echo dus buiten die loop.

Wat betreft die $zoekenop, de volgorde is niet logisch en bovendien zou je ook andere kolommen dan trefwoord of omschrijving in die variabele kunnen krijgen...

Controleer dus altijd of de inhoud van $zoekenop gelijk is aan 'alles' dan wel aan 'trefwoord' of 'omschrijving'. Die mysql_real_escape_string() op deze variabele is niet logisch, aangezien er in principe geen speciale tekens in voor zullen komen. En als dat wel het geval is, dan komen ze dus niet door de controle of ze gelijk zijn aan de waarden die ik noemde.
 
Carel

Carel

08/01/2008 19:52:00
Quote Anchor link
Je hebt idd gelijk over die loop, dom dat ik dat over het hoofd heb gezien.

Begrijp niet wat er verkeerd is aan de volgorde en ook niet dat het mogelijk is dat ik ook andere kolommen dan trefwoord kan krijgen, want dat is ook de bedoeling.... Het moet ook mogelijk zijn dat in die $zoekenop ALLEEN trefwoord of omschrijving komt. Er zijn in mijn ogen maar drie mogelijke waarden die in de $zoekenop kunnen komen namleijk:
1. Omschrijving
2. Trefwoord
3. Alles
Die ik heb aangegeven in de top down menu.

In mijn code na de eerste op alles zoeken dus na die else zie je ook staan

$like .= "`$zoekenop` LIKE '%".$v."%' ";

Wat betreft die mysql_real_escape_string() heb je helemaal gelijk omdat ik immers aangegeven heb welke waarden dat zijn.

Ik begrijp eigenlijk dus min of meer alles alleen die controleren of de inhoud gelijk is aan 'alles' dan wel aan 'trefwoord' of 'omschrijving' niet. Het is toch onmogelijk dat er een andere waarde in komt dan die drie?

Bedankt voor je hulp en uitleg. Ik leer hier veel van.
 
Joren de Wit

Joren de Wit

08/01/2008 19:56:00
Quote Anchor link
Quote:
Het is toch onmogelijk dat er een andere waarde in komt dan die drie?
Via jouw formulier wel inderdaad. Maar ik zou ook zelf een formuliertje kunnen maken met precies dezelfde veldnamen en de action vervolgens naar jouw script laten verwijzen.

Op die manier zou ik ook andere waarden voor $_POST['zoekenop'] in jouw script kunnen stoppen dan in jouw formulier staan. Dat wil je niet, dus controleer altijd of die variabele wel gelijk is aan een van de 3 mogelijkheden.
 
Carel

Carel

08/01/2008 20:04:00
Quote Anchor link
Lol (verdomde hackers ook).

Dus door dit:

if ($zoekenop == 'alles')

NAAR dit

if($_POST['zoekenop'] == 'alles')

te veranderen...is het veiliger

Ik heb het aangepast is deze code nu WEL veilig????

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require_once("databaseconnectionuploaden.php");
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zoeken</title>
</head>

<body>

<form form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
    Zoek op:<br>
    <select name="zoekenop">
        <option value="omschrijving">Omschrijving</option>
        <option value="trefwoord">Trefwoord</option>
        <option value="alles" selected="selected">alles</option>
    </select><p>
    <input name="zoeken" type="text" id="zoeken" size="30"><p>
    <input type="submit" value="zoeken">
</form>

<?php      
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    $zoeken = mysql_real_escape_string($_POST['zoeken']);

        if($_POST['zoekenop'] == 'alles')
        {

            $zoekexploded = explode(' ', $zoeken);
            $like = "";            
            $like2 = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`trefwoord` LIKE '%".$v."%' ";
                    $like2 .= "`omschrijving` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `trefwoord` LIKE '%".$v."%' ";
                    $like2 .= "AND `omschrijving` LIKE '%".$v."%' ";
                }
            }

            $sql = "
                SELECT
                    thumbnail,
                    trefwoord,
                    omschrijving
                FROM
                    afbeelding
                WHERE
                    "
.$like." OR
                    "
.$like2."
            "
;
        }

        elseif $_POST['zoekenop'] == 'trefwoord' || $_POST['zoekenop'] == 'omschrijving';
        {

            $zoekexploded = explode(' ', $zoeken);
            $like = "";
            foreach($zoekexploded as $k=>$v)
            {

                if($k == 0)
                {

                    $like .= "`$_POST['zoekenop']` LIKE '%".$v."%' ";
                }

                else
                {
                    $like .= "AND `$_POST['zoekenop']` LIKE '%".$v."%' ";
                }
            }

            $sql = "
            SELECT
                thumbnail,
                trefwoord,
                omschrijving
            FROM
                afbeelding
            WHERE
                "
.$like."
        "
;
    }

        
    $res = mysql_query($sql);
    
    if(!$res)
    {

        trigger_error(mysql_error().'<br />In query: '.$sql);
    }

    else
    {
        if (mysql_num_rows($res) >= 1)
        {

            while ($row = mysql_fetch_array($res))
            {

            echo '<img src="'.$row['thumbnail'].'" alt="thumbnail" /></p>';
            }

            echo "<a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
        }

        else
        {
            echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoeken]</b></p>";
            echo "<p><a href=\"registered_user_area_zoeken.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
        }
    }
}

?>

</body>
</html>
Gewijzigd op 01/01/1970 01:00:00 door Carel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.