Avatar billede Slettet bruger
12. september 2006 - 09:06 Der er 8 kommentarer

Avanceret MySQL søgning vha PHP

Jeg arbejder på en database til registrering af kunstværker. Jeg arbejder bl.a. med henholdsvis en simpel og en avanceret søgefunktion (se evt. skærmprint på www.gimm.dk/kunstdatabase/old files/search.jpg).

Der skal søges i tre tabeller: WORKS, NOTES, EXTRA_FILES
og min udfordring ligger i at joine disse tabeller korrekt, hvad der altså ikke er lykkedes.

Hovedtabellen er WORKS og dens PRIMARY KEY hedder W_ID. Indtastninger i tabellerne NOTES og EXTRA_FILES knytter sig således til et oprettet W_ID, og dette noteres med W_ID som FOREIGN KEY i både NOTES og EXTRA_FILES.
(se evt. dokumentation for tabeloprettelse på www.gimm.dk/kunstdatabase/old files/tabel-dokumentation.txt)



DEN SIMPLE SØGNING tester tabellerne for søgeordet.

Mit udspil til simpel søgning er:

$rows = mysql_query("select works.w_id AS wwid, sirname, firstname, title, materials, size, media, year, price, location, photo, note, notes.w_id AS nwid, filename1, filename2, filename3, filename4, filename5, extra_files.w_id AS efwid
    from works, notes, extra_files                   
    where works.w_id like '%$text_search%'
    or sirname like '%$text_search%'
    or firstname like '%$text_search%'
    or title like '%$text_search%'
    or materials like '%$text_search%'
    or size like '%$text_search%'
    or media like '%$text_search%'
    or year like '%$text_search%'
    or price like '%$text_search%'
    or location like '%$text_search%'
    or photo like '%$text_search%'
    or note like '%$text_search%'
    or filename1 like '%$text_search%'
    or filename2 like '%$text_search%'
    or filename3 like '%$text_search%'
    or filename4 like '%$text_search%'
    or filename5 like '%$text_search%'
        AND notes.w_id = works.w_id   
        AND extra_files.w_id = works.w_id               
        order by sirname", $db);   




DEN AVANCEREDE SØGNING matcher flere forskellige søgeord. F.eks titel, materiale og årstal.

Mit udspil til avanceret søgning er:

$rows = mysql_query("select works.w_id AS wwid, sirname,        firstname, title, materials, size, media, year, price, location, photo, note, notes.w_id AS nwid, filename1, filename2, filename3, filename4, filename5, extra_files.w_id AS efwid
    from works, notes, extra_files
    where works.w_id like '%$w_id%'
    and sirname like '%$sirname%'
    and firstname like '%$firstname%'
    and title like '%$title%'
    and materials like '%$materials%'
    and size like '%$size%'
    and media like '%$media%'
    and year between $from_year AND $to_year
    and price between $from_price AND $to_price
    and location like '%$location%'
    and photo like '%$photo%'
    and note like '%$note%'
    and filename1 like '%$filename%'
    and filename2 like '%$filename%'
    and filename3 like '%$filename%'
    and filename4 like '%$filename%'
    and filename5 like '%$filename%'
        AND notes.w_id = works.w_id   
        AND extra_files.w_id = works.w_id               
        order by sirname", $db);   



200 point til det skarpe bud :-)
Avatar billede Slettet bruger
12. september 2006 - 09:10 #1
Avatar billede viper_killerguy Nybegynder
13. september 2006 - 00:28 #2
Tror bare det er indkapsling du mangler
i den simple burde du skrive:
...where
    (
    works.w_id like '%$text_search%'
    or sirname like '%$text_search%'
    or firstname like '%$text_search%'
    or title like '%$text_search%'
    or materials like '%$text_search%'
    or size like '%$text_search%'
    or media like '%$text_search%'
    or year like '%$text_search%'
    or price like '%$text_search%'
    or location like '%$text_search%'
    or photo like '%$text_search%'
    or note like '%$text_search%'
    or filename1 like '%$text_search%'
    or filename2 like '%$text_search%'
    or filename3 like '%$text_search%'
    or filename4 like '%$text_search%'
    or filename5 like '%$text_search%'
    )
        AND notes.w_id = works.w_id   
        AND extra_files.w_id = works.w_id               
        order by sirname", $db);

i den avanceret kan du skrive (hvis jeg har forstået det rigtigt):
...
where
  (
    works.w_id like '%$w_id%'
    and sirname like '%$sirname%'
    and firstname like '%$firstname%'
    and title like '%$title%'
    and materials like '%$materials%'
    and size like '%$size%'
    and media like '%$media%'
    and year between $from_year AND $to_year
    and price between $from_price AND $to_price
    and location like '%$location%'
    and photo like '%$photo%'
    and note like '%$note%'
    and
    (
      filename1 like '%$filename%'
      or filename2 like '%$filename%'
      or filename3 like '%$filename%'
      or filename4 like '%$filename%'
      or filename5 like '%$filename%'
    )
    )
        AND notes.w_id = works.w_id   
        AND extra_files.w_id = works.w_id               
        order by sirname", $db); 


tror i det mindste det er det.
Avatar billede Slettet bruger
13. september 2006 - 07:11 #3
Jeg har sat dine paranteser ind i begge søgningsformer, og ændret 'and' til 'or' ved filename i den avancerede søgning.
Desværre får jeg identiske fejlmeldinger på begge søgningsformer. Nemlig:


Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /customers/gimm.dk/gimm.dk/httpd.www/kunstdatabase/search_advanced.php on line 180

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /customers/gimm.dk/gimm.dk/httpd.www/kunstdatabase/search_advanced.php on line 181



mysql_num_rows()-fejlen referer til en funktion, der tæller det endelige antal værk-hits. Den har fungeret indtil nu, så det skulle ikke være noget reelt problem.

Der har ikke været fejlmelding før de nu tilførte paranteser, men der joinede den til gengæld helt ud i skoven, således fik jeg 451 hits på en simpel-søgning, der kun burde give 1 værk. Og det fordi den joiner alle øvrige værkers noter til værket (én ad gangen) og alle øvrige værkers ekstra-filer i form af FILENAME(1-5). Så samme værk blev sat sammen med en masse fremmede værkers noter og dertilhørende ekstra-filer.

Håber dette opklarer... ?
Avatar billede viper_killerguy Nybegynder
13. september 2006 - 09:34 #4
For at se den fejl mysql spytter ud kan du sætte "or trigger_error(mysql_error());" på dine mysql_query()
f.eks.:
$sql = mysql_query("blah") or trigger_error(mysql_error(), E_USER_ERROR);
Avatar billede Slettet bruger
14. september 2006 - 07:13 #5
Jeg forstår nok ikke helt hvad du mener. Måske fordi jeg bare ikke kender funktionen 'trigger_error'. Men i al fald har jeg nu sat den ind afslutningsvis uden at det umiddelbart ændrer noget. Dokumentation:

$rows = mysql_query("select works.w_id AS wwid, sirname, firstname, title, materials, size, media, year, price, location, photo, note, notes.w_id AS nwid, filename1, filename2, filename3, filename4, filename5, extra_files.w_id AS efwid
    from works, notes, extra_files
    (
        where works.w_id like '%$w_id%'
    and sirname like '%$sirname%'
    and firstname like '%$firstname%'
    and title like '%$title%'
    and materials like '%$materials%'
    and size like '%$size%'
    and media like '%$media%'
    and year between $from_year AND $to_year
    and price between $from_price AND $to_price
    and location like '%$location%'
    and photo like '%$photo%'
        and note like '%$note%'
    (
    and filename1 like '%$filename%'
    or filename2 like '%$filename%'
    or filename3 like '%$filename%'
    or filename4 like '%$filename%'
    or filename5 like '%$filename%'
    )
    )
          AND works.w_id = notes.w_id   
          AND works.w_id = extra_files.w_id               
          order by sirname
    or trigger_error(mysql_error(), E_USER_ERROR);", $db);   

Jeg har også prøvet med et ekstra sæt paranteser fra 'where' og til og med 'order by sirname'. Det ændrede heller ikke noget.


Men ligger min oprindelige fejl ikke nærmere i mine to joins afslutningsvis? Vil du mene, at de er rigtigt angivet?
Avatar billede viper_killerguy Nybegynder
14. september 2006 - 18:21 #6
jeg skrev:
$rows = mysql_query("BLAH") or trigger_error(mysql_error(), E_USER_ERROR);
du skrev:
$rows = mysql_query("BLAH or trigger_error(mysql_error(), E_USER_ERROR);",$db);

trigger_error fortæller bare en fejl, og den fejl er mysql_error() som returnede den fejl mysql sidst fandt, ikke vildt obscur funktion.
Avatar billede Slettet bruger
15. september 2006 - 06:47 #7
Ok. Meldingen lyder:

Fatal error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '( where works.w_id like '%%' and sirname like '%%' in /customers/gimm.dk/gimm.dk/httpd.www/kunstdatabase/search_advanced.php on line 172
Avatar billede Slettet bruger
18. september 2006 - 13:00 #8
Hej Viper

Er du stået af?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester