2017-06-21 129 views
0

爲什麼下面的語法在PHP 5.4中運行,但不在PHP 5.2中運行?未知的異常'PDOException'與PHP 5.2上的SQLSTATE [42000]而不是PHP 5.4中的

$stmt = $this->pdo->prepare('SELECT *, COALESCE((6371 * acos(cos(radians(:lat_params)) * 
cos(radians(tbl_restaurants_restaurants.lat)) *          
cos(radians(tbl_restaurants_restaurants.lon) - radians(:lon_params)) + 
sin(radians(:lat_params1)) * 
sin(radians(tbl_restaurants_restaurants.lat)))), 0) AS 
distance FROM 
tbl_restaurants_restaurants WHERE tbl_restaurants_restaurants.is_deleted = 0 
ORDER BY distance ASC LIMIT 0, :max'); 

$stmt->execute(array('lat_params' => $lat, 'lon_params' => $lon, 'lat_params1' => $lat, 'max' => $max)); 
    return $stmt; 

我有一個錯誤,這是由於PHP 5.2的兼容性。在PHP 5.4中,這個腳本正常工作。

link重現相同的錯誤。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''20'' at line 10' in D:...\ControllerRest.php:56 Stack trace: #0 D:...\ControllerRest.php(56): PDOStatement->execute(Array) #1 D:...\get_data.php(42): ControllerRest->getRestaurantsNearbyResultsAtCount('-20.290190', '-40.293366', '20') #2 {main} thrown in D:...\ControllerRest.php on line 56

是否有任何替代此腳本運行在PHP 5.2?

== UPDATE ==

shivanshu patel's answer did did!但現在錯誤是由以下SQL語句生成的:

$stmt = $this->pdo->prepare("SELECT COALESCE((6371 * acos(cos(radians(:lat_params)) * cos(radians('tbl_restaurants_restaurants'.'lat')) * cos(radians('tbl_restaurants_restaurants'.'lon') - radians(:lon_params)) + sin(radians(:lat_params1)) * sin(radians('tbl_restaurants_restaurants'.'lat')))), 0) AS distance FROM 'tbl_restaurants_restaurants' ORDER BY distance DESC LIMIT 0, :default_to_find_distance"); 

$stmt->execute(array('lat_params' => $lat, 'lon_params' => $lon, 'lat_params1' => $lat, 'default_to_find_distance' => $default_to_find_distance)); 
+2

的可能的複製[如何申請在LIMIT子句bindValue方法?(https://stackoverflow.com/questions/2269840/how-to-apply-bindvalue-method-in-limit-clause) – aynber

回答

1

嘗試用``覆蓋列和表,並確保max是int。

<?php 
$stmt = $this->pdo->prepare('SELECT *, COALESCE((6371 * acos(cos(radians(:lat_params)) * 
cos(radians(`tbl_restaurants_restaurants`.`lat`)) * 
cos(radians(`tbl_restaurants_restaurants`.`lon`) - radians(:lon_params)) + 
sin(radians(:lat_params1)) * 
sin(radians(`tbl_restaurants_restaurants`.`lat`)))), 0) AS 
distance FROM 
`tbl_restaurants_restaurants` WHERE `tbl_restaurants_restaurants`.`is_deleted` = 0 
ORDER BY distance ASC LIMIT 0, :max'); 

$stmt->bindValue(':max', $max, PDO::PARAM_INT); 
$stmt->execute(array('lat_params' => $lat, 'lon_params' => $lon, 'lat_params1' => $lat)); 
return $stmt; 
相關問題