1
我終於弄清楚了,看到我的答案。在準備好的PDO中使用數組結合單個元素mysql查詢
下面的代碼應該根據兩個字段中所有搜索項的存在以及匹配客戶端的最大距離來返回mysql數據庫中的條目。這個概念在我把它轉換成PDO之前運作良好,事實上我得到它與PDO一起工作,我暫時忽略了mysql查詢中用戶名= pb
後面的所有內容,並且只有$ query-> execute($ searcharray);在執行中。但是,增加休息的時候,我如果用一個搜索詞沒有結果,而如果超過,我得到:
Response from server: Error: SQLSTATE[HY093]: Invalid parameter number
Here's代碼:
$searcharray = explode(',', $search);
$tests = array_map(function($word)
{
return "CONCAT(searchmessage, subject)
LIKE ?";
}
, $searcharray);
$where = implode(' AND ', $tests);
function addPercentage(&$value,$key)
{
$value = "%".$value."%" ;
}
array_walk($searcharray,"addPercentage");
$query=$conn->prepare("SELECT
username,sender,message,subject,timestamp,threadid,msgtype FROM Messages
WHERE $where AND username ='pb' AND
(6371 * acos (cos (radians(?))
* cos(radians(Messages.latitude))
* cos(radians(Messages.longitude) - radians(?))
+ sin (radians(?))
* sin(radians(Messages.latitude))
))
< ?
ORDER BY timestamp");
$query->execute (array($searcharray,$latitude,$longitude,$latitude,$visibledistance));
$sth = $query->fetchAll(PDO::FETCH_ASSOC);
我的感覺是, (?)在原始公式中的值應該在PDO調用中看起來有所不同,並且我使用包含多個值的$ searcharray執行它的方式與它後面的單個值($ latitude ...)結合是不正確的。
按照要求,稍微詳細一點。此代碼的工作:
$searcharray = explode(',', $search);
$tests = array_map(function($word)
{
return "CONCAT(searchmessage, subject)
LIKE ?";
}
, $searcharray);
$where = implode(' AND ', $tests);
function addPercentage(&$value,$key)
{
$value = "%".$value."%" ;
}
array_walk($searcharray,"addPercentage");
$query=$conn->prepare("SELECT
username,sender,message,subject,timestamp,threadid,msgtype FROM Messages
WHERE $where AND username ='pb' ORDER BY timestamp");
$query->execute($searcharray);
$sth = $query->fetchAll(PDO::FETCH_ASSOC);
所以,如果$搜索= 「帳篷,吉」,$這裏將成爲
CONCAT(searchmessage, subject) LIKE ? AND CONCAT(searchmessage,
subject) LIKE ?
而且這兩個詞將與他們身邊%的跡象$ searcharray。
任何想法我做錯了什麼?
由於代碼分解的方式,很難使整個查詢正面或反面。你能清理那個嗎? –
當然,現在好嗎? –
我看到3個問號和5個參數。 – Mihai