Avatar billede martinbk Nybegynder
11. juni 2003 - 22:28 Der er 19 kommentarer og
1 løsning

optimalt SQL kald for søge funktion

jeg har følgende plain HTML form:


<form method="post" action="<?=$_SERVER[PHP_SELF];?>">
CD nr.&nbsp;<input type="text" name="cd_nr" maxlength="4" size="4"><br>
Nr. på CD.&nbsp;<input type="text" name="nr_nr" maxlength="2" size="2"><br>
Kunstner.&nbsp;<input type="text" name="artist"><br>
Titel.&nbsp;<input type="text" name="titel"><br>
<input type="submit" name="submit" value="søg">
</form>

hvad jeg mangler er et optimalt SQL kald hvori jeg kan lave en kombineret søgning, der skal kunne indtastes i samtlige felter eller kun et felt, min database struktur er som følger:

CREATE TABLE `numre` (
  `id` int(10) NOT NULL auto_increment,
  `cd_nr` int(10) NOT NULL default '0',
  `nr_nr` int(10) NOT NULL default '0',
  `artist` longtext NOT NULL,
  `titel` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


håber på lidt hjælp :)
Avatar billede tipsen Nybegynder
11. juni 2003 - 23:00 #1
Dvs. du ønsker et script der udfra de udfyldte felter i formularen dynamisk genererer en SQL-query som udfra de valgte felter finder matches i db'en uanset hvilke felter der er udfyldte?
Avatar billede martinbk Nybegynder
11. juni 2003 - 23:05 #2
ja, i princippet kunne det vel laves med if, elseif, sætninger.. men bliver det ikke meget tungt ?
Avatar billede martinbk Nybegynder
12. juni 2003 - 00:13 #3
hmm ingen gode idé'er ?
Avatar billede tipsen Nybegynder
12. juni 2003 - 00:14 #4
jo... if-sætninger som du selv foreslår... - tror faktisk det vil fungere fint - ikke nødvendig super tidskrævende...
Avatar billede martinbk Nybegynder
12. juni 2003 - 00:19 #5
well problemet ligger så i at hvis der kun bliver skrevet i et felt skal min query hede noget i stil med SELECT * FROM mintabel WHERE cd_nr='$_POST[cd_nr]'

men skriver jeg i 2 felter skal jeg jo have sat et AND ind i min SQL sætning.. hvilket vil give et HAV af if sætninger da jeg teoretisk skal lave en sætning til hver eneste kombination
Avatar billede martinbk Nybegynder
12. juni 2003 - 00:20 #6
if ($_POST[cd_nr] != "" && $_POST[nr_nr] == "" && $_POST[artist] != "" && $_POST[titel] == "");

det ville jo give en hel sindsyg masse ifsætninger det må da kunne gøres smartere
Avatar billede martinbk Nybegynder
12. juni 2003 - 00:22 #7
lavede denne kode:

    if ($_POST[cd_nr] != "") {
    $cd = "cd_nr LIKE '%$_POST[cd_nr]%'";
    }
    else {
    $cd = "";
    }
    if ($_POST[nr_nr] != "") {
    $nr = "nr_nr LIKE '%$_POST[nr_nr]%'";
    }
    else {
    $nr = "";
    }
    if ($_POST[artist] != "") {
    $artist = "artist LIKE '%$_POST[artist]%'";
    }
    else {
    $artist = "";
    }
    if ($_POST[titel] != "") {
    $titel = "titel LIKE '%$_POST[titel]%'";
    }
    else {
    $titel = "";
    }


så kan jeg bare lave en SELECT * FROM mintabel WHERE $cd $nr $artist $titel

problemet ligger nu i at få testet om der er mere end et felt udfylt, er der det skal de 2 variabler separeres af et AND, hvis kun et felt er udfyldt skal der jo ikke bruges noget AND,
Avatar billede tipsen Nybegynder
12. juni 2003 - 00:31 #8
$cd_nr = (isset($_POST['cd_nr'])) ? $_POST['cd_nr'] : NULL;
$nr_nr = (isset($_POST['nr_nr'])) ? $_POST['nr_nr'] : NULL;
$artist = (isset($_POST['artist'])) ? $_POST['artist'] : NULL;
$titel = (isset($_POST['titel'])) ? $_POST['titel'] : NULL;

if (isset($cd_nr) && !empty($cd_nr)) {
    $tmpsql[] = "cd_nr = '$cd_nr'";
}
if (isset($nr_nr) && !empty($nr_nr)) {
    $tmpsql[] = "nr_nr = '$nr_nr'";
}
if (isset($artist) && !empty($artist)) {
    $tmpsql[] = "artist LIKE '%$artist%'";
}
if (isset($titel) && !empty($titel)) {
    $tmpsql[] = "titel LIKE '%$titel%'";
}
$sql = "SELECT * FROM TABEL WHERE " . implode(' AND ', $tmpsql);
Avatar billede tipsen Nybegynder
12. juni 2003 - 00:32 #9
Bemærk at jeg har rettet cd_nr og nr_nr til eksakte sammenligninger i stedet for brug af LIKE som er meget langsom i forhold!
Avatar billede martinbk Nybegynder
12. juni 2003 - 00:41 #10
har kun prøvet det med en echo af SQL strengen, og det virker umiddelbart.. men vender lige tilbage når jeg en smule data i min tabel, (10-20 min)
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:00 #11
har lidt problemer, strengen ser vældig fin ud, men får alligevel en skummel fejl:

Warning: mysql_result(): supplied argument is not a valid MySQL result resource

$sql = '"'."SELECT * FROM TABEL WHERE " . implode(' AND ', $tmpsql).'"';
    $query = mysql_query($sql);
    $antal = mysql_result($query, 0);

det der burde være den relevante kode
Avatar billede tipsen Nybegynder
12. juni 2003 - 01:03 #12
Forstår ikke den ændring du har lavet til sql-sætningen!?

Prøv at udskriv den genererede sql-query hertil!
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:08 #13
"SELECT * FROM TABEL WHERE cd_nr = '1' AND nr_nr = '5' AND artist LIKE '%test%' AND titel LIKE '%tester%'"
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:08 #14
det er med min ændring, for at få " i enderne af $sql strengen
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:14 #15
tipsen: giver du en kop kaffe... min fejl... næste gang skal jeg måske evt. skifte tabel navnet til det rigtige
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:15 #16
dit kode virker upårklageligt tak for hjælpen
Avatar billede tipsen Nybegynder
12. juni 2003 - 01:22 #17
din ændring af strengen er unødvendig!
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:22 #18
yup i know.. har fjernet det
Avatar billede martinbk Nybegynder
12. juni 2003 - 01:22 #19
som sagt bare mig der sov
Avatar billede tipsen Nybegynder
12. juni 2003 - 01:26 #20
ok - jeg vil også stikke til køjs nu - har stirret mig blind på et problem med et templatesystem... :-/
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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