Langzame site na de volgende php code en probleem met update query binnen loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

31/10/2017 13:57:52
Quote Anchor link
Ik zat een tijd terug met een probleem voor een google maps kaart. Binnen een loop haalde ik via google geocoding de coordinaten op per item (een bedrijf met een adres in dit geval) die ik daarna kon weergeven op een kaart. Dat werkte, alleen liep ik tegen een limiet aan van het aantal api requests.

Mijn idee om dit tegen te gaan was één keer alle coordinaten op te halen en deze op te slaan in de database en een kolom toe te voegen genaamd `requested` die standaard 0 is. Hierna kan ik checken of requested gelijk is aan 0 en alleen dan een request uitvoeren naar google, waarna de 0 in een 1 verandert.

Ik ben al een eind maar om de een of andere reden worden in mijn database overal dezelfde coordinaten toegevoegd. Dus iets binnen mijn loop gaat niet goed, wat kan dat zijn?

Hier een korte versie van waar ik die coordinaten loop:

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
<?php
if($existcheck['requested'] == 0){
      $getlatlong = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=".$bedrijven['plaats'].",".$straatnaam."&key=mijnapikey");
      $latlongarray = json_decode($getlatlong);
      $lat = '';
      $lng = '';

      // Leeg de latlong na elke loop
      foreach ($latlongarray->results as $key => $latlong){
       //  $latlonglijst .= $latlong->geometry->location->lat.'&nbsp;';
       //  $latlonglijst .= $latlong->geometry->location->lng.'<br>';

       $lat .= $latlong->geometry->location->lat;
       $lng .= $latlong->geometry->location->lng;
       // array_push($bedrijvenarray, $lat, $lng);
       //$new_array = array('lat'=>''.$lat.'', 'lng'=>''.$lng.'');


      }
      // Voeg lat en lng toe aan de $bedrijven array
      // $bedrijven['lat'] = $new_array['lat'];
      // $bedrijven['lng'] = $new_array['lng'];
      // $bedrijven['intro_image'] = $image_array['intro_image'];
      // $bedrijvenarray1[] = $bedrijven;



      $updatetable            = "
      UPDATE snm_content
      SET requested = 1, lat = '"
.$lat."', lng = '".$lng."'";
      $updatetablecon         = $conn->query($updatetable);

      // echo $updatetable;

    }else if($existcheck['requested'] == 1){

    }

?>


Hierna ziet mijn database er zo uit:

Afbeelding

Ook is mijn website erg traag, zelfs wanneer alle requested velden op 1 staan en dat ligt zeker weten aan deze code want wanneer ik het hele stuk weghaal is hij weer snel.

Hieronder de complete code mocht dat iets makkelijker lezen:

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
<?php
$bedrijven
            = "
SELECT
  cnt.id, cnt.title, cnt.introtext, cnt.ordering, cnt.images, cnt.alias, cnt.state, f.item_id,
  MAX(CASE WHEN f.field_id = 3 THEN f.value END) AS plaats,
  MAX(CASE WHEN f.field_id = 1 THEN f.value END) AS straat
FROM snm_fields_values f
JOIN snm_content cnt
ON cnt.id = f.item_id
WHERE cnt.state = 1
GROUP BY f.item_id
ORDER BY f.item_id, plaats, straat"
;
$bedrijvencon         = $conn->query($bedrijven);
$bedrijvenarray = [];

while($bedrijven    = $bedrijvencon->fetch_assoc()){
  $straatnaam = '';
  $plaatsnaam = '';
  // Stop $bedrijven in een array
   array_push($bedrijvenarray, $bedrijven);
   // Vervang de straatnaam spaties met plusjes voor de filegetcontents url
   $straatnaam .= str_replace(' ', '+', $bedrijven['straat']);
   $plaatsnaam .= $bedrijven['plaats'];

    // Kijk of er al een plaatsnaam en straatnaam in de database bestaan bij het artikel
    $existcheck            = "
    DESC snm_content"
;
    $existcheckcon         = $conn->query($existcheck);
    $existcheck       = $existcheckcon->fetch_assoc();

    if($existcheck['requested'] == 0){
      $getlatlong = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=".$bedrijven['plaats'].",".$straatnaam."&key=mijnapikey");
      $latlongarray = json_decode($getlatlong);
      $lat = '';
      $lng = '';

      // Leeg de latlong na elke loop
      foreach ($latlongarray->results as $key => $latlong){
       //  $latlonglijst .= $latlong->geometry->location->lat.'&nbsp;';
       //  $latlonglijst .= $latlong->geometry->location->lng.'<br>';

       $lat .= $latlong->geometry->location->lat;
       $lng .= $latlong->geometry->location->lng;
       // array_push($bedrijvenarray, $lat, $lng);
       //$new_array = array('lat'=>''.$lat.'', 'lng'=>''.$lng.'');


      }
      // Voeg lat en lng toe aan de $bedrijven array
      // $bedrijven['lat'] = $new_array['lat'];
      // $bedrijven['lng'] = $new_array['lng'];
      // $bedrijven['intro_image'] = $image_array['intro_image'];
      // $bedrijvenarray1[] = $bedrijven;



      $updatetable            = "
      UPDATE snm_content
      SET requested = 1, lat = '"
.$lat."', lng = '".$lng."'";
      $updatetablecon         = $conn->query($updatetable);

      // echo $updatetable;

    }else if($existcheck['requested'] == 1){

    }





   $bedrijfimage = $bedrijven['images'];
   $bedrijfimg = json_decode($bedrijfimage);

   if($bedrijfimg->image_intro != ''){
     $bedrijvenimage = '../cms/'.$bedrijfimg->image_intro;
   }
else{
     $bedrijvenimage = '../images/logo_ovn.png';
   }


   $image_array = array('intro_image'=>''.$bedrijvenimage.'');

}

$jsonobject = json_encode($bedrijvenarray1);
?>


Een hoop is niet relevant omdat ik het eerst dus op die manier deed dat hij binnen no time aan zijn limiet kwam (altijd voor alle items een request uitvoeren en dit direct in een array stoppen).
Gewijzigd op 31/10/2017 13:58:43 door Snelle Jaap
 
PHP hulp

PHP hulp

29/03/2024 11:26:23
 
Ben van Velzen

Ben van Velzen

31/10/2017 14:16:05
Quote Anchor link
Het eerste opvallende probleem is dat je UPDATE geen WHERE bevat, waardoor altijd de hele tabel geupdatet zal worden met de waarde die binnen de loop bekend is. Dat lijkt me niet de bedoeling.
 
Snelle Jaap

Snelle Jaap

31/10/2017 14:19:36
Quote Anchor link
Ben van Velzen op 31/10/2017 14:16:05:
Het eerste opvallende probleem is dat je UPDATE geen WHERE bevat, waardoor altijd de hele tabel geupdatet zal worden met de waarde die binnen de loop bekend is. Dat lijkt me niet de bedoeling.


Jawel, ik wil dat bij alle rijen de coordinaten worden toegevoegd. Alleen wordt nu overal dezelfde waarde toegevoegd terwijl elke rij natuurlijk een uniek coordinaat heeft.
 
Ben van Velzen

Ben van Velzen

31/10/2017 14:21:47
Quote Anchor link
Wat momenteel gaat opleveren dat je per gevonden record een UPDATE draait met een FULL TABLE LOCK tot gevolg. Dat gaat nooit snel worden.
 
Snelle Jaap

Snelle Jaap

31/10/2017 14:25:14
Quote Anchor link
Ben van Velzen op 31/10/2017 14:21:47:
Wat momenteel gaat opleveren dat je per gevonden record een UPDATE draait met een FULL TABLE LOCK tot gevolg. Dat gaat nooit snel worden.


Wat zou hier een oplossing voor zijn? Ik zal vast niet de enige zijn die iets op deze manier wil doen.
 
Willem vp

Willem vp

31/10/2017 14:30:01
Quote Anchor link
Ben van Velzen op 31/10/2017 14:16:05:
Het eerste opvallende probleem is dat je UPDATE geen WHERE bevat, waardoor altijd de hele tabel geupdatet zal worden met de waarde die binnen de loop bekend is. Dat lijkt me niet de bedoeling.

Merk ook op dat de update-query *buiten* de loop staat...
(oeps, was nog een tweede loop ;-) )
Gewijzigd op 31/10/2017 14:31:44 door Willem vp
 
Rob Doemaarwat

Rob Doemaarwat

31/10/2017 15:57:17
Quote Anchor link
Zoveel vragen ...
- Waarom zit er in je "UPDATE snm_content ..." geen WHERE? / Waarom heb je dan meerdere rijen
- Is die snm_content.id wel uniek, of ... ?
- Wat doet die $existcheck query (zoals ik het nu zie kan die alleen maar een foutmelding geven).
- Dat $bedrijfimage is nog een stukje "work in progress"?
- $bedrijvenarray1 wordt nergens gevuld (code staat in commentaar) / lekker verwarrend met $bedrijvenarray (zonder 1) ook weer ...
 
Snelle Jaap

Snelle Jaap

31/10/2017 16:02:50
Quote Anchor link
Rob Doemaarwat op 31/10/2017 15:57:17:
Zoveel vragen ...
- Waarom zit er in je "UPDATE snm_content ..." geen WHERE? / Waarom heb je dan meerdere rijen
- Is die snm_content.id wel uniek, of ... ?
- Wat doet die $existcheck query (zoals ik het nu zie kan die alleen maar een foutmelding geven).
- Dat $bedrijfimage is nog een stukje "work in progress"?
- $bedrijvenarray1 wordt nergens gevuld (code staat in commentaar) / lekker verwarrend met $bedrijvenarray (zonder 1) ook weer ...

Ja het is nogal rommelig klopt. De $existcheck query is inderdaad overbodig, die data kan ik al met de 1e query ophalen. Ik heb het al werkend gekregen trouwens en de site is ook weer een stuk sneller.


Toevoeging op 31/10/2017 16:02:50:

Rob Doemaarwat op 31/10/2017 15:57:17:
Zoveel vragen ...
- Waarom zit er in je "UPDATE snm_content ..." geen WHERE? / Waarom heb je dan meerdere rijen
- Is die snm_content.id wel uniek, of ... ?
- Wat doet die $existcheck query (zoals ik het nu zie kan die alleen maar een foutmelding geven).
- Dat $bedrijfimage is nog een stukje "work in progress"?
- $bedrijvenarray1 wordt nergens gevuld (code staat in commentaar) / lekker verwarrend met $bedrijvenarray (zonder 1) ook weer ...

Ja het is nogal rommelig klopt. De $existcheck query is inderdaad overbodig, die data kan ik al met de 1e query ophalen. Ik heb het al werkend gekregen trouwens en de site is ook weer een stuk sneller.
 



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.