我目前正在开发一个项目,而不是使用常规的MySQL查询,我认为我会继续学习如何使用PDO。
我有一个名为参赛者的桌子,数据库,桌子和所有栏目都在utf-8中。我在参赛者表中有十个参赛作品,他们的专栏“名称”包含åäö。
等字符现在,当我从数据库中获取一个条目,并且var_dump名称时,我得到一个好结果,一个包含所有特殊字符的字符串。但我需要做的是按字符分割字符串,将它们放入一个我随后洗牌的数组中。
例如,我有这个字符串: 测试ÅÄÖTåän
当我运行str_split时,我会在数组中获取它自己的键中的每个字符。唯一的问题是所有特殊字符都显示为: ,意味着数组将是这样的:
Array
(
[0] => T
[1] => e
[2] => s
[3] => t
[4] =>
[5] => �
[6] => �
[7] => �
[8] => �
[9] => �
[10] => �
[11] =>
[12] => T
[13] => �
[14] => �
[15] => �
[16] => �
[17] => n
)
正如您所看到的,它不仅会弄乱角色,而且还会在str_split进程中复制它们。我已经尝试了几种方法来分割字符串,但它们都有相同的问题。当我在分割之前输出字符串时,它会显示特殊字符。
这是我的dbConn.php代码:
//需要配置文件: require_once( '的config.inc.php');
// Start PDO connection:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf-8", $dbUser, $dbPass);
$dbHandle -> exec("SET CHARACTER SET utf8");
// Set error reporting:
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
这是我用来从数据库中获取并循环的代码:
// Require files:
require_once('dbConn.php');
// Get random artist:
$artist = $dbHandle->query("SELECT * FROM ".ARTIST_TABLE." WHERE id = 11 ORDER BY RAND() LIMIT 1");
$artist->setFetchMode(PDO::FETCH_OBJ);
$artist = $artist->fetch();
var_dump($artist->name);
// Split name:
$artistChars = str_split($artist->name);
我正在使用utf-8连接,我的php文件是utf-8 没有BOM ,此页面上没有其他特殊字符共享此问题。什么可能是错的,或者我做错了什么?
答案 0 :(得分:152)
请注意,连接字符串中使用的utf8声明报告不起作用。 在php.net上的评论中,我经常看到这个替代方案:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
答案 1 :(得分:12)
答案 2 :(得分:10)
使用PDO的UTF-8
将国际(甚至中国和泰国)字符写入数据库时的问题可能有更多方法可以完成这项工作。我不是专家,只是一个技术狂热者,有兴趣了解这一切。在Linux和Windows中,我使用以下网站中的示例设置了一些CMS(内容管理系统):
' http://www.elated.com/articles/cms-in-an-afternoon-php-mysql'
示例正在使用PDO进行插入,更新和删除。
我花了几个小时才找到解决方案。无论我做了什么,我总是总结我的表格和phpmyadmin / heidi -views
中的数据之间的差异我遵循以下提示:' https://mathiasbynens.be/notes/mysql-utf8mb4'但仍然没有成功
在我的CMS结构中有一个文件' Config.php': 阅读此网页后,我更改了行
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings);
到
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8');
现在一切正常。
答案 3 :(得分:4)
str_split
函数按字节分割,而不是按字符分割。您需要mb_split
。
答案 4 :(得分:3)
这项工作对我来说......希望它有用。
确保数据库,apache和每个配置都在utf8中。
PDO OBJECT
$dsn = 'mysql:host=' . Config::read('db.host') . ';dbname=' . config::read('db.basename') .';charset=utf8'. ';port=' . Config::read('db.port') .';connect_timeout=15';
$user = Config::read('db.user');
$password = Config::read('db.password');
$this->dbh = new PDO($dsn, $user, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
$this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
如果不使用str_word_count等其他函数,它就可以工作。
使用str_word_count你需要使用utf8_decode(utf8_encode)..
function cortar($str)
{
if (20>$count=str_word_count($str)) {
return $str;
}
else
{
$array = str_word_count($str,1,'.,-0123456789()+=?¿!"<>*ñÑáéíóúÁÉÍÓÚ@|/%$#¡');
$s='';
$c=0;
foreach ($array as $e) {
if (20>$c) {
if (19>$c) {
$s.=$e.' ';
}
else
{
$s.=$e;
}
}
$c+=1;
}
return utf8_decode(utf8_encode($s));
}
}
函数用20个字重写字符串。
答案 5 :(得分:1)
<强> 1。如何保存UTF-8租船人(数学字符串,特殊字符如92÷8÷2 =?)?
答。 $ string = utf8_encode('92÷8÷2 =?');
<强> 2。如何从数据库中打印UTF-8租船人?
答。 echo utf8_decode($ string);
注意:如果您不想使用编码/解码来执行此操作,可以通过。
执行此操作$conn = mysqli_connect('localhost','db_username','password','your_database_name');
mysqli_set_charset($conn,"utf8");
class Database extends PDO{
function __construct() {
parent::__construct("mysql:host=localhost;dbname=your_db_name","gurutslz_root","Your_db_password",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
}
}
$conn=new Database();
答案 6 :(得分:0)
在我的数据库结构中,存储产品说明的文本字段只有问题。我将字段设置设置为blob而不是文本,这解决了我的问题。