I’m very new to PHP/AJAX and need some help… I have a leaflet map and am trying to chain two AJAX calls – the first AJAX uses data from a select value (a country ISO code).
I have then used the geonames API to find the most populated cities in that particular country. I would like to use the resulting latitude/longitude of each of these 10 cities (currently stored as pairs in $latLng) as parameters to call some other APIs (e.g. open weather) and dynamically add this information to a modal when a user clicks that particular leaflet marker. At the moment I have assigned the variable $latLng to data in the second AJAX call, but this is not working as I am unable to pass an array into the cURL routine.
Below is an example of what $latLng is currently showing in the console (for AU (Australia)) – each of the pairs are appearing on the leaflet map as a marker at the specified coordinates:
(2) [-35.2834624726481, 149.128074645996] (2) [-33.8678499639382, 151.207323074341] (2) [-37.8139965641595, 144.963322877884] (2) [-31.95224, 115.861397] (2) [-34.928661, 138.598633] (2) [-32.92953, 151.7801] (2) [-42.87936056387943, 147.32940673828125] (2) [-19.26639, 146.805695] (2) [-16.92366, 145.76613] (2) [-12.46113366159021, 130.84184646606445]
Is there a way that I can loop through these pairs so that each one could potentially be used in the second AJAX call, depending on what pair is clicked? For example, if I click the marker at location [-12.46113366159021, 130.84184646606445] then weather data for this city will appear in a modal?
In the PHP file for the second AJAX call:
$url='https://restcountries.eu/rest/v2/alpha/' . $_REQUEST['latlng']
I am receiving the error Undefined array key "latlng"
[‘latlng’] is an array of two values. latlng[0] contains latitude and latlng[1] contains longitude.
Current code is below – any help would be appreciated. Thanks!
JS:
$("select").on('change', () => { $.ajax({ url: "libs/php/getInfo.php", type: 'POST', dataType: 'json', data: { code: $('#select').val() }, success: function(result) { console.log(result); if (result.status.name == "ok") { var cities = result['data']['cities']['geonames']; var citiesArray = []; for (i=0; i<cities.length; i++) { if (cities[i].countrycode == result['data']['restCountries']['alpha2Code']) { citiesArray.push(cities[i]); } } citiesArray.length = 10; citiesArray.forEach(city => { $latLng = [city.lat, city.lng]; $cityMarker = L.marker($latLng) .addTo($layers) .bindPopup('Name: ' + city.toponymName) $($cityMarker).on('click', () => { $.ajax({ url: "libs/php/getInfoLatLng.php", type: 'POST', dataType: 'json', data: { latlng: $latLng }, success: function(result) { console.log(result); if (result.status.name == "ok") { $('.modal').modal('show'); console.log($latLng); $('#openWeatherResult').html('weather info goes here'); } }, error: function (jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); console.log(jqXHR); } }); }); $('.close').on('click', () => { $('.modal').modal('hide'); }) }); } }, error: function (jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); console.log(jqXHR); } }); });
Advertisement
Answer
Taking a simple example, based loosely on your code above:
let latLng = ['latitude', 'longitude']; $.ajax({ method:'POST', url:'myUrl.php', data: {latlng:latLng} }
This will send the latLng
array to your PHP script using array notation. What is sent is of the form:
myUrl.php?latlng[]=latitude&latlng[]=longitude
What PHP will see is a latlng
array as an element of $_POST:
array (size=1) 'latlng' => array (size=2) 0 => string 'latitude' (length=8) 1 => string 'longitude' (length=9)
And to get at those values you can use
echo $_POST['latlng'][0]; // latitude echo $_POST['latlng'][1]; // longitude
To go one step further, you can add these latitude/longitude pairs to an array, and POST that:
$latLng=[['latitudeA', 'longitudeA'],['latitudeB', 'longitudeB']]; $.ajax({ method:'POST', url:'myUrl.php', data: {latlng:latLng} }
So now you have two levels of array, so two levels are required to access the values:
echo $_POST['latlng'][0][0]; // latitudeA echo $_POST['latlng'][1][0]; // latitudeB
This would quickly become cumbersome and difficult to read. An alternative approach would be to use an array of objects, and using JSON.stringify()
to POST them.
let locationList = []; citiesArray.forEach(city => { locationList.push({lat:city.lat, long:city.long}); }); $.ajax({ url:'myUrl.php', method:'POST', data: { locationList:JSON.stringify(locationList) } })
In PHP you decode the JSON string into an array of objects:
<?php if (isset($_POST['locationList']){ $locationList = json_decode($_POST['locationList']); foreach($locationList as $location){ // do something with the data echo $location->lat; echo $location->long; } } else { // handle a request with no data }
You’ll have to work out how to incorporate this into your code.