2009-06-19 62 views
3

請原諒我這個問題的愚蠢可能性,但我剛開始使用準備好的語句。我知道這個特定的查詢是有效的,因爲我用毫無準備的程序方法對它進行了測試。這裏是:準備好的聲明不會返回任何東西

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

任何意見或正確的方向點非常感謝!

編輯1: 只是我嘗試排除故障時的進度更新。我意識到,由於我在節表中有一個id列作爲索引,因此我還需要將此綁定爲php.net上的上述語句(再次感謝Bill)。

這裏的新代碼:再次

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($id, $name, $content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

感謝所有誰可以提供建議。 (我很好奇:用這種方法使用OOP風格的準備語句很難調試,例如,是否有簡單的方法來簡單地查看實際使用的查詢?)

編輯2 : 嗨,謝謝你的測試,我非常感謝。我明白你被迫提出的問題,因爲我現在也在腦海中喋喋不休。我必須說它確實存在。

如果我做以下,就像一個快速和骯髒的例子:

$name = 'introduction'; 
@mysql_connect('host', 'user', 'pass'); 
@mysql_select_db('db'); 
$query = "SELECT name,content FROM sections WHERE name = '$name'"; 
$result = mysql_query($query) or die(mysql_error()); 
while($row = mysql_fetch_object($result)) { 
    $content = $row->content; 
    echo $content; 
} 

我的數據出現,一切都很好。但是,如果我做到以下幾點:

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($name, $content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

我相信這是正確的(如果還有不清楚,叫喊當然),我什麼也沒得到。更重要的是,通過該代碼,當我進行html驗證(以防萬一)時,我得到一個內部服務器警告(500),我認爲這是sql代碼的問題。我只是堅果?

感謝您的持續幫助,非常感謝!

編輯3: 嗯,我覺得自己像一個白癡,但是,我已經解決了它,比爾,你的問題是正確的。我不知道我是如何設法輸入不正確的數據庫細節並且錯過它們很長時間的,但這正是發生的事情。

再次感謝您的耐心和樂於幫助。

+0

請不要張貼答案作爲您的問題的更新 - 這就是編輯鏈接是爲 – 2009-06-19 23:39:47

回答

4

我看不出有什麼不對您的陳述或使用參數的準備,但有什麼不對你結合結果:

http://php.net/manual/en/mysqli-stmt.bind-result.php說:

注意所有欄必須綁定 後mysqli_stmt_execute()和之前 調用mysqli_stmt_fetch()

(重點煤礦)


上述文檔應被視爲在查詢表中的所有列,並非所有列。

好吧,我只是嘗試這樣做我自己。如果我省略了$name列,它給出了這樣的警告:

PHP Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /Users/bill/workspace/PHP/mysqli.php:0 
PHP 2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9 

但它確實獲取數據。

如果我將$name$content都綁定到查詢的結果上,那麼它的工作原理沒有錯誤或警告。

所以我不得不問你:你是肯定在數據庫中有一行符合你的條件?那是name = 'introduction'?請記住,在SQL中,字符串比較默認情況下區分大小寫。

我發現人們經常犯的一個錯誤是他們連接到PHP腳本中的不同數據庫,而不是他們用於臨時查詢的數據庫。因此,您需要確保您正在驗證數據是否存在於正確的數據庫中。

0

難道不該

$stmt->bind_result($name, $content); 

當您選擇了2列