2012-11-06 74 views
1

我正在嘗試創建一個可以抓取表內所有帖子的函數。我也想添加一個可選的LIMIT參數。這裏是一個例子:可選LIMIT用於抓取所有PDO的帖子

function get_all_posts($conn, $limit = 0) { 
if ($limit > 0) { 
    $stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit"); 
    $stmt->execute(array(
     ':limit' => $limit 
    )); 
    $results = $stmt->fetchAll(); 
    return $results ? $results : false ; 
} else { 
    $stmt = $conn->prepare("SELECT * FROM posts"); 
    $stmt->execute(); 
    $results = $stmt->fetchAll(); 
    return $results ? $results : false ; 
} 
} 

如果我不使用限制參數調用該函數它的作品,並顯示所有帖子。但是,如果我像這樣調用函數:get_all_posts($ conn,「1」);然後我得到這個錯誤:

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 ''1'' at line 1' in /Applications/MAMP/htdocs/sandbox/blog2/functions.php:19 Stack trace: #0 /Applications/MAMP/htdocs/sandbox/blog2/functions.php(19): PDOStatement->execute(Array) #1 /Applications/MAMP/htdocs/sandbox/blog2/index.php(12): get_all_posts(Object(PDO), '1') #2 {main} thrown in /Applications/MAMP/htdocs/sandbox/blog2/functions.php on line 19

任何人都可以告訴我我哪裏出了錯?

回答

1

默認PDO execute()治療參數爲一個字符串。因此它引用了"1"。您將需要使用bindParam()

雖然MySQL可能會處理這個,你應該相應地綁定這個參數(作爲一個INT)。有關更多詳細信息,請參閱此related question

+0

你是一個拯救生命的人,謝謝! 你說MySQL可能會處理這個問題,但在我的情況下,這並不意味着它在某些情況下會起作用,有些情況下不會呢? – Ben

+0

根據我們的配置,MySQL有時在字符串到整數的比較上是寬鬆的。無論如何,我認爲最好在這種情況下將'limit'作爲一個整數來綁定。看起來像** hakre **已經提供了一個代碼示例。 –

3

1不是字符串,所以不要把引號在這裏:get_all_posts($conn, 1);

0

就像Sammitch說的那樣,它是因爲它的一個字符串,而不是一個整數。使用該修復:

if (is_numeric($limit)) { 
    $limit = (int)$limit; 
    ... 

以清除任何變量類型發出

+0

實際上沒有理由檢查它是否爲數字 – zerkms

+0

@zerkms我始終確保在轉換爲整數時,如果輸入了除數字之外的其他內容(即使在字符串中)以停止錯誤操作,但事先將數字轉換爲數字爲此,'(int)'alskdfj''仍然等於0 – topherg

+0

@cgoddard:對於'LIMIT'的參數應該**總是**是一個數字。所以沒有理由檢查它。 「但爲此,(int)'alskdfj'仍然等於0」 - 那又如何? – zerkms

0

在你需要一個整數參數LIMIT條款。

在你的代碼中,你傳遞了:limit' parameter's value via execute`,這些都是字符串。

一個字符串不是一個整數。這種不匹配造成了你的問題。

取而代之的是整數參數,你很好。

$stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit"); 
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 
$success = $stmt->execute(); 
$results = $stmt->fetchAll(); 

當你通過一個函數參數接受$limit變量,你應該清理它的價值,以及:

$limit = (int) $limit; 

結合它作爲一個整數時,這將確保您使用的整數類型的變量參數。