2012-08-22 44 views
3

使用PHP v。5.2.14和PDO-MySQL擴展。PHP PDO準備好的語句MySQL選擇的地方其中X LIKE

我是新準備的陳述。需要創建一個搜索表單(以便用戶輸入)以及「選擇所有X,其中X像......」類型的工作查詢。

代碼和結果:$製備的

$sql = 'SELECT COUNT(*) as num_books from t_books where title LIKE :search_term'; 
// Later access as num_books 
$prep = $dbh->prepare($sql); 
$num = $prep->execute(array(':search_term' => '%'.$search_term. '%')); 
$total=$num->fetchColumn(); 

瓦爾轉儲: 對象(PDOStatement對象)#2(1){[ 「的queryString」] =>串(58),「SELECT COUNT(*)從t_books其中標題LIKE:SEARCH_TERM」}

致命錯誤:呼叫一個成員函數fetchColumn()非對象

上如果$製備是一個對象,則$ NUM應的對象。但它是布爾(真)。這裏發生了什麼?

但更重要的是,我該如何計數?我看過Row count with PDO - 。那裏的建議不適合我,因爲我需要一個準備好的聲明。將有用戶輸入。

感謝您的幫助。

回答

5

PDOStatement::execute()只返回一個布爾值,指示成功或失敗,所以你的變量$num是不是你想要從獲取什麼。通過分配的結果$num,你是不是分配對象$prep,但在方法調用來​​(TRUE),而僅將返回的值。

相反,fetchColumn()$prep,你PDOStatement對象的對象。

$num = $prep->execute(array(':search_term' => '%'.$search_term. '%')); 
if ($num) { 
    $total = $prep->fetchColumn(); 
} 

除此之外,你的SQL應該正確地執行它返回一個列應該包含你所需要的數量。

在這種情況下(特別是因爲您沒有參數調用fetchColumn())並不重要,但對於將來的讀者,建議將COUNT()集合命名爲可用於關聯或對象的別名取:

$sql = 'SELECT COUNT(*) AS num_books from t_books where title LIKE :search_term'; 
// Later access as num_books 
+0

它的工作。感謝你,我正在與PDO分頁。也感謝別名的建議。當我學習新事物時,我喜歡學習最佳實踐。 – user1582624

+0

用別名編輯我的原始代碼。 – user1582624