Zoekfunctie probleem
Dit is de zoekpagina.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
echo "<HTML>\n
<HEAD><TITLE>Zoeken</TITLE></HEAD>
<BODY>
<p><b>Zoek in de database:</b></p>
<p>
<FORM METHOD=\"POST\" ACTION=\"resultaat.php\">
Postcode van: <input type=\"number\" name=\"postcode1\" size=\"6\">
tot: <input type=\"text\" name=\"postcode2\" size=\"6\"><br>
<input type=\"submit\" name=\"submit\" value=\"Zoeken\">
</p>
</BODY>
</HTML>";
?>
echo "<HTML>\n
<HEAD><TITLE>Zoeken</TITLE></HEAD>
<BODY>
<p><b>Zoek in de database:</b></p>
<p>
<FORM METHOD=\"POST\" ACTION=\"resultaat.php\">
Postcode van: <input type=\"number\" name=\"postcode1\" size=\"6\">
tot: <input type=\"text\" name=\"postcode2\" size=\"6\"><br>
<input type=\"submit\" name=\"submit\" value=\"Zoeken\">
</p>
</BODY>
</HTML>";
?>
Dit is de resultaatpagina.
Code (php)
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
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
<?
//-- natuurlijk moet er eerst een connectie met de database worden gemaakt:
if (!@mysql_select_db("joomla", @mysql_connect("localhost", "root", "")))
{
echo "Er kan geen database connectie gemaakt worden.";
exit();
}
//-- $HTTP_POST_VARS[zoekterm] is de naam van het zoekveld in het formulier wat we
//-- hebben gemaakt in het vorige 'hoofdstuk'. Dit is dus de SQL code:
//-- $sql = "SELECT id,name FROM jos_users WHERE name LIKE '%$HTTP_POST_VARS[zoekterm]%'";
$sql = "SELECT Jos_users.name, jos_comprofiler.cb_adres, cb_postcode, jos_comprofiler.cb_plaats FROM jos_comprofiler INNER JOIN Jos_users ON jos_comprofiler.id = Jos_users.id WHERE cb_postcode BETWEEN '%$HTTP_POST_VARS[postcode1]%' AND '%$HTTP_POST_VARS[postcode2]%'";
//-- voer de SQL code uit en zet dit in een variabele zodat we zometeen kunnen
//-- kijken of er een resultaat is
$res = mysql_query($sql);
//-- bekijk nu of er een resultaat is, of het zoekwoord dus gevonden is of niet
{
//-- er is een resultaat gevonden, toon de resultaten via een while () loop
while ($row = mysql_fetch_array($res))
{
echo "<p><b>$row[name]</b><br>";
echo "$row[cb_adres]<br>";
echo "$row[cb_postcode]<br>";
echo "$row[cb_plaats]</p>";
}
echo "<a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a><BR>";
}
?>
//-- natuurlijk moet er eerst een connectie met de database worden gemaakt:
if (!@mysql_select_db("joomla", @mysql_connect("localhost", "root", "")))
{
echo "Er kan geen database connectie gemaakt worden.";
exit();
}
//-- $HTTP_POST_VARS[zoekterm] is de naam van het zoekveld in het formulier wat we
//-- hebben gemaakt in het vorige 'hoofdstuk'. Dit is dus de SQL code:
//-- $sql = "SELECT id,name FROM jos_users WHERE name LIKE '%$HTTP_POST_VARS[zoekterm]%'";
$sql = "SELECT Jos_users.name, jos_comprofiler.cb_adres, cb_postcode, jos_comprofiler.cb_plaats FROM jos_comprofiler INNER JOIN Jos_users ON jos_comprofiler.id = Jos_users.id WHERE cb_postcode BETWEEN '%$HTTP_POST_VARS[postcode1]%' AND '%$HTTP_POST_VARS[postcode2]%'";
//-- voer de SQL code uit en zet dit in een variabele zodat we zometeen kunnen
//-- kijken of er een resultaat is
$res = mysql_query($sql);
//-- bekijk nu of er een resultaat is, of het zoekwoord dus gevonden is of niet
{
//-- er is een resultaat gevonden, toon de resultaten via een while () loop
while ($row = mysql_fetch_array($res))
{
echo "<p><b>$row[name]</b><br>";
echo "$row[cb_adres]<br>";
echo "$row[cb_postcode]<br>";
echo "$row[cb_plaats]</p>";
}
echo "<a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a><BR>";
}
?>
Als ik laat zoeken op enkel 1 postcode dan werkt het wel, maar met de functie BETWEEN lukt het niet. Wie kan mij helpen met dit 'waarschijnlijk' makkelijke vraag.
Overigens: $HTTP_POST_VARS[postcode1] is tegenwoordig $_POST['postcode1']
Edit:
net lokaal getest, en BETWEEN werkt ook met strings, dus dat kan het probleem niet zijn
net lokaal getest, en BETWEEN werkt ook met strings, dus dat kan het probleem niet zijn
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Dank voor je snelle reactie. Ik heb net ook getest om alleen met cijfers in te vullen bij de postcodes maar dit werkt ook niet. Ik zal het zo testen met $_POST['postcode1'].
MAak dus een veld: postcodenummer en postcodeletters (Ik ga ervan uit dat Jan aan het testen is geslagen) wanneer de test van Jan mislukt. Dan kan je wel controleren op postcodes met de BETWEEN functie.
Belangrijk verschil :)
Robert schreef op 25.10.2006 10:53:
Wat wel prima werkt, is de postcode velden splitsen. Voor een locatie zijn de nummers van een postcode bedoeld, de letters, is meer om ook de straat er bij te pakken.
MAak dus een veld: postcodenummer en postcodeletters (Ik ga ervan uit dat Jan aan het testen is geslagen) wanneer de test van Jan mislukt. Dan kan je wel controleren op postcodes met de BETWEEN functie.
MAak dus een veld: postcodenummer en postcodeletters (Ik ga ervan uit dat Jan aan het testen is geslagen) wanneer de test van Jan mislukt. Dan kan je wel controleren op postcodes met de BETWEEN functie.
Dat is een goeie. Wat ook kan is dat je met preg_replace alle niet-alfanumerieke tekens eruit haalt en daarna checkt of je wel 4 cijfers, gevolgd door 2 letters overhoudt.
Ik ga hier zometeen weer mee aan de slag. Mn computer is net uitgevallen dus kan daar even niet op werken. :(
Ik heb de query aangepast naar jullie bevindingen. In het veld cb_postcode staat nu 4 cijfers ipv 4 cijfers + 2 letters. Alleen weer zonder resultaten.
Barman schreef op 25.10.2006 10:54:
Let op: Het is geen LEFT JOIN, maar LEFT OUTER JOIN.
Belangrijk verschil :)
Belangrijk verschil :)
Het keyword OUTER heeft toch alleen met ODBC compatability te maken?
Edit:
@ Andre: hoe zien je tabelstructuur en je query er nu uit?
@ Andre: hoe zien je tabelstructuur en je query er nu uit?
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$sql = "
SELECT Jos_users.name, jos_comprofiler.cb_adres, cb_postcode, jos_comprofiler.cb_plaats
FROM jos_comprofiler
LEFT JOIN Jos_users ON
jos_comprofiler.id = Jos_users.id
WHERE cb_postcode BETWEEN '%" . $_POST['postcode1'] . "%' AND '%" . $_POST['postcode2'] . "%'";
?>
$sql = "
SELECT Jos_users.name, jos_comprofiler.cb_adres, cb_postcode, jos_comprofiler.cb_plaats
FROM jos_comprofiler
LEFT JOIN Jos_users ON
jos_comprofiler.id = Jos_users.id
WHERE cb_postcode BETWEEN '%" . $_POST['postcode1'] . "%' AND '%" . $_POST['postcode2'] . "%'";
?>
Dit is de tabelstructuur van de tabel jos_comprofiler:
--
-- Tabel structuur voor tabel `jos_comprofiler`
--
CREATE TABLE `jos_comprofiler` (
`id` int(11) NOT NULL default '0',
`user_id` int(11) NOT NULL default '0',
`firstname` varchar(100) default NULL,
`middlename` varchar(100) default NULL,
`lastname` varchar(100) default NULL,
`hits` int(11) NOT NULL default '0',
`avatar` varchar(255) default NULL,
`avatarapproved` tinyint(4) default '1',
`approved` tinyint(4) NOT NULL default '1',
`confirmed` tinyint(4) NOT NULL default '1',
`lastupdatedate` datetime NOT NULL default '0000-00-00 00:00:00',
`banned` tinyint(4) NOT NULL default '0',
`banneddate` datetime default NULL,
`bannedby` int(11) default NULL,
`bannedreason` mediumtext,
`acceptedterms` tinyint(1) NOT NULL default '0',
`cb_adres` varchar(255) default NULL,
`cb_postcode` varchar(255) default NULL,
`cb_plaats` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
OUTER is in mysql inderdaad optioneel Jan. Ik geloof dat het slagen van een LEFT JOIN ook nog van de gebruikte mysqlversie afhangt
Als ik de query gebruikt om alleen op één postcode te zoeken met het criteria LIKE dan werkt het wel. Het is dus iets met BETWEEN, misschien een ander veldkenmerk ofzo.
@ Andre: kun je wel alleen de postcodes uit je tabel laten rollen, dus zonder die JOIN in je query? En let er op dat je bij alle veldnamen even de tabelnaam ervoor zet.
Andre van Wingerden schreef op 27.10.2006 14:13:
Als ik de query gebruikt om alleen op één postcode te zoeken met het criteria LIKE dan werkt het wel. Het is dus iets met BETWEEN, misschien een ander veldkenmerk ofzo.
Hoe zit het met spaties in de waarden die in POST zitten? En check ook op hoofd- en kleine letters.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$sql = "
SELECT
Jos_users.name,
cb_adres,
cb_postcode,
cb_plaats
FROM
jos_comprofiler
LEFT JOIN
Jos_users
ON
jos_comprofiler.id = Jos_users.id
WHERE
LEFT
(cb_postcode,4)
BETWEEN
LEFT('" . $_POST['postcode1'] . "',4)
AND
LEFT('" . $_POST['postcode2'] . "',4);
?>
$sql = "
SELECT
Jos_users.name,
cb_adres,
cb_postcode,
cb_plaats
FROM
jos_comprofiler
LEFT JOIN
Jos_users
ON
jos_comprofiler.id = Jos_users.id
WHERE
LEFT
(cb_postcode,4)
BETWEEN
LEFT('" . $_POST['postcode1'] . "',4)
AND
LEFT('" . $_POST['postcode2'] . "',4);
?>
Enzo?
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
Ik gebruik nu deze query.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = "
SELECT jos_comprofiler.cb_adres, jos_comprofiler.cb_postcode, jos_comprofiler.cb_plaats
FROM jos_comprofiler
WHERE jos_comprofiler.cb_postcode BETWEEN '%" . $_POST['postcode1'] . "%' AND '%" . $_POST['postcode2'] . "%'";
?>
$sql = "
SELECT jos_comprofiler.cb_adres, jos_comprofiler.cb_postcode, jos_comprofiler.cb_plaats
FROM jos_comprofiler
WHERE jos_comprofiler.cb_postcode BETWEEN '%" . $_POST['postcode1'] . "%' AND '%" . $_POST['postcode2'] . "%'";
?>
Ook dit zonder resultaat. Ik voer de postcodes in zonder spaties e.d. en ik zoek nu alleen op 4 cijfers dus kan geen verschil zitten in hoofd/kleine letters.
Met jouw querie werkt het! Bedankt dat jullie met me mee wilde kijken.
Mooi weer iemand blij
Al gebruik ik nu in de tabel ook weer letters bij de postcode blijft het werken.
0000 AA
Hij vergelijk nu alleen de linkse 4 0000 met de linkse vier uit $_POST