I'm putting together an API for an iOS app and need to get locations nearby a geo coordinate.
I tried this query in mysqli and it returns no results. When I do it in a regular mysql_query it works perfectly. I also tested the query in phpmyadmin where it completes successfully as well.
SELECT id, name, address, city, state, longitude, latitude, ( $miles * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance
FROM locations HAVING distance < $distance ORDER BY distance LIMIT 0, 20
This is the query with the variables filled in:
SELECT id, name, address, city, state, longitude, latitude, ( 3959 * acos( cos( radians(40.735767) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-73.991806) ) + sin( radians(40.735767) ) * sin( radians( latitude ) ) ) ) AS distance
FROM locations HAVING distance < 25 ORDER BY distance LIMIT 0, 20
Is there something I'm missing why it will not work in mysqli
?
This is the working mysql query code
mysql_connect('localhost', 'test', 'test') or die(mysql_error());
mysql_select_db('testdb') or die(mysql_error());
$locations = array();
$miles = 3959;
$distance = 25;
$latitude = "40.735767";
$longitude = "-73.991806";
$data = mysql_query("SELECT id, name, address, city, state, longitude, latitude, ( $miles * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance
FROM locations HAVING distance < $distance ORDER BY distance LIMIT 0, 20")
or die(mysql_error());
while ($row = mysql_fetch_assoc($data)) {
array_push($locations, $row);
}
I'm using MysqliDb Class https://github.com/ajillion/PHP-MySQLi-Database-Class so that should work as follows
$row = $db->rawQuery("SELECT id, name, address, city, state, longitude, latitude, ( ? * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM locations HAVING distance < ? ORDER BY distance LIMIT 0, 20", array($miles, $latitude, $longitude, $latitude, $distance));
if (count($row) > 0){
// if found, return JSON response
echo json_encode($row[0]);
}
Even when I use the basic template I found for mysqli it fails.
$locations = array();
$miles = 3959;
$distance = 25;
$latitude = "40.735767";
$longitude = "-73.991806";
// Connect to database
$link = mysqli_connect('localhost','test','test','testdb');
// Check for Errors
if(mysqli_connect_errno()){
echo mysqli_connect_error();
}
// Prepare Query
$query = "SELECT id, name, address, city, state, longitude, latitude, ( $miles * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance
FROM locations HAVING distance < $distance ORDER BY distance LIMIT 0, 20";
// Escape Query
$query = mysqli_real_escape_string($link,$query);
// Perform Query
if($result = mysqli_query($link,$query)){
// Cycle through results
while($row = mysqli_fetch_object($result)){
array_push($locations, $row);
}
// Free Result Set
mysqli_free_result($result);
}
// Close Connection
mysqli_close($link);
Is there something I'm missing why it will not work in mysqli?
No.
Both mysql and mysqli APIs run your queries exactly the same way.
Look for the typos. And other errors of the kind.