[PHP] Woorden met spaties exploden => array, maar dan ?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Ik probeer woorden die ik via een textfield ingeef allemaal in een query te gebruiken. De woorden zijn gescheiden door spaties.

Het begin van het stukje code ziet er als volgt uit:

PHP:
1
2
3
$searchtext = $_POST['words'];
$searchtextarray  = explode(" ",$searchtext);
$select = "SELECT * FROM tabel WHERE blaat LIKE '%".$searchtextarray[0]."%'";


Het grote probleem waar ik tegenaan loop is dat explode() de woorden in een array zet en ik dus per ingegeven woord een halve query zou moeten draaien.

Ik ben hier druk doende mee geweest gisteravond met explode() implode() en uiteindelijk op het idee gekomen een loop proberen te maken om de query heen die ieder woord uit de array zou gebruiken in de array.

ik heb dit geprobeerd met list() en dit moet denk ik de goede methode zijn. Mijn vraag is, is dat het ook ? Ik kom namelijk vreselijk veel varianten met explode() tegen op internet maar weinig met list()

Ik neem aan dat ik een soort loop om de query moet maken totdat ieder woord uit de array is gebruikt ?

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Anoniem: 149075 schreef op donderdag 12 oktober 2006 @ 12:17:
PHP:
1
2
3
$searchtext = $_POST['words'];
$searchtextarray  = explode(" ",$searchtext);
$select = "SELECT * FROM tabel WHERE blaat LIKE '%".$searchtextarray[0]."%'";
Loopen over je array ($searchtextarray), je query daarmee opbouwen.

Dus telkens een OR blaat LIKE '%" . $woord[$index] . "%' toevoegen voor elk woord, en dit dan een beetje slim achter je SELECT * FROM table WHERE plakken zodat je voor je eerste dus geen OR krijgt.

Capiche?

[ Voor 38% gewijzigd door Cavorka op 12-10-2006 12:23 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
PHP:
1
2
3
$searchtext = $_POST['words'];
$searchtextarray  = explode(" ",$searchtext);
$select = "SELECT * FROM tabel WHERE blaat LIKE '%". join( "%' OR '%", $searchtextarray ) ."%'";

Of gewoon met de join function alles aan elkaar plakken.

Eigenlijk zou je ook je $searchtextarray nog moeten escapen door bijvoorbeel mysql_real_escape_string. Anders heb je meteen een sql injection lek in je site zitten.

[ Voor 26% gewijzigd door Woy op 12-10-2006 12:41 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
rwb schreef op donderdag 12 oktober 2006 @ 12:39:
PHP:
1
2
3
$searchtext = $_POST['words'];
$searchtextarray  = explode(" ",$searchtext);
$select = "SELECT * FROM tabel WHERE blaat LIKE '%". join( "%' OR '%", $searchtextarray ) ."%'";

Of gewoon met de join function alles aan elkaar plakken.
Join is zo python-achtig, gebruik gewoon implode. ;) (join is een alias naar implode.)

Maar wat je hier doet klopt niet, dit wordt:

blaat LIKE "%bla%" OR "%bla2%" of iets dergelijks, de juiste query syntax is
blaat LIKE "%bla%" OR blaat LIKE "%bla2".


PHP:
1
2
3
4
$searchtext = $_POST['words'];
$searchtextarray  = explode(" ",$searchtext);
$clause = "blaat LIKE '%" . implode("%' OR blaat LIKE '%", $searchtextarray) . "%'";
$select = "SELECT * FROM tabel WHERE " . $clause;

Zoiets zou moeten werken. (Niet getest)

[ Voor 18% gewijzigd door Grijze Vos op 12-10-2006 12:49 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Dit geeft wat perspectieven.

Ik ben ook een voorbeeld tegengekomen waar alle functies aan elkaar geplakt waren en mysql_real_escape_string ook in voor kwam.

rwb, jouw versie zou zo moeten werken of is dit om een idee te geven ? 1 woord werkt prima, maar 2 geeft niets terug.

@Grijze vos, goede opmerking... ik zie het nu ook.

Het werkt perfect met de oplossing van rwb en de wijziging van Grijze Vos :) Dank jullie allen hartelijk.

Ik hoop dat dit andere ook wat meer duidelijkheid geeft over deze manier van een query gebruiken met meerdere woorden.

edit:


Ik was op dit uitgekomen wat ook werkt:

[php]
$select = "SELECT * FROM tabel WHERE blaat LIKE '%". join( "%' OR blaat LIKE '%", $searchtextarray ) ."%'";
[/php]

[ Voor 47% gewijzigd door Anoniem: 149075 op 12-10-2006 12:53 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 16:54

Johnny

ondergewaardeerde internetguru

Als je een zoekfunctie aan het bouwen bent moet je ook eens kijken naar de FULLTEXT mogelijkheden van MySQL, Je hoeft dan geen LIKE te gebruiken en je kan ook zoekwoorden laten groeperen, negeren en de resultaten op relevantie sorteren.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Ja, dit is een goed idee. Ik was alleen al aan de gang met dit, dus eerst werken maken en dan de MySQL variant eens proberen.

Het schijnt ideaal te zijn van wat ik hoor.

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 14:24
oh, en doe ook even een addslashes tegen sql-injection ;)

Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
MisterData schreef op donderdag 12 oktober 2006 @ 13:17:
oh, en doe ook even een addslashes tegen sql-injection ;)
Goed plan, ik moet zo al mijn queries nog een keer na gaan lopen :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MisterData schreef op donderdag 12 oktober 2006 @ 13:17:
oh, en doe ook even een addslashes tegen sql-injection ;)
doe het dan gewoon goed en gebruik mysql_real_escape_string.
Grijze Vos schreef op donderdag 12 oktober 2006 @ 12:45:
[...]

Join is zo python-achtig, gebruik gewoon implode. ;) (join is een alias naar implode.)
Ok maar het ging om het idee ;)
Maar wat je hier doet klopt niet, dit wordt:

blaat LIKE "%bla%" OR "%bla2%" of iets dergelijks, de juiste query syntax is
blaat LIKE "%bla%" OR blaat LIKE "%bla2".
ja heb je helemaal gelijk in. Had het ook even snel uit mijn duim gezogen dus niet gecontroleerd ofzo.

[ Voor 53% gewijzigd door Woy op 12-10-2006 14:12 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
rwb schreef op donderdag 12 oktober 2006 @ 14:10:
[...]

doe het dan gewoon goed en gebruik mysql_real_escape_string.
OK, zal ik doen *;
[...]

ja heb je helemaal gelijk in. Had het ook even snel uit mijn duim gezogen dus niet gecontroleerd ofzo.
Ik kwam er toch uit ?? *O*
Pagina: 1