奇怪的PDO行为

时间:2016-01-20 23:27:32

标签: php mysql sql database 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");

我得到一个空的结果。

显然 description 字段存在。显然我用PHPMyAdmin测试了新查询。

我发现:

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

TRUE ,我还尝试将 fetclAll 更改为 FETCH_BOTH

你有什么建议吗?

编辑:好的,我发现了问题:

在记录中,描述列中有一个“è”。如果我删除“è”,一切都很完美。为什么会这样?

1 个答案:

答案 0 :(得分:0)

问题是由于数据库记录中带有重音字母。

解决方案是使用 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4") 将连接的字符集设置为' UTF-8 MultiByte 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