[英]PDO and UTF-8 special characters in PHP / MySQL?
我正在使用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::setAttribute()
设置 PDO::MYSQL_ATTR_INIT_COMMAND
,您必须使用$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
行而不是MyISAM
行中查找DEFAULT
。 我意识到我提供的设置阻止我使用SET storage_engine=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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.