Ik heb pas begonnen met php & MySQL en nu stuit ik op een klein probleem. Ik wil met een zoekfunctie leden selecteren met behulp van hun postcode.

Dit is de zoekpagina.

<?
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.

<?
//-- 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.
Ik vraag me af of BETWEEN ook met strings werkt. Met numerieke gegevens en datums doet hij het wel, maar strings moet ik even uittesten.

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
[/edit]
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'].
Je moet ook even kijken of postcode2 wel groter is dan postcode1. Anders krijg je sowieso geen resultaten. En maak van die INNER JOIN eens een LEFT JOIN:
<?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'] . "%'";
?>
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.
Let op: Het is geen LEFT JOIN, maar LEFT OUTER JOIN.
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.

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 :)

Het keyword OUTER heeft toch alleen met ODBC compatability te maken?
[edit]
@ Andre: hoe zien je tabelstructuur en je query er nu uit?
Zo ziet de query er uit:

<?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'] . "%'";
?>

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;


Reageren