Avatar billede kgp43 Nybegynder
18. april 2004 - 16:37 Der er 27 kommentarer og
1 løsning

Søgning på flere variabler

Hejsa,

Jeg har sølgende query:
mysql_result(mysql_query("SELECT * FROM stations WHERE name='%$name%' AND type='$type' AND country='$country' AND state='$state' AND city='%$city%' AND status='1' ORDER BY name ASC "),0);

Får denne fejl:
Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 6 in /home/radioloa/public_html/stations_advanced_ok.php on line 83

- Er første gang jeg prøver at lave en søgning til mit site, så det er nok ikke helt optimalt :P
Avatar billede kgp43 Nybegynder
18. april 2004 - 16:38 #1
Woops. Kan se jeg har mysql_query dobbelt.
Får en parse error i stedet for :)
Avatar billede kgp43 Nybegynder
18. april 2004 - 16:39 #2
Skulle være jeg lige skulle poste queryen, efter den første rettelse:
$antal = mysql_query("SELECT * FROM stations WHERE name='%$name%' AND type='$type' AND country='$country' AND state='$state' AND city='%$city%' AND status='1' ORDER BY name ASC "),0);
Avatar billede dennismp Nybegynder
18. april 2004 - 16:41 #3
WHERE name='%$name%'
bør være
WHERE name LIKE '%$name%'

ellers bliver % ikke taget som wildcard. Det samme med city..

Er det meningen at du bruger AND imellem dem alle?
Avatar billede kgp43 Nybegynder
18. april 2004 - 16:44 #4
Det skulle være meningen, prøver mig lidt frem :)

Får stadig en parse error:
Parse error: parse error in /home/radioloa/public_html/stations_advanced_ok.php on line 83

Opdateret kode:
$antal = mysql_query("SELECT * FROM stations WHERE name LIKE '%$name%' AND type='$type' AND country='$country' AND state='$state' AND city LIKE '%$city%' AND status='1' ORDER BY name ASC "),0);
Avatar billede dennismp Nybegynder
18. april 2004 - 16:47 #5
Hvor kommer ",0);" fra? (i slutningen) - fjern det og sæt et semikolon
Avatar billede dennismp Nybegynder
18. april 2004 - 16:48 #6
Bare så du er klar over det; parse-errors og den slags er php relateret. Mysql giver kun (synlige) fejl  hvis du spørger efter dem (mysql_error()), der for er det op til dig selv at tjekke om det gik godt, og hvis det ikke gør, kalde mysql_error()
Avatar billede kgp43 Nybegynder
18. april 2004 - 16:52 #7
Ahh, okay. Var i tvivl om den skulle i php eller mysql.
Jeg smider lige en mysql_error() op.

,0) i enden skal (så vidt jeg forstår) bruges til at tælle antallet at retultater. Den anvendes i mit sideskift system (som du lige har hjulpet mig med)
Avatar billede dennismp Nybegynder
18. april 2004 - 16:55 #8
syntax;
mysql_query ( string query [, resource link_identifier]);

det skal være et resource-link (databaselink).. Så fjern lige det ,0) :-)

mit gæt på hvordan din kode skal se ud her;
$res = mysql_query("SELECT * FROM stations WHERE name='%$name%' AND type='$type' AND country='$country' AND state='$state' AND city='%$city%' AND status='1' ORDER BY name ASC ") or die(mysql_error());

$found = mysql_num_rows($res);
print "Fandt $found rækker<br />";
while($row = mysql_fetch_array($res)) {
  // vis rækkerne
}
Avatar billede kgp43 Nybegynder
18. april 2004 - 17:03 #9
Fejlen er væk, men der kommer ikke nogle posts.
Spørgsmålet er besvaret, så hvis du lægger et svar så får du point.

Jeg kan oprette er nyt spørgsmål vedr manglende resultater. Tror jeg har opbygget det forkelt
Avatar billede dennismp Nybegynder
18. april 2004 - 17:04 #10
Som du ønsker :-)
Avatar billede kgp43 Nybegynder
18. april 2004 - 17:05 #11
Takker for hjælpen
Avatar billede dennismp Nybegynder
18. april 2004 - 17:14 #12
Mulig fejl mht søgning. Hvis man nu ikke skal udfylde alle felter (fx ikke country).. så vil der komme til at stå
AND country=''
hvilket nok ikke er sandt ret ofte, så du skal nok bygge din sql sætning op med de clauses der skal gælde (og skippe dem der ikke er udfyldt)
Avatar billede kgp43 Nybegynder
18. april 2004 - 17:17 #13
Det er præcis problemet.
Har du et link til noget materiale, så jeg kan se hvordan det kan opbygges?
Avatar billede dennismp Nybegynder
18. april 2004 - 17:50 #14
Nej men jeg plejer at gøre noget i stil med

$sql = "SELECT * FROM stations WHERE 1=1 ";

if(!empty($name))
  $sql .= "AND name='%$name%' ";

if(! empty($type))
  $sql .= "AND type='$type' ";

// osv

$sql .= "AND status='1' ORDER BY name ASC ";

$res = mysql_query($sql) .. ;
Avatar billede kgp43 Nybegynder
18. april 2004 - 17:59 #15
Skal lige have en lille forklaring.

Skal "1=1" ikke fjernes? Hvis ikke, hvad er så formålet?
Hvad metyder: ".=" ? Betyder det at man tilføjer noget til variablen?
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:12 #16
Jeg har brug for noget hjælp her, har aldrig prøvet dette før.
Efter besvarelse opretter jeg et nyt spørgsmål med 60 point til dig, er det okay?


Jeg har nu følgende:


//Forming the correct query/string
$sql = "SELECT * FROM stations WHERE 1=1 ";

if(!empty($name)) {
  $sql .= "AND name='%$name%' ";
}
if(! empty($type)) {
  $sql .= "AND type='$type' ";
}
if(! empty($country)) {
  $sql .= "AND country='$country' ";
}
if(! empty($state)) {
  $sql .= "AND state='$state' ";
}
if(! empty($city)) {
  $sql .= "AND city='$city' ";
}
$sql .= "AND status='1' ORDER BY name ASC ";

- Jeg skal bruge det to steder i min kode. Det eneste kan de bruges direkte, det andet sted skal der tilføjes noget.


ex.:
$query = mysql_query("SELECT * FROM stations WHERE name='%$name%' AND type='$type' AND country='$country' AND state='$state' AND city='%$city%' AND status='1' ORDER BY name ASC LIMIT $vis_fra, $pr_side") or die(mysql_error());

Skal laves om til noget ala: mysql_query($sql LIMIT $vis_fra, $pr_side) or die(mysql_error());
- Ved bare ikke hvad der er "lovligt"

Den anden ser sådan ud (skal bruges sidst):
$antal = mysql_query("SELECT * FROM stations WHERE name='%$name%' AND type='$type' AND country='$country' AND state='$state' AND city='%$city%' AND status='1' ORDER BY name ASC ") or die(mysql_error());
- Kan skiftes ud uden problemer (forhåbentlig)
Avatar billede dennismp Nybegynder
18. april 2004 - 18:22 #17
>>Skal "1=1" ikke fjernes? Hvis ikke, hvad er så formålet?

Det kan du godt fjerne da det altid er true... Men så bliver det lidt mere besværligt.

Forstil dig;
if(!empty($name)) {
  $sql .= "AND name='%$name%' ";
}
if(! empty($type)) {
  $sql .= "AND type='$type' ";
}
Hvis navn ikke er empty, skal der stå where. Ok nem nok.
Hvis navn ikke er empty og type heller ikke er, så skal der stå WHERE(ved name) og AND (ved type).
Hvis navn er empty og type ikke er så skal der står WHERE ved type nu..

Så du skal lave en masse tjeks - så jeg syntes det er nemmere at have den "dumme" linje og så vide at jeg altid kan skrive "AND etellerandet"

>>Hvad metyder: ".=" ? Betyder det at man tilføjer noget til variablen?
det er præcist det samme som: $sql = $sql . "...";

>> mysql_query($sql LIMIT $vis_fra, $pr_side) or die(mysql_error());
skal være
mysql_query("$sql LIMIT $vis_fra, $pr_side") or die(mysql_error());
så burde det virke

den sidste burde bare virke fint :-)
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:28 #18
super :)
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:34 #19
Den kommer ikke med nogle fejl. Hvis jeg skriver et navn på en station så sker der intet, hvis jeg derimod undlader at skrive noget, så poster den samtlige stationer i db'en
Avatar billede dennismp Nybegynder
18. april 2004 - 18:36 #20
skriv sql'en ud, og lad os se på det.
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:40 #21
ahhh, glemmer altid noget :P

//Forming the correct query/string
$sql = "SELECT * FROM stations WHERE 1=1 ";

if(!empty($name)) {
  $sql .= "AND name='%$name%' ";
}
if(! empty($type)) {
  $sql .= "AND type='$type' ";
}
if(! empty($country)) {
  $sql .= "AND country='$country' ";
}
if(! empty($state)) {
  $sql .= "AND state='$state' ";
}
if(! empty($city)) {
  $sql .= "AND city='$city' ";
}
$sql .= "AND status='1' ORDER BY name ASC ";

-----
$query = mysql_query("$sql LIMIT $vis_fra, $pr_side") or die(mysql_error());
-----
$antal = mysql_query($sql) or die(mysql_error());
$antal = mysql_num_rows($antal);
-----
Avatar billede dennismp Nybegynder
18. april 2004 - 18:46 #22
Jeg tænkte nærmere på at på linjen over mysql_query();

altså:
print "SQL: $sql<br />";
$query = mysql_query("$sql LIMIT $vis_fra, $pr_side") or die(mysql_error());

og så give det output med sql'en.. Så vi kan se hvad databasen får. Sørg for at det er den SQL der ikke virker (returnere 0 rækker)
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:49 #23
SQL: SELECT * FROM stations WHERE 1=1 AND name='%boogie%' AND status='1' ORDER BY name ASC
Avatar billede dennismp Nybegynder
18. april 2004 - 18:54 #24
Du har glemt noget :-) (LIKE istedet for =, se mit første indlæg i dette spørgsmål)
Avatar billede kgp43 Nybegynder
18. april 2004 - 18:59 #25
hehe... hvilken dag, det virker nu :D
Tråd oprettet med ekstra point.

Takker mange gange (endnu engang)
Avatar billede kgp43 Nybegynder
18. april 2004 - 19:04 #26
Det virker jo præcis som det skal (og hvad jeg håbede på), det er sku for fedt.

Er forresten en ganske simpel måde du opbygger det på, var bange for at det skulle bliver uoverskueligt, men det er superb.
Avatar billede dennismp Nybegynder
18. april 2004 - 19:07 #27
Jeg har lært det af bitter erfaring :-)

Tak for pointene - held og lykke med projektet.
Avatar billede kgp43 Nybegynder
18. april 2004 - 19:27 #28
takker :)
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