2011-03-21 113 views
0

嘿,我有一個快速的。有沒有辦法將變量包含到準備好的查詢中?例如:php mysqli準備好聲明

$sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
       image_small, image_med, date 
     FROM posts 
     ORDER BY id DESC 
     LIMIT $start, $postsPerPage"; 

$result = $connect->prepare($sql) or die ('error'); 
$result->execute(); 
$result->bind_result($id, $title, $author, $excerpt, $image_small, $image_med, $date); 

謝謝!

+0

你的問題是不完整的,我想你想問的是:我如何檢索準備好的查詢結果。你的結果變量將是空的,直到你調用'$ result-> fetch()' – knittl 2011-03-21 08:29:50

回答

1

找到更多的例子如下替換查詢中的變量:

$start = 1; $postsPerPage = 1; 
$sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
       image_small, image_med, date 
     FROM posts 
     ORDER BY id DESC 
     LIMIT ?, ?"; 

$stmt = $connect->prepare($sql) or die ('error'); 
$stmt->bind_param('ii', $start, $postsPerPage); 
$stmt->execute(); 
$stmt->bind_result($id, $title, $author, $excerpt, $image_small, $image_med, $date); 

while($stmt->fetch()) { 
    printf('<h1>%s</h1><p>%s <small> by %s on %s</small></p>', 
    htmlspecialchars($title), 
    htmlspecialchars($excerpt), 
    htmlspecialchars($author), 
    htmlspecialchars($date) 
); 
} 

此結合兩者問號到整數的$start$postsPerPage和(i)值。直接做準備語句中使用變量,因爲那樣會(從消除解析時間間隔)

+0

呵呵,看看這正是我寫的,相同的順序和一切。變量在所有這一切之前得到聲明,所以我不知道爲什麼它不顯示。 – tim 2011-03-21 08:23:26

+0

@tim:不,它是不一樣的。你直接在你的sql字符串中插入你的變量(沒有轉義發生!)。你的問題可能是誤導性的,我猜你錯過了'$ result-> fetch()'之後 – knittl 2011-03-21 08:25:06

+0

我想我很困惑。我應該在什麼時候爲這些綁定變量賦值? – tim 2011-03-21 08:30:52

-1

如果我沒有記錯,你必須使用bindParam和一個問號

$sql = "SELECT id, title, author, LEFT(description, 40) AS excerpt, 
       image_small, image_med, date 
     FROM posts 
     ORDER BY id DESC 
     LIMIT ?, ?"; 

$result = $connect->prepare($sql) or die ('error'); 
$result->bindParam(1, $start); 
$result->bindParam(2, $postsPerPage); 

你可以在你想http://php.net/manual/en/pdo.prepared-statements.php

0
  • 使用問號在SQL您想要的變量值的佔位符擊敗預處理語句的全部目的成爲。使用mysqli_stmt::bind_param將值綁定到佔位符。