[PHP]Functie geeft niet de juiste waarde terug

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
Mensen,

Ik heb een functie gemaakt die voor mij het dichstbijzijnde station ophaalt.
De functie krijgt een postcode mee en binnen die functie wordt gecheckt tegen een query van stations door middel van de Google API welk station het dichtste bij is.

De query is correct. Als ik deze uitvoer binnen MySQL krijg ik netjes een lijstje met de ID's en postcodes van de 25 stations die in de tabel staan.
Strip ik de code dermate zodat ik alleen de afstand terugkrijg van terugkrijg tussen $begin en $stationPostcode werkt de functie keurig.
Maar ik wil dus dat de functie alle 25 stations checkt in de foreach en telkens het ID van het dichtsbijzijnde station opslaat.
De functie geeft echter altijd 1 terug. 1 is uiteraard het eerste station in mijn tabel. Ik zit nu al uren te turen en te proberen maar volgens mij moet deze functie gewoon correct zijn.

Wie zou mij kunnen helpen? Overigens weet ik bijna 100% zeker dat dit heeft gewerkt, al had ik eerder een array staan om doorheen te lopen. Maar als ik nu weer een array maak in plaats van de query werkt het ook niet meer.. Ik zie het gewoon niet meer :')

code:
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
function dichtsbijzijndeStation($begin) {
    $query = new Database();
    $getStations = $query->getAll("SELECT DISTINCT station_id, postcode FROM adres JOIN station ON adres.adres_id = station.adres_id");
    $minAfstand = 1000;
    $closeStation = "";
    foreach ($getStations as $station) {
        $stationPostcode = $station['postcode'];
        $stationid = $station['station_id'];
        error_reporting(E_ALL);
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $begin . "&destinations=" . $stationPostcode . "&mode=transit&key=<API KEY>",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache"
            ),
        ));
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
        $response = json_decode($response, true);

        $afstand = $response['rows']['0']['elements']['0']['distance']['text'];
        $afstandZonderKM = preg_replace('/ km/', '', $afstand);


        if ($afstandZonderKM < $minAfstand) {
            $minAfstand = $afstandZonderKM;
            $closeStation = $stationid;
        }
    }
    return $closeStation;
}

[ Voor 4% gewijzigd door St@m op 19-05-2018 13:25 ]

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels

Beste antwoord (via St@m op 19-05-2018 14:04)


  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
St@m schreef op zaterdag 19 mei 2018 @ 13:50:
var_dump: 25x bool(true)

Ik snap het echt niet :P
Wat var_dump je? ($afstandZonderKM < $minAfstand)?
Dat lijkt dus al niet te kloppen. Nog een stapje terug in je code gaan dus.

Alle reacties


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Op regel 31 vergelijk je strings, dan krijg je bijvoorbeeld '10' < '2'.

Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
Klopt toch ook wel? Of zie ik het verkeerd, kan hoor.
Als 2 < 10
$minAfstand = 2
$closeStation = het stationid op dat moment

En zo niet dan niets..

Ergens doet ie wel zoiets want ik krijg 1 terug i.p.v. niets.

[ Voor 35% gewijzigd door St@m op 19-05-2018 13:43 ]

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
St@m schreef op zaterdag 19 mei 2018 @ 13:36:
Klopt toch ook wel? Of zie ik het verkeerd, kan hoor.
Als 2 < 10
$minAfstand = 2
$closeStation = het stationid op dat moment

En zo niet dan niets..

Ergens doet ie wel zoiets want ik krijg 1 terug ipv niet.
2 < 10 maar '2' > '10'.

[ Voor 5% gewijzigd door RobIII op 19-05-2018 13:45 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 15:15

Onbekend

...

Even wat controle vraagjes:

1. foreach ($getStations as $station) gaat zeker weten 25 stations langs?
2. $err = curl_error($curl); geeft in geen van de gevallen een foutmelding terug?
3. $afstandZonderKM geeft altijd een getal terug? (En geen waarde zoals "10 " of "10,2")?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
RobIII schreef op zaterdag 19 mei 2018 @ 13:43:
[...]

2 < 10 maar '2' > '10' net als 'b' > 'a'.
Dat maakt in PHP toch niets uit..
Onbekend schreef op zaterdag 19 mei 2018 @ 13:43:
Even wat controle vraagjes:

1. foreach ($getStations as $station) gaat zeker weten 25 stations langs?
2. $err = curl_error($curl); geeft in geen van de gevallen een foutmelding terug?
3. $afstandZonderKM geeft altijd een getal terug? (En geen waarde zoals "10 " of "10,2")?
1. Ja
2. Nope
3. Dat moet ik even checken

[ Voor 52% gewijzigd door St@m op 19-05-2018 13:47 ]

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
2
3
var_dump(2 < 10);
var_dump('2' < '10');
var_dump('2 ' < '10 ');

true
true
false


Either way zo ik daar even een intval() omheen zetten op regel 28 (of float of...). Je wil geen strings met ints comparen.

Maar begin gewoon eens met basic debuggen: Debuggen: Hoe doe ik dat?

[ Voor 59% gewijzigd door RobIII op 19-05-2018 13:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
St@m schreef op zaterdag 19 mei 2018 @ 13:43:
[...]


Dat maakt in PHP toch niets uit..
Als je een groterdan of kleinerdan vergelijking doet, zal PHP inderdaad automatisch proberen de variables te casten naar integers. Het punt is alleen dat je daar weinig controle over hebt en vertrouwt op de onderliggende "magie" van PHP. De uitkomst is dus onvoorspelbaar.

Zorg dat je weet wat de input is. Doe belangrijke variablen eens var_dump()'en bijvoorbeeld. Grote kans dat ergens een variable niet de waarde (of het type) heeft wat je verwacht.

Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
var_dump: 25x bool(true)

Ik snap het echt niet :P

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
St@m schreef op zaterdag 19 mei 2018 @ 13:50:
var_dump: 25x bool(true)

Ik snap het echt niet :P
Wat var_dump je? ($afstandZonderKM < $minAfstand)?
Dat lijkt dus al niet te kloppen. Nog een stapje terug in je code gaan dus.

Acties:
  • 0 Henk 'm!

  • encryped
  • Registratie: Juli 2008
  • Laatst online: 12:31
Is de uitkomst van "$afstandZonderKM" geen array ?
preg_replace() returns an array if the subject parameter is an array, or a string otherwise.
ps. geen idee hoe de json structuur eruit ziet

Acties:
  • +1 Henk 'm!

  • coop
  • Registratie: Augustus 2005
  • Laatst online: 06-10 21:38
Waarom gebruik je niet de distance > value ipv de distance > text uit de Google API reponse?
Dan weet je zeker dat je een integer hebt in meters, ipv km met text en de variable opnieuw te moeten casten.
Voorbeeld van de response uit de documentation van Google.

Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
mcDavid schreef op zaterdag 19 mei 2018 @ 13:53:
[...]


Wat var_dump je? ($afstandZonderKM < $minAfstand)?
Dat lijkt dus al niet te kloppen. Nog een stapje terug in je code gaan dus.
Weer wat geleerd.. vertrouw nooit je data 8)7
Ik heb een var_dump gedaan op $afstandZonderKM = preg_replace('/ km/', '', $afstand);
Daar gaf die bij de eerste (1 dus) niets terug. Blijkt dat de postcode niet voorkomt in de Google API. Postcode aangepast en ik kan weer gaan..

Ik ben maar een beginner, en kende var_dump niet eens dus ik ben heel blij met jullie hulp!

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels


Acties:
  • +1 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
Tip: Check altijd of variables de juiste waardes bevatten, zéker als die afkomstig zijn van externe partijen.

In dit geval zou je eigenlijk een exception moeten throwen als $afstand leeg is.

Acties:
  • 0 Henk 'm!

  • St@m
  • Registratie: December 2001
  • Laatst online: 15:04

St@m

@ Your Service

Topicstarter
Die ga ik nu schrijven :) Nogmaals bedankt, en ook @tluijf voor de goede opmerking.

vuurwerk - vlees eten - tuinkachel - bbq - alcohol - voetbalwedstrijden - buitenfestivals - houtkachels

Pagina: 1