2017-01-22 52 views
1

通過直接鍵入PDO布爾模式

SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST ('+php +mysql' IN BOOLEAN MODE) 

我得到很多結果的準備聲明,對陣如果我從控制檯運行這個簡單的查詢。 現在我正試圖在php中準備這個聲明。

$keywords = ['php', 'mysql']; 
$against = ''; 
for($i = 0; $i < count($keywords); $i++){ 
    $against .= '+? '; 
} 
$query = 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST ('.$against.' IN BOOLEAN MODE)'; 

//my query is now 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST (+? +? IN BOOLEAN MODE)' 

$stmt = $pdo->prepare($query); 
$stmt->execute($keywords); 

如果僅使用1個關鍵字,此腳本僅返回結果。使用2個關鍵字,它不返回任何值並且沒有錯誤(但在控制檯中可用)。所以我懷疑這是我用pdo準備我的陳述的方式。任何想法?

+0

是否間距事?在控制檯中運行的查詢在兩個關鍵字之間有空格,而爲PDO生成的查詢將所有關鍵字創建爲僅由'+'分隔的單個字符串。 –

+0

編輯適當的間距。 – Eric

+1

控制檯中的查詢將所有關鍵字封裝在引號(''+ php + mysql'')中,而您準備的查詢看起來像'AGAINST(+ php + mysql IN BOOLEAN MODE)' - 也許就是這樣?嘗試使用一個佔位符,並建立字符串作爲1參數可能? – ccKep

回答

1

您應該簡單地創建這樣一個說法:

$query = 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST (:query IN BOOLEAN MODE)'; 
$stmt = $pdo->prepare($query); 

然後綁定PARAMS:

$keywords = ['php', 'mysql']; 
$against = ''; 
for($i = 0; $i < count($keywords); $i++){ 
    $against .= ' +' . $keywords[$i]; 
} 
$stmt = $pdo->prepare(array(
    ':query' => $against 
));