[php+mysql] Zoeken met hele woorden

Pagina: 1
Acties:
  • 61 views sinds 30-01-2008

  • TomPé
  • Registratie: Januari 2003
  • Laatst online: 28-11 14:48
Beste tweakers,

Ik heb voor me zelf het volgende script geschreven:
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
$query = mysql_query("SELECT * FROM films WHERE Titel LIKE '%$search%'");

    echo"
    <table border='0' cellpadding='2' cellspacing='0'>
        <tr class='head'>
            <td width='60'>Code</td>            
            <td width='325'>Titel</td>
            <td width='85'>Genre</td>
            <td width='50'>Jaar</td>
        </tr>
    ";
while ($row = mysql_fetch_array($query))
    {
        $Code           = $row['Code'];
        $Titel          = $row['Titel'];
        $Genre          = $row['Genre'];
        $Jaar           = $row['Jaar'];
                
        echo"
        <tr class='row'>
            <td>". $Code ."</td>
            <td>". $Titel ."</td>
            <td>". $Genre ."</td>
            <td>". $Jaar ."</td>
        </tr>
        ";
    }
    echo"
    </table>
    ";


Als ik nu dus als zoekwoord topgun opgeef dan zou hij alle titels moeten laten zien waar topgun in voor komt. Maar ipv dat te doen laat hij alle titels zien waar een t een o een p enz inzit. Hoe kan ik zorgen dat hij naar het hele woord kijkt en niet naar afzonderlijke letters?

TomPé


  • Upsal
  • Registratie: Mei 2005
  • Laatst online: 27-08-2024
Hmm, hij zou het gewoon moeten doen (mits $search een waarde bevat), probeer anders ook eens:

PHP:
1
$query = mysql_query("SELECT * FROM films WHERE Titel LIKE '%". $search ."%'");

[ Voor 9% gewijzigd door Upsal op 08-02-2007 19:41 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Debug zelf eens. Print je query eens. Wat staat er in $search?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Tip voor de TS, gebruik de code tags, dat leest makkelijker voor de rest! Klik op Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/tweakers/images/icons/view.gif om te kijken hoe dat voor elkaar krijgt.

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
<?php

$query = mysql_query("SELECT * FROM films WHERE Titel LIKE '%$search%'");

echo"
<table border='0' cellpadding='2' cellspacing='0'>
<tr class='head'>
<td width='60'>Code</td> 
<td width='325'>Titel</td>
<td width='85'>Genre</td>
<td width='50'>Jaar</td>
</tr>
";
while ($row = mysql_fetch_array($query))
{
$Code = $row['Code'];
$Titel = $row['Titel'];
$Genre = $row['Genre'];
$Jaar = $row['Jaar'];

echo"
<tr class='row'>
<td>". $Code ."</td>
<td>". $Titel ."</td>
<td>". $Genre ."</td>
<td>". $Jaar ."</td>
</tr>
";
}
echo"
</table>
";

?>

[ Voor 9% gewijzigd door PolarBear op 08-02-2007 19:19 ]


  • TomPé
  • Registratie: Januari 2003
  • Laatst online: 28-11 14:48
Raar inderdaad want zo werkt het beter :*)

Heb ik eigenlijk nog een vraagje
Dit is het gedeelte waar ik de zoek opdracht in kan geven:
PHP:
1
2
3
4
5
6
7
8
9
10
<form method=POST name='search' action='index.php?page=search'>
<tr>
    <td>
    <input type=text name='search' style='width:125px'>
    </td>
</tr>
<tr>
    <td><input type=submit name='submit_search' value=' Zoek film '></td>
</tr>
<form>

Samen met dit natuurlijk:
PHP:
1
2
3
4
if(isset($_POST['submit_search']))
{
    $search = $_POST['search'];
}

Maar ik MOET de knop Zoek film gebruiken anders zoekt hij niet goed, ik kan niet in het input veld op enter drukken want dan laat hij gewoon weg alle films zien. Dat is toch ook wel tegen te gaan lijkt me ofniet?

[ Voor 5% gewijzigd door TomPé op 08-02-2007 19:25 ]

TomPé


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Moet je natuurlijk wel blokhaken gebruiken ;)

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Je moet een input hidden gebruiken om je form te processen, als je namelijk een je submit knop gebruikt dan wordt deze niet gepost als je op enter drukt

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
TomPé schreef op donderdag 08 februari 2007 @ 19:20:
Samen met dit natuurlijk:

if(isset($_POST['submit_search']))
{
$search = $_POST['search'];
}
En $search komt letterlijk in de query en zo natuurlijk is dat niet. Lees je aub wat in over sql injection.

Verder een tip:
Een LIKE clause beginnend met een wildcard (de % ;) ) wil je niet in een redelijk omvangrijke tabel, als je verder geen goede index hebt om aantal rijen mee te beperken. Verder is ook SELECT * iets dat je wil vermijden, selecteer expliciet de kolommen die je nodig hebt.

Kortom: doe wat aan je sql stijl, want je gaat anders echt heel hard balen van securityleaks en slechte performance.

Overigens ben je ook inconsistent in je naamgeving, $query en $row met kleine letter, maar die 4 vars die je uit de row haalt (welke bij zo'n kleine loop body ook geen extra variabele nodig hebben ;) ) met een hoofdletter.

{signature}


  • TomPé
  • Registratie: Januari 2003
  • Laatst online: 28-11 14:48
Megamind schreef op donderdag 08 februari 2007 @ 19:29:
Je moet een input hidden gebruiken om je form te processen, als je namelijk een je submit knop gebruikt dan wordt deze niet gepost als je op enter drukt
Kan ik niet helemaal volgen. Ik kan mijn input toch niet op hidden zetten want dan kan ik immers geen zoek woorden meer opgeven. En bij de meeste zoek functies ziet altijd wel een knop maar werkt enter ook nog is.

TomPé


  • Upsal
  • Registratie: Mei 2005
  • Laatst online: 27-08-2024
TomPé schreef op donderdag 08 februari 2007 @ 19:20:
...

PHP:
1
2
3
4
if(isset($_POST['submit_search']))
{
    $search = $_POST['search'];
}

Maar ik MOET de knop Zoek film gebruiken anders zoekt hij niet goed, ik kan niet in het input veld op enter drukken want dan laat hij gewoon weg alle films zien. Dat is toch ook wel tegen te gaan lijkt me ofniet?
Vervang de eerste regel eens door:
PHP:
1
if($_SERVER['REQUEST_METHOD'] == 'POST')

[ Voor 1% gewijzigd door Upsal op 08-02-2007 19:39 . Reden: Typo ]


  • TomPé
  • Registratie: Januari 2003
  • Laatst online: 28-11 14:48
Dan werkt de gehele zoek functie niet meer

TomPé


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Dit even buiten je zoekfunctie om.

Waarom gebruik je geen fulltext search?
Is wellicht iets sneller en geeft betere resultaten.

  • TomPé
  • Registratie: Januari 2003
  • Laatst online: 28-11 14:48
Dat heb ik eerder een keer gehoord, schijnt goed te werken icm php maar daar heb ik helemaal geen kaas van gegeten. Kan me er in de toekomst natuurlijk wel is in gaan verdiepen.

Misschien heb je een suggestie om ergens te beginnen?

TomPé


  • mithras
  • Registratie: Maart 2003
  • Niet online
TomPé schreef op vrijdag 09 februari 2007 @ 09:10:
Dat heb ik eerder een keer gehoord, schijnt goed te werken icm php maar daar heb ik helemaal geen kaas van gegeten. Kan me er in de toekomst natuurlijk wel is in gaan verdiepen.

Misschien heb je een suggestie om ergens te beginnen?
Wat dacht je van de manual http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html :?

Daarnaast lijkt het me handig om iets te lezen over SQL injection ;)

[ Voor 14% gewijzigd door mithras op 09-02-2007 09:17 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Megamind schreef op donderdag 08 februari 2007 @ 19:29:
Je moet een input hidden gebruiken om je form te processen, als je namelijk een je submit knop gebruikt dan wordt deze niet gepost als je op enter drukt
Dan liever de oplossing die Upsal in "\[php+mysql] Zoeken met hele woorden" noemt. :)

Verder maak ik aan dit topic ook even een einde. De vragen die hier gesteld worden zijn namelijk met een beetje moeite ook wel zelf op te lossen; hoe LIKE-query's werken en hoe formuliertjes verwerkt moeten worden zijn vrij basale dingen die in elk boek en een hoop tutorials wel behandeld worden. :)

TomPé, zie ook even Programming Beleid - De "quickstart". :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.