PHP / MySQL中的PDO和UTF-8特殊字符



我使用MySQL和PHP 5.3,并尝试了这个代码。

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$con = mysql_connect("localhost", "root", "");
mysql_set_charset('utf8');
if (!$con)
{
  die('Could not connect: ' . mysql_error());
}
mysql_select_db("kdict", $con);
$sql = "SELECT * FROM `en-kh` where english='a'";
echo $sql;
$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
{
  echo $row['english'] . " </br> " . $row['khmer'];
  echo "<br />";
}
?>

=>我得到了很好的UTF-8渲染显示,做得好。

但是现在我创建了一个类PDO来保持易于扩展和更容易

 class crud {
     // code..
     public function conn()
     {
         isset($this->username);
         isset($this->password);
         if (!$this->db instanceof PDO)
         {
             $this->db = new PDO($this->dsn, $this->username, $this->password);
             $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
             $this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");   
          }
      }
      /*more code here*/
}

/*** a new crud object ***/
$crud = new crud();
/*** The DSN ***/
$crud->dsn = "mysql:dbname=kdict;host=localhost";
/*** MySQL username and password ***/
$crud->username = 'root';
$crud->password = '';
/*** select all records from table ***/
$records = $crud->rawSelect("SELECT * FROM `en-kh` where english='a'");
/*** fetch only associative array of values ***/
$rows = $records->fetchAll(PDO::FETCH_ASSOC);
/*** display the records ***/
foreach($rows as $row)
{
    foreach($row as $fieldname=>$value)
    {
        echo $fieldname.' = '.$value.'<br />';
    }
    echo '<hr />';
}
?>

但是它显示我的角色是这样的'????'

我在Stack Overflow上找到了这个链接,它看起来像我遇到的同样的问题PHP/MySQL中的特殊字符

它看起来和我的问题一样=>我试着修复它,但我仍然不工作。

$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAME'utf8'");
谁能告诉我是什么问题?我怎样才能改正呢?

谢谢

你少了一个S:它是SET NAMES而不是SET NAME:

$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

你当然也需要取消注释。此外,PDO::MYSQL_ATTR_INIT_COMMAND可以PDO::setAttribute()设置后,你已经建立了你的数据库连接(常量名称说明一切),你必须在构造函数中指定它使用$driver_options参数,像这样:

$this->db = new PDO($this->dsn, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

另一种方法是在连接后立即执行相同的查询:

$this->db = new PDO($this->dsn, $this->username, $this->password);
$this->db->exec("SET NAMES 'utf8';");

我遇到了同样的麻烦,在尝试了1000000个不同的选项后发现默认的mysql引擎仍然是MyISAM。

验证InnoDB是默认存储引擎:

执行SHOW VARIABLES LIKE 'have_innodb';命令确认InnoDB是否可用。

然后发出命令SHOW ENGINES;来查看所有不同的MySQL存储引擎。

InnoDB行中查找DEFAULT,而不是在MyISAM行中查找。我意识到我的提供有一个设置阻止我使用SET storage_engine=MYISAM;更改默认引擎。在我的例子中,我联系了我的提供商,并被引导到可以更改选项的地方,以便能够更改默认引擎。希望这对你有帮助!

使用PDO插入特殊字符的可能方法,只需遵循以下步骤:

1)设置属性为您的连接类。

$this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAME'utf8'");

2)现在你可以使用htmlspecialchars查询创建和插入数据库:

$ShortDescription   = htmlspecialchars($_POST['ShortDescription'], ENT_QUOTES);
$LongDescription    = htmlspecialchars($_POST['LongDescription'],ENT_QUOTES);

它会运行良好

我建议始终通过PDO连接到数据库。

<?php
class connMysql {
    protected static $instance;
    private static $database_type = "mysql";    
    private static $hostname = "localhost";
    private static $user = “database_user”;
    private static $password = “database_user_password”;
    private static $database_name = “your_database”;
    private static $persistent = false;
    private function __construct() {
        try {
            self::$instance = new PDO(self::$database_type . ":host=" . self::$hostname . ";dbname=" . self::$database_name
                    , self::$user
                    , self::$password
                    , array(
                PDO::ATTR_PERSISTENT => self::$persistent,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_STRINGIFY_FETCHES => true,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
            ));
        } catch (PDOException $e) {
            echo "Connection Error: " . $e->getMessage();
        }
    }
    public static function getInstance() {
        if (!self::$instance) {
            new connMysql();
        }
        return self::$instance;
    }
    public static function close() {
        self::$instance = null;
    }
}

最新更新