Avatar billede mibu Nybegynder
28. januar 2006 - 23:35 Der er 40 kommentarer og
1 løsning

Select fra fra 1 - 3 felter skal kalde hele rækken.

Hej eksperter
Jeg har bøvlet en hel del med dette problem.
Fra søgefelterne "navn" "adr" "tlf" skal man kunne skrive et valgfrit navn, adr eller tlf, når der trykkes på submit hentes alle emner der passer det/de indtastede søgeord. Skrives der ingenting hentes hele tabellen.
Søgeresultatet skulle så gerne kaldes frem på en ny side.
Jeg har prøvet flere gange men jeg kan kun få alle emner frem på engang.
Avatar billede jakobdo Ekspert
29. januar 2006 - 00:12 #1
Håber dette kan bruges til noget inspiration:

//forbind til databasen...

$whereArr = array();
if(isset($_POST['navn']))
{
    $navn = mysql_real_escape_string($_POST['navn']);   
    $whereArr[] = "navn LIKE '%" . $navn . "%' ";
}

if(isset($_POST['adr']))
{
    $adr = mysql_real_escape_string($_POST['adr']);   
    $whereArr[] = "adresse LIKE '%" . $adr . "%' ";
}

if(isset($_POST['tlf']))
{
    $tlf = mysql_real_escape_string($_POST['tlf']);   
    $whereArr[] = "telefon LIKE '%" . $tlf . "%' ";
}

$where = "";
if(count($whereArr)>0)
{
    $where = "WHERE ";
    foreach($where as $search)
    {
        $where .= $search;
    }
}

$query = mysql_query("SELECT * FROM tabel $where");
if(mysql_num_rows($query)>0)
{
    while($row = mysql_fetch_assoc($query))
    {
        echo $row['feltet'];
    }
}
Avatar billede mibu Nybegynder
29. januar 2006 - 08:55 #2
Jacobdo! Det var lige det jeg skulle bruge. Skal bare ha´ sat resultattet pænt op.

Smid et svar!

Michael
Avatar billede nielle Nybegynder
29. januar 2006 - 09:28 #3
Jeg synes at der mangler en OR eller AND mellem de enkelte led i $where...

Dette kan man sagtens klare med noget passende logik i denne kodeblok:

$where = "";
if(count($whereArr)>0)
{
    $where = "WHERE ";
    foreach($where as $search)
    {
        $where .= $search;
    }
}

- eller man kan simpelthen bruge funktionen implode() i stedet:

$where = "";
if (count($whereArr)>0)
{
    $where .= "WHERE " . implode(" AND ", $whereArr);  // alternativt " OR ".
}

Læs mere om implode() her:

http://dk.php.net/implode
Avatar billede mibu Nybegynder
29. januar 2006 - 10:07 #4
Okay jeg var lidt for hurtig! Jeg får fejl i denne linie.
    foreach($where as $search) //Warning: Invalid argument supplied for foreach()

//Min tilrettede kode
<?
//db_access
include("database.php");


//Henter forespørgelse
$whereArr = array();
if(isset($_POST['efternavn']))
{
    $navn = mysql_real_escape_string($_POST['efternavn']);   
    $whereArr[] = "efternavn LIKE '%" . $navn . "%' ";
}

if(isset($_POST['adresse']))
{
    $adr = mysql_real_escape_string($_POST['adresse']);   
    $whereArr[] = "adresse LIKE '%" . $adr . "%' ";
}

if(isset($_POST['tlf']))
{
    $tlf = mysql_real_escape_string($_POST['tlf']);   
    $whereArr[] = "tlf LIKE '%" . $tlf . "%' ";
}

$where = "";
if(count($whereArr)>0)
{
    $where = "indtast";
    foreach($where as $search)
    {
        $where .= $search;
    }
}

$query = mysql_query("SELECT * FROM klienter $where");
if(mysql_num_rows($query)>0)
{
  while($row = mysql_fetch_assoc($query))
    {
     
        echo "<table border=0 width=300>
<tr><td>".$row["fornavn"]."&nbsp;".$row["efternavn"]."</td></tr>
<tr><td>".$row["adresse"]."</td></tr>
<tr><td>".$row["adresse2"]."</td></tr>
<tr><td>".$row["postnr"]."&nbsp&nbsp".$row["byen"]."</td></tr>
<tr><td>Telefon:&nbsp;".$row["tlf"]."</td></tr>
<tr><td>RKI&nbsp:&nbsp;".$row["rki"]."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klient Id.nr.:&nbsp;".$row[id]."</td></tr>
<tr><td>Oprettet af&nbsp;".$row["vet"]."&nbsp;d.&nbsp".$row["dato"]."</td></tr><br>
<tr><td>Kommentar:&nbsp;</tr><tr><td>".$row["evt"]."</td></tr>
<tr><td bgcolor=#C0C0cc>&nbsp</td></tr></table>";

    }
}

?>

Kan du se min fejl?
Avatar billede nielle Nybegynder
29. januar 2006 - 10:15 #5
Du skal rette:

foreach($where as $search)

- til:

foreach($whereArr as $search)

Men erstat hellere den der kodeblok med en implode() som vist i 29/01-2006 09:28:18.
Avatar billede mibu Nybegynder
29. januar 2006 - 11:16 #6
nielle
Har skiftet din kodeblok ind, så kommer denne her linie //if(mysql_num_rows($query)>0) ud med denne fejl ""Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource".
Avatar billede nielle Nybegynder
29. januar 2006 - 11:21 #7
Prøv at ændre denne linje:

$query = mysql_query("SELECT * FROM klienter $where");

- til:

$sql = "SELECT * FROM klienter $where";
echo "DEBUG: " . $sql . "<br>";
$query = mysql_query($sql) or die(mysql_error());

- og fortæl så hvad du får ud af den.
Avatar billede mibu Nybegynder
29. januar 2006 - 11:29 #8
Din søgning i databasens DEBUG: SELECT * FROM klienter indtast efternavn LIKE '%%' or adresse LIKE '%%' or tlf LIKE '%%'
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 'efternavn LIKE '%%' or adresse LIKE '%%' or tlf LIKE '%%'' at
Avatar billede nielle Nybegynder
29. januar 2006 - 11:46 #9
Prøv med dette i stedet:

//Henter forespørgelse
$whereArr = array();
if (isset($_POST['efternavn']) && trim($_POST['efternavn']) != "")
{
    $navn = mysql_real_escape_string($_POST['efternavn']);   
    $whereArr[] = "efternavn LIKE '%" . $navn . "%' ";
}

if (isset($_POST['adresse']) && trim($_POST['adresse']) != "")
{
    $adr = mysql_real_escape_string($_POST['adresse']);   
    $whereArr[] = "adresse LIKE '%" . $adr . "%' ";
}

if (isset($_POST['tlf']) && trim($_POST['tlf']) != "")
{
    $tlf = mysql_real_escape_string($_POST['tlf']);   
    $whereArr[] = "tlf LIKE '%" . $tlf . "%' ";
}
Avatar billede jakobdo Ekspert
29. januar 2006 - 12:05 #10
Du får ihf lige et svar fra mig! (kan se Nielle er ved at rette min slamkode til) :o)
Avatar billede jakobdo Ekspert
29. januar 2006 - 12:05 #11
Prøver lige igen!
Avatar billede mibu Nybegynder
29. januar 2006 - 12:13 #12
OK nu får jeg ingen fejl, men et tomt skema.
//kode
//db_access
include("database.php");


//Henter forespørgelse
$whereArr = array();
if (isset($_POST['efternavn']) && trim($_POST['efternavn']) != "")
{
    $efternavn = mysql_real_escape_string($_POST['efternavn']);   
    $whereArr[] = "efternavn LIKE '%" . $navn . "%' ";
}

if (isset($_POST['adresse']) && trim($_POST['adresse']) != "")
{
    $adresse = mysql_real_escape_string($_POST['adresse']);   
    $whereArr[] = "adresse LIKE '%" . $adr . "%' ";
}

if (isset($_POST['tlf']) && trim($_POST['tlf']) != "")
{
    $tlf = mysql_real_escape_string($_POST['tlf']);   
    $whereArr[] = "tlf LIKE '%" . $tlf . "%' ";
}

$where = "";
if (count($whereArr)>0)
{
    $where .= "indtast " . implode(" or ", $whereArr);  // alternativt " OR ".
}


        echo "<table border=0 width=300>
<tr><td>".$row["fornavn"]."&nbsp;".$row["efternavn"]."</td></tr>
<tr><td>".$row["adresse"]."</td></tr>
<tr><td>".$row["adresse2"]."</td></tr>
<tr><td>".$row["postnr"]."&nbsp&nbsp".$row["byen"]."</td></tr>
<tr><td>Telefon:&nbsp;".$row["tlf"]."</td></tr>
<tr><td>RKI&nbsp:&nbsp;".$row["rki"]."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klient Id.nr.:&nbsp;".$row[id]."</td></tr>
<tr><td>Oprettet af&nbsp;".$row["vet"]."&nbsp;d.&nbsp".$row["dato"]."</td></tr><br>
<tr><td>Kommentar:&nbsp;</tr><tr><td>".$row["evt"]."</td></tr>
<tr><td bgcolor=#C0C0cc>&nbsp</td></tr></table>";



?>
Avatar billede mibu Nybegynder
29. januar 2006 - 12:19 #13
Hvis det her kommer til at virke, skal der såmen nok blive point til jer begge. Jeg var aldrig kommet så langt uden jer, og lidt har jeg jo nok lært undervejs.
Avatar billede mibu Nybegynder
29. januar 2006 - 12:22 #14
DAMM! Jeg skal lige i byen. kommer senere!
Avatar billede jakobdo Ekspert
29. januar 2006 - 14:41 #15
I din sidste postede kode, der mangler du at "skyde" sql'en af:
$query = mysql_query("SELECT * FROM klienter $where");
while($row = mysql_fetch_assoc($query))
{
  //din tabel kode fra dit indlæg: 29/01-2006 12:13:16
  echo "<table.......
}
Avatar billede nielle Nybegynder
29. januar 2006 - 19:03 #16
Har du fået afprøvet det?
Avatar billede mibu Nybegynder
29. januar 2006 - 21:43 #17
Ja jeg har prøvet det nu. (familien kaldte) det virke fint med blank søgning. Men ved søgning på navn,adr, eller tlf sker der dette:
"Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource" (samtidig bryder mine tablerammer i stykker)
//Min kode ser nu sådan ud:
<?
//db_access
include("database.php");


//Henter forespørgelse
$whereArr = array();
if (isset($_POST['efternavn']) && trim($_POST['efternavn']) != "")
{
    $efternavn = mysql_real_escape_string($_POST['efternavn']);   
    $whereArr[] = "efternavn LIKE '%" . $navn . "%' ";
}

if (isset($_POST['adresse']) && trim($_POST['adresse']) != "")
{
    $adresse = mysql_real_escape_string($_POST['adresse']);   
    $whereArr[] = "adresse LIKE '%" . $adr . "%' ";
}

if (isset($_POST['tlf']) && trim($_POST['tlf']) != "")
{
    $tlf = mysql_real_escape_string($_POST['tlf']);   
    $whereArr[] = "tlf LIKE '%" . $tlf . "%' ";
}

$where = "";
if (count($whereArr)>0)
{
    $where .= "indtast " . implode(" or ", $whereArr);  // alternativt " OR ".
}

$query = mysql_query("SELECT * FROM klienter $where");
while($row = mysql_fetch_assoc($query))


{
        echo "<table border=0 width=300>
<tr><td>".$row["fornavn"]."&nbsp;".$row["efternavn"]."</td></tr>
<tr><td>".$row["adresse"]."</td></tr>
<tr><td>".$row["adresse2"]."</td></tr>
<tr><td>".$row["postnr"]."&nbsp&nbsp".$row["byen"]."</td></tr>
<tr><td>Telefon:&nbsp;".$row["tlf"]."</td></tr>
<tr><td>RKI&nbsp:&nbsp;".$row["rki"]."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klient Id.nr.:&nbsp;".$row[id]."</td></tr>
<tr><td>Oprettet af&nbsp;".$row["vet"]."&nbsp;d.&nbsp".$row["dato"]."</td></tr><br>
<tr><td>Kommentar:&nbsp;</tr><tr><td>".$row["evt"]."</td></tr>
<tr><td bgcolor=#C0C0cc>&nbsp</td></tr></table>";
}


?>
Avatar billede mibu Nybegynder
29. januar 2006 - 21:49 #18
fejlen ligger angiveligt i denne linie:
//while($row = mysql_fetch_assoc($query))
Avatar billede nielle Nybegynder
29. januar 2006 - 21:49 #19
Prøv lige med den debug-kode som jeg skrev i 29/01-2006 11:21:33.

Hvad skriver den når det går galt?
Avatar billede nielle Nybegynder
29. januar 2006 - 22:01 #20
Jeg tror at jeg kan se fejlen. Ret:

$where = "";
if (count($whereArr)>0)
{
    $where .= "indtast " . implode(" or ", $whereArr);  // alternativt " OR ".
}

- til:

$where = "";
if (count($whereArr)>0)
{
    $where .= "WHERE " . implode(" or ", $whereArr);  // alternativt " OR ".
}
Avatar billede mibu Nybegynder
29. januar 2006 - 22:05 #21
DEBUG: SELECT * FROM klienter indtast efternavn LIKE '%%'
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 'efternavn LIKE '%%'' at line 1
Avatar billede jakobdo Ekspert
29. januar 2006 - 22:09 #22
Se lige din kode:
$efternavn = mysql_real_escape_string($_POST['efternavn']); 
    $whereArr[] = "efternavn LIKE '%" . $navn . "%' ";

Du skal selvfølgelig bruge:
    $whereArr[] = "efternavn LIKE '%" . $efternavn . "%' ";
Avatar billede mibu Nybegynder
29. januar 2006 - 22:14 #23
nielle
Er rettet iflg. dit forslag, nu kommer der resultat i ved alle forespørgsler, men stadig hele databasens emner.
Både ved blank søgning og ved indtastning i et eller flere felter.
Avatar billede nielle Nybegynder
29. januar 2006 - 22:17 #24
Kan det skyldes at hver eneste række i din database stemmer over ens med mindst et af søgekriterierne? Prøv evt. med:

$where .= "WHERE " . implode(" AND ", $whereArr);  // alternativt " OR "

- altså med AND-søgning i stedet for en OR-søgning.
Avatar billede mibu Nybegynder
29. januar 2006 - 22:20 #25
Det har jeg selv lige prøvet! Samme resultat.
Kan det være fordi min søgeform har 3 indtast feltet, men kun en submit?
Avatar billede nielle Nybegynder
29. januar 2006 - 22:21 #26
Nej, det lyder ikke som forklaringen. Prøv lige at poste resultatet af en debug-udskrift af en af de SQL'er som giver alt for mange resultater.
Avatar billede mibu Nybegynder
29. januar 2006 - 22:24 #27
DEBUG: SELECT * FROM klienter WHERE efternavn LIKE '%%'
Avatar billede nielle Nybegynder
29. januar 2006 - 22:26 #28
Se lige jakobdo's rettelse 29/01-2006 22:09:30 - der var nelig en lille fejl ved netop efternavn.
Avatar billede nielle Nybegynder
29. januar 2006 - 22:27 #29
... og også her:

$adresse = mysql_real_escape_string($_POST['adresse']);   
$whereArr[] = "adresse LIKE '%" . $adr . "%' ";

Den sidste linje skal rettes til:

$whereArr[] = "adresse LIKE '%" . $adresse . "%' ";
Avatar billede mibu Nybegynder
29. januar 2006 - 22:34 #30
KÆRE VENNER!!
I LÆSER NU EN HILSEN FRA AFTENES LYKKELIGST MAND!!!!
JEG ACCEPTER LIGE jakobdo´s SVAR, OG SÅ LAVER JEG ET SPØGSMÅL MERE TIL nielle:

Tusind mange tak for hjælpen, og tålmodigheden.

Michael
Avatar billede nielle Nybegynder
29. januar 2006 - 22:35 #31
Ingen grund til det - og i øvrigt må du faktisk ikke give mere en d maks. 200 point for et spørgsmål.
Avatar billede mibu Nybegynder
29. januar 2006 - 22:36 #32
Ups har gjort det! Og i har også fortjent det!
Avatar billede jakobdo Ekspert
30. januar 2006 - 07:48 #33
Nielle, vil du have 50 point her fra?
Så har vi delt i porten?
Avatar billede jakobdo Ekspert
30. januar 2006 - 07:48 #34
Og mibu, tak for point!
Avatar billede mibu Nybegynder
30. januar 2006 - 09:43 #35
Jeg har en lille forsigtig forspørgels.
Når jeg i min nye fine søgeformular, søger på et ord der ikke findes i databasen.
Så kommer der naturligvis ingenting frem. Men min brække lidt ud af rammen.
SPØGSMÅL:
Kan man rimelig simpelt lave en "default" kunde som dukker op "IF NO MATCH" ?
Kunden kan jo opettes i basen og hentes via id.

PS. Gør nu ikke noget stort arbejde ud af det. Jeg kan jo også oprette et nyt spørgsmål!
Avatar billede jakobdo Ekspert
30. januar 2006 - 09:47 #36
Du kan efter din $query = mysql_query()...
Lave:
if(mysq_num_rows($query)>0)
{
//Vi har fundet noget...
}
else
{
//Vi fandt ikke noget, vis din default besked.
}
Avatar billede nielle Nybegynder
30. januar 2006 - 09:52 #37
Ja, du kan sagtens lave et default-resultat til hvis den oprindelige søgning ikke giver noget resultat:

$query = mysql_query("SELECT * FROM klienter $where");
if (mysql_num_rows($query) > 0)
{
    while ($row = mysql_fetch_assoc($query))
    {
        echo "<table border=0 width=300>
        <tr><td>".$row["fornavn"]."&nbsp;".$row["efternavn"]."</td></tr>
        <tr><td>".$row["adresse"]."</td></tr>
        <tr><td>".$row["adresse2"]."</td></tr>
        <tr><td>".$row["postnr"]."&nbsp&nbsp".$row["byen"]."</td></tr>
        <tr><td>Telefon:&nbsp;".$row["tlf"]."</td></tr>
        <tr><td>RKI&nbsp:&nbsp;".$row["rki"]."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klient Id.nr.:&nbsp;".$row[id]."</td></tr>
        <tr><td>Oprettet af&nbsp;".$row["vet"]."&nbsp;d.&nbsp".$row["dato"]."</td></tr><br>
        <tr><td>Kommentar:&nbsp;</tr><tr><td>".$row["evt"]."</td></tr>
    <tr><td bgcolor=#C0C0cc>&nbsp</td></tr></table>";
    }
}
else
{
    // Udtræk default-resultat:
    $sql = "SELECT * FROM klienter WHERE id=42";
    $query = mysql_query("SELECT * FROM klienter $where");

    // Og så koden for at vise oplysningerne her...
}
Avatar billede nielle Nybegynder
30. januar 2006 - 09:52 #38
:*)
Avatar billede nielle Nybegynder
30. januar 2006 - 09:54 #39
Nielle, vil du have 50 point her fra? > Helt ok med mig :^)
Avatar billede jakobdo Ekspert
30. januar 2006 - 09:55 #40
Avatar billede mibu Nybegynder
30. januar 2006 - 10:20 #41
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
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

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel