Sorteren of dichtstbijzijnde getal

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nils L

Nils L

22/10/2010 10:11:22
Quote Anchor link
Ik heb een database met vestigingen. Via een zoekformulier waar bezoekers de cijfers van hun postcode invullen wordt er gezocht op dat getal -50 en +50.
Als ik sorteer op getal dan komt een vestiging met de ingevoerde postcode dus meestal in het midden van de resultaten te staan.

Is er een manier om te beginnen met het ingevoerde postcode en daarna telkens het dichtstbijzijnde getal dus zowel lager als hoger.
 
PHP hulp

PHP hulp

18/12/2024 22:10:35
 
Teun Hesseling

Teun Hesseling

22/10/2010 10:52:15
Quote Anchor link
2 variabelen maken 1 die 50 hoger is dan de de ingevoerde postcode, de andere 50 lager en dan met een sql qeury kijken met een in between met het oorspronkelijke postcode als uitganspunt
 
Nils L

Nils L

22/10/2010 11:05:44
Quote Anchor link
mijn huidige script is:
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
<?
//connect  to the database      
$db= mysql_connect("GEGEVENS")     or die("Kan geen verbinding maken");
$mydb=mysql_select_db("NAAM");  


$zoekterm = $_GET['zoekterm'];

$value1 = $zoekterm - 50;
$value2 = $zoekterm + 50;

$sql = 'SELECT * FROM Filialen WHERE postcode >= '.$value1.'   AND   postcode <= '.$value2.'';
  {

    if ($first == false)
      $sql .= ' AND ';
    $first = false;
    $sql .= "(`postcode` LIKE '%$tw%') ";
  }

  $sql .= 'ORDER BY `postcode` ASC LIMIT 0, 20';  
    $res = mysql_query($sql) or die('fout in query : '. mysql_error());  
    if ($res && mysql_num_rows($res) >= 1)
    {

        echo '<table>
            <tr>
                <td width="200"><h3>Naam</h3></td>
                <td width="200"><h3>Adres</h3></td>
        <td width="200"><h3>Plaats</h3></td>
            </tr>'
;
            
        while ($row = mysql_fetch_array($res))
        {

            echo '<tr>
                <td><a href="http://'
.$row['website'].'" target="_blank">'.$row['naam'].'</a></td>
                <td>'
.$row['adres'].'</td>
                <td>'
.$row['plaats'].'</td>
                
            </tr>'
;
        }


        echo '</table>';
    }
else {
        echo 'Geen data gevonden';
    }

?>


________________________________________

Hoe geef ik aan dat 'zoekterm'startpunt moet zijn?
 
Teun Hesseling

Teun Hesseling

22/10/2010 12:09:36
Quote Anchor link
als iemand zijn postcode invult in een textvak moet je POST gebruiken niet GET, anders moet achter je url nog ?zoekterm= komen te staan
 
Joren de Wit

Joren de Wit

22/10/2010 12:10:59
Quote Anchor link
In dat geval zul je eerst de zoekterm uit de resultaten moeten filteren (of een aparte query uitvoeren om alleen het resultaat voor de zoekterm en niet de hele range op te halen). Je zou alle resultaten eerst in een array kunnen zetten en vervolgens in die array zoeken naar de zoekterm. Als je die gevonden hebt, geef je hem weer waarna je vervolgens de rest van de array weergeeft.

Als je kiest voor een aparte query, wordt e.e.a. natuurlijk een stuk eenvoudiger wat PHP code betreft.
 
Nils L

Nils L

22/10/2010 12:28:53
Quote Anchor link
@Teun.
De url van het resultaat overzicht neemt met die script ook de zoekterm mee

@Blanche
Houd je dan niet het probleem dat na het weergeven van de ingevoerde term allen nummer nog steeds op normale volgorde staan.

Voorbeeld. Ik zoek op postcode 4000
Dan wil ik alle vestigingen met postcode tussen 3950 en 4050 laten zien (dat doet het al)
En de filialen binnen deze range zou zijn: 3951,3970,3999, 4000, 4002, 4015 en 4048.
Dan wil ik dat de getoonde volgorde is:
4000;3999;4002;4014;3970;4048;3951

Bijkomend probleem is dat ik zonder iets veranderd te hebben de db niet kan oproepen, ook inloggen via MyPHP lukt niet meer:
#1045 - Access denied for user 'NAAM'@'IP' (using password: YES)
Terwijl ik niks gewijzigd heb.
 
Joren de Wit

Joren de Wit

22/10/2010 13:07:45
Quote Anchor link
Aha, op die manier. Bereken dan het verschil tussen de zoekterm en de postcode en sorteer daarop:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
  postcode,
  ABS(postcode - [zoekterm]) AS verschil
FROM
  Filialen
WHERE
  postcode BETWEEN [zoekterm] + 50 AND [zoekterm] - 50
AND
  postcode LIKE '%[zoekterm]%'
ORDER BY
  verschil DESC

Zo zou de structuur van je query eruit kunnen komen te zien...
 
Nils L

Nils L

22/10/2010 13:14:47
Quote Anchor link
Thanks, zal het proberen als ik weer toegang heb tot phpMyAdmin.
Heb zelfs een nieuw wachtwoord aangevraagd en nog zegt ie :
#1045 - Access denied for user 'user'@'IP' (using password: YES)

gisterenavond werkte alles nog perfect en er is niks veranderd.
 
Joren de Wit

Joren de Wit

22/10/2010 13:19:05
Quote Anchor link
Hmm, lijkt me dat je met zo'n probleem wel bij je host terecht kunt? Verder is het misschien een idee om lokaal een testserver te installeren. Er bestaan standaard pakketten die Apache, PHP en MySQL met een paar klikken installeren (WAMP bijvoorbeeld).
 
Nils L

Nils L

26/10/2010 10:56:04
Quote Anchor link
je script werkt helaas niet. Krijg een foutmelding op de Unexpected [
 
Jacco Engel

Jacco Engel

26/10/2010 11:13:23
Quote Anchor link
[zoekterm] vervangen door $zoekterm ?
 
Nils L

Nils L

26/10/2010 11:34:31
Quote Anchor link
script is 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
<?
//connect  to the database      
$db= mysql_connect("db", "login", "ww")     or die("Kan geen verbinding maken");
$mydb=mysql_select_db("naam");  


$zoekterm = $_GET['zoekterm'];

$value1 = $zoekterm - 50;
$value2 = $zoekterm + 50;

$sql = 'SELECT
  postcode,
  ABS(postcode - $zoekterm) AS verschil
FROM
  Filialen
WHERE
  postcode BETWEEN $zoekterm + 50 AND $zoekterm - 50
AND
  postcode LIKE '
%zoekterm%'
ORDER BY
  verschil DESC
'
;
  {

    if ($first == false)
      $sql .= ' AND ';
    $first = false;
    $sql .= "(`postcode` LIKE '%$tw%') ";
  }

  $sql .= 'ORDER BY `postcode` ASC LIMIT 0, 20';  
    $res = mysql_query($sql) or die('fout in query : '. mysql_error());  
    if ($res && mysql_num_rows($res) >= 1)
    {

        echo '<table>
            <tr>
                <td width="200"><h3>Naam</h3></td>
                <td width="200"><h3>Adres</h3></td>
        <td width="200"><h3>Plaats</h3></td>
            </tr>'
;
            
        while ($row = mysql_fetch_array($res))
        {

            echo '<tr>
                <td><a href="http://'
.$row['website'].'" target="_blank">'.$row['naam'].'</a></td>
                <td>'
.$row['adres'].'</td>
                <td>'
.$row['plaats'].'</td>
                
            </tr>'
;
        }


        echo '</table>';
    }
else {
        echo 'Geen data gevonden';
    }


error is nu:
Warning: Division by zero in /public/sites/www.site.nl/result.php on line 98

Warning: Division by zero in /public/sites/www.site.nl/result.php on line 101
fout in query : 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 'AND (`postcode` LIKE '%%') ORDER BY `postcode` ASC LIMIT 0, 20' at line 1
 
Jacco Engel

Jacco Engel

26/10/2010 11:38:53
Quote Anchor link
$sql = 'SELECT
postcode,
ABS(postcode - '.$zoekterm.') AS verschil
FROM
Filialen
WHERE
postcode BETWEEN ('.$zoekterm.' + 50) AND ('.$zoekterm.' - 50)
AND
postcode LIKE '%'.$zoekterm.'%'
ORDER BY
verschil DESC '
 
- SanThe -

- SanThe -

26/10/2010 13:41:10
Quote Anchor link
Als je dit gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$sql
= "........
WHERE
  postcode BETWEEN $zoekterm + 50 AND $zoekterm - 50
AND
  postcode LIKE '%zoekterm%'
....."
;
?>

Dan kan je volgens mij lang zoeken.

Stel je zoekt op postcode 1234 dan wordt de query dus dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$sql
= "........
WHERE
  postcode BETWEEN 1284 AND 1184
AND
  postcode LIKE '%1234%'
....."
;
?>

Ten eerste staan de getallen bij BETWEEN in de verkeerde volgorde. Dat moet van laag naar hoog zijn. (Daar was laatst een topic over en daar was dit het probleem).
Ten tweede zal die LIKE alleen postcode 1234 selecteren want 1233 en/of 1235 passen niet in deze LIKE.

Conclusie: De enige waarde die er gevonden zou kunnen worden is $zoekterm zelf.
 



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.