2017-05-21 35 views
0

我目前很難理解爲什麼我用PHP編寫的聲明無法正常工作。PHP MySQL準備好的聲明不起作用

的代碼是這樣的:

$stmt = $db->prepare('SELECT * FROM mail WHERE userID = ? AND opened = 0'); 
    if($stmt) 
    { 
     $stmt->bind_param('s',$_SESSION['id']); 
     $stmt->execute(); 
     $stmt->store_result(); 

     $msgs = $stmt->num_rows; 

     $stmt->close(); 
    } 

    if($msgs > 0) 
    { 
     $msgs = '<span style="color: yellow;">'.$result->num_rows.'</span>'; 
    } 

    echo ' <a href="mail?id='.$_SESSION['id'].'"><img src="img/'.$mailico.'" alt="'.$mailstat.'" /> ('.$msgs.')</a>'; 

基本上,它應該檢查數據庫表「郵件」,並看看是否有任何PM的已發送到登錄的用戶還沒有已經打開,如果是,則顯示用戶在郵件圖標旁邊的括號中有多少新消息。

問題是,當我爲該用戶的表中有未打開的消息時,它不會使用消息的數量更新新的消息字段,並且是空白的(根本沒有數字)。

我使用mysqli_error($ db)檢查了mysql錯誤;但沒有回來。

我在想什麼,還是隻是恨我?

+0

你在哪裏聲明$結果?我看到有$ msgs = $ stmt-> num_rows,然後檢查它的值,然後在if語句中聲明新值。徽標是否正確? BTW。我總是使用try ... catch來獲得例外 – Strabek

回答

0

變化

$msgs = '<span style="color: yellow;">'.$result->num_rows.'</span>'; 

$msgs = '<span style="color: yellow;">' . $msgs . '</span>'; 
+0

這是一個問題。我以前曾試圖做一個基本的$ sql = <語句)查詢,並聲明瞭$ result來運行它,但是當我切換到$ stmt時,忘記更改該行。 我的一個疏忽。謝謝。 – Bryan

0

在PHP日誌中是否有錯誤?我認爲這個問題可能是因爲使用的$_SESSION['id']直接 - 嘗試創建一個變量第一像

$id=$_SESSION['id']; 
$stmt->bind_param('s',$id); 
0

的bind_param()需要一個參數的參數或指標的名稱。所以,你應該這樣寫代碼

$stmt = $db->prepare('SELECT * FROM mail WHERE userID = ? AND opened = 0'); 
$stmt->bind_param(1,$_SESSION['id']); 

$stmt = $db->prepare('SELECT * FROM mail WHERE userID = :user_id AND opened = 0'); 
$stmt->bind_param(':user_id',$_SESSION['id']); 
+0

這是mysqli,而不是pdo。如此命名的佔位符不被支持 - 甚至在pdo中,您可以使用未命名的佔位符(即''') – Qirel

0

試試這個:

$stmt = $db->prepare('SELECT * FROM mail WHERE userID = ? AND opened = 0'); 
    if($stmt) 
    { 
     $stmt->bind_param(1,$_SESSION['id']); 
     $stmt->execute(); 
     $msgs = $stmt->num_rows; 
     $stmt->close(); 
    } 

    if($msgs > 0) 
    { 
     $msgs = '<span style="color: yellow;">'.$result->num_rows.'</span>'; 
    } 

    echo ' <a href="mail?id='.$_SESSION['id'].'"><img src="img/'.$mailico.'" alt="'.$mailstat.'" /> ('.$msgs.')</a>';