2016-01-20 71 views
0

我用下面的代碼:奇怪PDO行爲

try { 
     $this->conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD); 
     $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    }  
try { 
     $stmt = $this->conn->prepare("SELECT id, name FROM images"); 
     if ($stmt->execute()) { 
      if ($stmt->rowCount() > 0) 
       return $stmt->fetchAll(PDO::FETCH_ASSOC); 
     } 
     else 
      return NULL; 
    } 
    catch(PDOException $e) 
    { 
     return $e->getMessage(); 
    } 

的代碼完美的作品,但是當我編輯查詢:

$stmt = $this->conn->prepare("SELECT id, name, description FROM images"); 

我得到一個空的結果。

顯然說明字段存在。很顯然,我使用PHPMyAdmin測試了這個新查詢。

我發現:

if ($stmt->rowCount() > 0) 

TRUE,我也嘗試將fetclAll更改爲FETCH_BOTH

你有什麼建議嗎?

編輯:好的,我發現這個問題:

在一個記錄,列描述有一個「E」。如果我刪除了「è」,那麼所有的都是完美的。爲什麼會這樣呢?

+0

你看過你的錯誤日誌嗎?錯誤日誌說什麼? – Michael

+0

我在哪裏可以找到日誌文件? – helloimyourmind

+0

PHP最簡單的方法是在頁面頂部添加'error_reporting(-1);'行,直接在打開php標籤<?php後。那麼如果PHP中有任何錯誤或查詢數據庫時,它會顯示錯誤。 – Michael

回答

0

問題出在數據庫記錄中的重音字母。

的解決方案是使用array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4")到設置的字符集的連接到「UTF-8多字節4」,如下所示:

try { 
     $this->conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4")); 
     $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
    catch(PDOException $e) 
     { 
     echo $e->getMessage(); 
     } 

原因UTF-的該特定版本使用圖8解釋爲here

+0

你想使用'utf8mb4' *** not *** utf8作爲MySQL utf8不是真正的utf8。 http://stackoverflow.com/questions/279170/utf-8-all-the-through-through – Martin

+0

@馬丁感謝您的建議,我更新了我的答案。 – helloimyourmind

+0

您也可以在您的dsn(PDO的第一個參數)中使用'charset'來指定連接字符集。 – vfsoraki