簡體   English   中英

將MYSQL *查詢轉換為帶占位符的PDO ready語句

[英]Convert a MYSQL* query into a PDO ready statement with placeholders

我在將SQL查詢從mysql轉換為PDO預處理語句時遇到了麻煩。 它是以下內容,它用於計算會話中存儲的坐標(用戶位置)與數據庫中的坐標之間的距離,以及它是否在用戶確定的半徑范圍內:

$query = "
SELECT 
* 
FROM 
first_page_data 
WHERE 
((((acos(sin((".$_SESSION['alat']."*pi()/180)) * 
sin(('geo_lat1'*pi()/180))+cos((".$_SESSION['alat']."*pi()/180)) * 
cos(('geo_lat1'*pi()/180)) * cos(((".$_SESSION['alon']."- 'geo_lon1') * 
pi()/180))))*180/pi())*60*1.1515) * (1.609344/1000)) < ".$_SESSION['aradius'];

我想將會話變量,geo_lat和geo_lon變量更改為占位符,以便我可以將值綁定到它們,但我不能讓我的生活讓它工作!

我甚至不知道如何看到我如何上場,因為一旦我用占位符替換上面的變量(我一直使用未命名的問號占位符)然后將值綁定到它們,我不知道如何從$ stmt檢索編譯的查詢我執行它:

$stmt = db->prepare($query);
$stmt->bindValue(1, $_SESSION['alat'], PDO::PARAM_STR);
**more bindings**
$stmt->execute();   

這些變化非常微不足道。 我放置了占位符名稱,刪除了字符串連接,並刪除了錯誤的引號。 它可以使用格式化幫助,也可以使用UDF。

# Change string-concat for placeholders
$query = "
SELECT 
* 
FROM 
first_page_data 
WHERE 
((((acos(sin(( :lat1 *pi()/180)) * 
sin((geo_lat1*pi()/180))+cos(( :lat2 *pi()/180)) * 
cos((geo_lat1*pi()/180)) * cos((( :lon - geo_lon1) * 
pi()/180))))*180/pi())*60*1.1515) * (1.609344/1000)) < :rad";

# Bind values (PARAM_STR is default)
# While PDO does support using a named parameter multiple times
# when emulating placeholders, this is not guaranteed. To be safe,
# here the code is binding the same value to two "different" params.
$stmt = db->prepare($query);    
$stmt->bindValue(":lat1", $_SESSION['alat']);
$stmt->bindValue(":lat2", $_SESSION['alat']);
$stmt->bindValue(":lon", $_SESSION['along']);
$stmt->bindValue(":rad", $_SESSION['aradius']);

# Execute! I recommend enabling PDO Exceptions to avoid so much
# manual error-checking of result values.
$stmt->execute();   

現在, 沒有直接的方法來查看帶有數據的語句因為這不是占位符的工作方式 - 即使PDO在內部模擬占位符,它只是一個實現細節,而您卻無法看到它。

但是, 如何調試PDO數據庫查詢中討論的“調試語句”的更一般任務有各種解決方案 (我建議使用數據庫日志記錄進行開發,因為您的代碼可能不應該直接記錄或打印查詢。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM