[PHP/MYSQL]Zoeken in meerdere tabellen en kolommen

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok het volgende is mijn probleem. Ik heb een database met een paar tabellen erin. Een paar hebben dezelfde kolommen inhoud. Nu wil ik gaan zoeken in deze database.
Als eerste doe ik deze:

$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%$_POST[zoeken]%' ORDER BY id"); (deze werkt).

Maar deze niet:
$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

Bij de laatste haalt ie wel de titel goed uit de database maar het bericht niet :?.
Wat is hier fout aan?

En nu het probleem dat ik wil zoeken in 3 tabellen tegelijk. Heb dit geprobeerd maar het lukte niet:

SELECT tabel1.bericht, tabel1.titel, tabel2.bericht, tabel2.titel, tabel3.bericht, tabel3.titel FROM tabel1, tabel2, tabel3 WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

Mja wat is hier fout aan.
Ben maar een noob he dus wees lief :).

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:30
Verwijderd schreef op 27 juli 2003 @ 01:06:
Ok het volgende is mijn probleem. Ik heb een database met een paar tabellen erin. Een paar hebben dezelfde kolommen inhoud. Nu wil ik gaan zoeken in deze database.
Als eerste doe ik deze:

$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%$_POST[zoeken]%' ORDER BY id"); (deze werkt).

Maar deze niet:
$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

Bij de laatste haalt ie wel de titel goed uit de database maar het bericht niet :?.
Wat is hier fout aan?

En nu het probleem dat ik wil zoeken in 3 tabellen tegelijk. Heb dit geprobeerd maar het lukte niet:

SELECT tabel1.bericht, tabel1.titel, tabel2.bericht, tabel2.titel, tabel3.bericht, tabel3.titel FROM tabel1, tabel2, tabel3 WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

Mja wat is hier fout aan.
Ben maar een noob he dus wees lief :).
Begin eens met je code tussen [ php] en [ /php] te zetten.

Verder is je code-stijl slecht, wat fouten in de hand werkt.

PHP:
1
$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

kan beter zo:
PHP:
1
2
$find = mysql_query("SELECT * FROM nieuws WHERE bericht LIKE '%"
.$_POST["zoeken"]."%' AND titel LIKE '%".$_POST["zoeken"]."%' ORDER BY id");


Het gebruik van * is ook heel slecht en gaat problemen opleveren als je je tabel gaat verbouwen. Gebruik gewoon de veldnamen achter elkaar.

[ Voor 8% gewijzigd door Dennis op 27-07-2003 01:11 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 27 July 2003 @ 01:06:
Bij de laatste haalt ie wel de titel goed uit de database maar het bericht niet :?.
Wat is hier fout aan?
OR ipv AND gebruiken.
SELECT tabel1.bericht, tabel1.titel, tabel2.bericht, tabel2.titel, tabel3.bericht, tabel3.titel FROM tabel1, tabel2, tabel3 WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");

Mja wat is hier fout aan.
Ben maar een noob he dus wees lief :).
UNION gebruiken
Select melp from tabelnaam where ID = 'melp'
Union Select melp from tabelnaam2 where ID = 'melp'

Daarnaast mag je twijfelen aan je datastructuur, waar op het eerste gezicht weinig van klopt.

Ook geldt:

Vertrouw nooit user input en ga deze eerst valideren

[ Voor 17% gewijzigd door gorgi_19 op 27-07-2003 01:13 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 27 July 2003 @ 01:06:
SELECT tabel1.bericht, tabel1.titel, tabel2.bericht, tabel2.titel, tabel3.bericht, tabel3.titel FROM tabel1, tabel2, tabel3 WHERE bericht LIKE '%$_POST[zoeken]%' AND titel LIKE '%$_POST[zoeken]%' ORDER BY id");
Bij deze kan ik zowieso zeggen dat je bij je where statements de naam van de tabel vóór de veldnaam moet zetten. Of ie daarna wel werkt kan ik in mijn huidige toestand niet zeggen 8)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja ik heb de codes er wel staan maar aan het begin en het einde van de pagina dus daar niet.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:30
Verwijderd schreef op 27 July 2003 @ 01:11:
Bij deze kan ik zowieso zeggen dat je bij je where statements de naam van de tabel vóór de veldnaam moet zetten. Of ie daarna wel werkt kan ik in mijn huidige toestand niet zeggen 8)
En dan kun je überhaupt de tabellen beter een naam geven.

code:
1
2
3
4
FROM
  tabel1 AS t1,
  tabel2 AS t2,
  tabel3 AS t3

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:06

gorgi_19

Kruimeltjes zijn weer op :9

ddc schreef op 27 July 2003 @ 01:14:
[...]

En dan kun je überhaupt de tabellen beter een naam geven.

code:
1
2
3
4
FROM
  tabel1 AS t1,
  tabel2 AS t2,
  tabel3 AS t3
Echt noodzakelijk is dit niet. Gezien de kolomnamen zou ik eerder eens gaan nadenken over de datastructuur.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:30
gorgi_19 schreef op 27 July 2003 @ 01:15:
Echt noodzakelijk is dit niet. Gezien de kolomnamen zou ik eerder eens gaan nadenken over de datastructuur.
:D :'( :D.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
gorgi_19 schreef op 27 July 2003 @ 01:11:
[...]

OR ipv AND gebruiken.

[...]

UNION gebruiken
Select melp from tabelnaam where ID = 'melp'
Union Select melp from tabelnaam2 where ID = 'melp'


Ook geldt:

Vertrouw nooit user input en ga deze eerst valideren
Or werkt idd. Thx. Maar dat laatste begrijp ik niet.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:30
Verwijderd schreef op 27 July 2003 @ 01:22:
Or werkt idd. Thx. Maar dat laatste begrijp ik niet.
Ik kan als ik je pagina als volgt aanroep:

pagina.php?zoeken=;DROP%20TABLE%20tabel1

waarschijnlijk jouw database verstieren. Ik weet niet of het bovengenoemde voorbeeld echt werkt maar het is een voorbeeld.

Controleer daarom eerst of de variabele $_POST['zoeken'] wel een geldige waarde bevat. Controleer of er geen rare tekens instaan. Iemand die op DROP TABLE gaat zoeken is niet het gemiddelde soort bezoeker 8-).

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 27 July 2003 @ 01:22:
[...]


Or werkt idd. Thx. Maar dat laatste begrijp ik niet.
Checken of er geen php of html code in de gegevens zitten die je via het form binnenkrijgt. Dit is nl een enorm beveiligingsgat. Check de php manual voor de functies ed..

edit: ff nagezocht

-> htmlspecialchars info
-> algemene info

[ Voor 26% gewijzigd door Verwijderd op 27-07-2003 01:33 . Reden: typooo ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok thx, maar de union functie. Want ik kom er niet uit hoe ik nu in verschillende tabellen en verschillen kolommen bij dezelfde zoekopdracht moet zoeken.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 27 juli 2003 @ 01:31:
Ok thx, maar de union functie. Want ik kom er niet uit hoe ik nu in verschillende tabellen en verschillen kolommen bij dezelfde zoekopdracht moet zoeken.
Je wilt in principe 3x een zelfde select uitvoeren op dezelfde kolommen. Het enige verschil is dat deze kolommen in verschillende tabellen zitten (wat dus imho ook anders opgelost moet worden)

Wil je deze resultaten combineren, moet je er een UNION van maken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 27 July 2003 @ 01:31:
Ok thx, maar de union functie. Want ik kom er niet uit hoe ik nu in verschillende tabellen en verschillen kolommen bij dezelfde zoekopdracht moet zoeken.
Hier staat wat, het is in eerste instantie voor SQL server, maar voor zover ik kan zien is het standaard sql (behalve een subquery die ergens tussenstaat, maar volgens mij wordt dat in de nieuwste versie van MySQL ondersteund..)

-> Google resultaat

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ik heb wat op die site van mysql gelzen. Dus het komt er op dit nee dat je ongeveer dit krijgt:

$find = mysql_query("SELECT * FROM internet3 WHERE bericht LIKE '%".$_POST["zoeken"]."%' OR titel LIKE '%".$_POST["zoeken"]."%' ORDER BY id");
UNION
("SELECT * FROM internet1 WHERE bericht LIKE '%".$_POST["zoeken"]."%' OR titel LIKE '%".$_POST["zoeken"]."%' ORDER BY id");

Maar dit geeft een fout. Namelijk deze:

Fatal error: Call to undefined function: union()

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

dat betekent dus dat je de functie union niet hebt :X

[ Voor 94% gewijzigd door Wolfboy op 27-07-2003 02:23 ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
aha wat nu?

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

*klik*

zo te zien hoort het in mysql 4.0 te zitten, welke versie heb jij?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
4.0.13

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

volgens mij zou die dan wel moeten werken.
zelf heb ik nog maar weinig met union gewerkt dus misschien weet een ander hier meer over.

kijk ook de documentatie op de mysql site nog eventjes na

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik kom er niet uit. Ik heb al steeds verschillende versies geprobeerd van de code. Ik wacht wel op antwoord.
Thx anyway.

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
[quote]Verwijderd schreef op 27 juli 2003 @ 01:52:
Ok ik heb wat op die site van mysql gelzen. Dus het komt er op dit nee dat je ongeveer dit krijgt:

hmm? union is een mysql functie geen PHP functie.

code:
1
2
3
4
5
6
7
$query = "(SELECT * FROM internet3 ";
$query .= "WHERE bericht LIKE '%".$_POST["zoeken"]."%' ";
$query .= "OR titel LIKE '%".$_POST["zoeken"]."%' ORDER BY id) ";
$query .= "UNION ";
$query .= "(SELECT * FROM internet1 WHERE "; 
$query .= "bericht ";LIKE '%".$_POST"zoeken"]."%' ";
$query .= "OR titel LIKE '%".$_POST["zoeken"]."%' ORDER BY id)";


ik heb union nooit gebruikt maar dit zou het zo'n beetje moeten zijn volgens de mysql manual.

http://www.mysql.com/doc/en/UNION.html

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:06

gorgi_19

Kruimeltjes zijn weer op :9

UNION is idd een SQL Statement.

MAar je hebt nog steeds geen reactie gegeven op het commentaar op je structuur.. Zijn al die tabellen echt noodzakelijk? Betwijfel het sterk namelijk.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1