zoeken in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sam Koster

Sam Koster

27/04/2009 03:16:00
Quote Anchor link
Als ik zoek in mijn database met LIKE %% krijg ik netjes mijn return value's, maar hoe moet ik nu zoeken als ik meerdere opties heb??

Ik heb 3 opties waarop gezocht kan worden.
optie 1: naam
optie 2: leeftijd
optie 3: plaats

We noemen ze even n/l/p

Als ik zoek in de database gebruik ik de $_GET value, zodat de link zoek.php?n=&l=&p=&action=Zoeken word.

Hoe krijg ik de mysql lijn nu goed? Dit heb ik nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$result = mysql_query(" SELECT * FROM profielen WHERE naam LIKE %n% && leeftijd LIKE %l% && plaats LIKE %p% ORDER BY id DESC LIMIT 5" );


AND en OR en && lijken niet te werken:S

Ik moet dus kunnen zoeken op een van de drie, 2 van de 3 of alle drie de opties, maar vreemd genoeg blijft de pagina leeg:(

Iemand een optie???

Owja, volgend probleempje: Hoe strip ik nu de leeftijd?? Want ze kunnen zoeken als 18-25/26-30/31-35 etc etc. Gewoon een $string = htmlspecialchars ($string, ENT_QUOTES);??
 
PHP hulp

PHP hulp

25/11/2024 05:07:54
 
Jelmer -

Jelmer -

27/04/2009 08:33:00
Quote Anchor link
AND zou je moeten hebben om verder (specifieker) te willen filteren, maar filteren op lege waarden gaat niet zo lekker.

Voorbeeldje van hoe het zou kunnen. Je voegt als het ware filters toe naarmate er meer waarden ingevuld zijn. Verder kan dit ook zoeken op leeftijden 24-36 (waar hij BETWEEN 24 AND 36 van maakt)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

$sql_atoms
= array();

if(!empty($_GET['n']))
    $sql_atoms[] = "naam LIKE '%" . mysql_real_escape_string($_GET['n']) . "%'";

if(!empty($_GET['l']))
    if(preg_match('{^(\d+)\-(\d+)$}', $_GET['l'], $match))
        $sql_atoms[] = "leeftijd BETWEEN " . $match[1] . " AND " . $match[2];
    else
        $sql_atoms[] = "leeftijd = " . intval($_GET['l']);

if(!empty($_GET['p']))
    $sql_atoms[] = "plaats LIKE '%" . mysql_real_escape_string($_GET['p']) . "%'";

if(count($sql_atoms) == 0)
    $sql_condition = '';
else
    $sql_condition = 'WHERE ' . implode(' AND ', $sql_atoms);

$sql_query = "
    SELECT
        *
    FROM
        profielen
    $sql_condition
    ORDER BY
        id DESC
    LIMIT 5"
;

echo $sql_query;

?>

Ik doe dat scheiden van leeftijd nu met preg_match omdat het dan met één regeltje code kan, maar je zou dat ook met explode kunnen doen.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Sam Koster

Sam Koster

27/04/2009 17:55:00
Quote Anchor link
Ik heb het even geprobeerd, maar krijg toch een aantal foutmeldingen, o.a:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 'LIKE '%rotterdam%'' at line 1
als ik op plaats zoek, of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 'BETWEEN 18 AND 25' at line 1


Dit is nu de volledige code nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?
$sql_atoms
= array();

if(!empty($_GET['naam']))
    $sql_atoms[] = "naam LIKE '%" . mysql_real_escape_string($_GET['naam']) . "%'";

if(!empty($_GET['leeftijd']))
if(preg_match('{^(\d+)\-(\d+)$}', $_GET['leeftijd'], $match))
    $sql_atoms[] = "leeftijd BETWEEN " . $match[1] . " AND " . $match[2];
else
    $sql_atoms[] = "leeftijd = " . intval($_GET['leeftijd']);

if(!empty($_GET['plaats']))
    $sql_atoms[] = "plaats LIKE '%" . mysql_real_escape_string($_GET['plaats']) . "%'";

if(count($sql_atoms) == 0)
    $sql_condition = '';
else
    $sql_condition = implode(' AND ', $sql_atoms);

if (isset($_GET['p'])) {
   $allpageno = $_GET['p'];
}
else {
   $allpageno = 1;
}
// if

$query = mysql_query("SELECT count(*) FROM profielen $sql_condition") or die(mysql_error());
$query_data = mysql_fetch_row($query);
$numrows = $query_data[0];

$rows_per_page = 24;
$column = 4;
$lastpage      = ceil($numrows/$rows_per_page);

$allpageno = (int)$allpageno;
if ($allpageno > $lastpage) {
   $allpageno = $lastpage;
}
// if
if ($allpageno < 1) {
   $allpageno = 1;
}
// if

$limit = 'LIMIT ' .($allpageno - 1) * $rows_per_page .',' .$rows_per_page;


$query = "SELECT * FROM profielen $sql_condition";
$result = mysql_query($query);

//de teller op 0 zetten
$i=0;

?>

        <div class="nav">
<?
if ($allpageno == 1) {
   echo "<b> &laquo; &lsaquo; </b>";
}
else {
   echo "<a href='1.htm' rel='countrycontainer'><b>&laquo;</b></a>";
   $prevpage = $allpageno-1;
   echo "<a href='$prevpage.htm' rel='countrycontainer'><b>&lsaquo;</b></a>";
}
// if
echo "<b> (Pagina $allpageno van de $lastpage ) </b>";
if ($allpageno == $lastpage) {
   echo "<b> &rsaquo; &raquo; </b>";
}
else {
   $nextpage = $allpageno+1;
   echo "<a href='$nextpage.htm' rel='countrycontainer'><b>&rsaquo;</b></a>";
   echo "<a href='$lastpage.htm' rel='countrycontainer'><b>&raquo;</b></a>";
}
// if

?>
</div>
<?


echo '<table>';
echo '    <tr>';

while($rij = mysql_fetch_assoc($result))
{

?>

<? $big = formatText1($rij["naam"]);?>
<td><a href="<?php echo $siteadres; ?>model/<? echo "$big"; ?>"><img src="<? echo "$big"; ?>/pictures/01.jpg" alt="klik voor mijn profiel" class="combi_image" /><br /><center><font color="black"><? echo "$big"; ?></font></center></a></td>
<?
     $i
++;
    if ( $i % $column == 0 )
    {


        echo '</tr>';
        echo '<tr>';

    }
}

echo '</tr></table>';  
?>

        <div class="nav">
<?
if ($allpageno == 1) {
   echo "<b> &laquo; &lsaquo; </b>";
}
else {
   echo "<a href='1.htm' rel='countrycontainer'><b>&laquo;</b></a>";
   $prevpage = $allpageno-1;
   echo "<a href='$prevpage.htm' rel='countrycontainer'><b>&lsaquo;</b></a>";
}
// if
echo "<b> (Pagina $allpageno van de $lastpage ) </b>";
if ($allpageno == $lastpage) {
   echo "<b> &rsaquo; &raquo; </b>";
}
else {
   $nextpage = $allpageno+1;
   echo "<a href='$nextpage.htm' rel='countrycontainer'><b>&rsaquo;</b></a>";
   echo "<a href='$lastpage.htm' rel='countrycontainer'><b>&raquo;</b></a>";
}
// if

?>
</div>


via de .htaccess is de ?p= veranderd in *.htm en $big word uit een functie gehaald (via string replace).

Sorry voor de groote lap scripttext maar ziet iemand wat ik fout doe??:S
 
Jelmer -

Jelmer -

27/04/2009 20:09:00
Quote Anchor link
Je mist (ik ook trouwens) "WHERE" in de query. Ik zal m'n script hierboven even fixen, het enige wat zou moeten gebeuren is WHERE voor de implode-aanroep zetten.
 
Sam Koster

Sam Koster

27/04/2009 20:12:00
Quote Anchor link
Thnx, probleem zelf ook geglijk even gefixed en het werkt:).. nu nog even seo klaar maken, en het is weer in orde:).. thnx voor de hulp:)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.