Is PDO ... SET NAMES utf8 dangerous? - php

Looking at here: http://www.php.net/manual/en/mysqlinfo.concepts.charset.php
I understand that using
SET NAMES utf8
is not a good idea, but it is not clear:
What is the issue?
How to avoid it?
Which is actually the solution to set the charset for a (or all) PDO connection(s) in a PHP 3.6 or higher?
The code I'm afraid is dangerous:
$this->_conn = new PDO('mysql:host=host.name.blabla;dbname=my_database_name','username', 'password',array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
));
Thanks!

Are you really still using PHP >= version 3.6 and < 5.3.6 ?
Assuming you have 5.3.6 or later...
Character sets
and PDO_MYSQL DSN
say that you should use
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8",
'my_user', 'my_pass');
And implies (not clearly enough) that utf8 should be replaced by utf8mb4 if appropriate.
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' is not as good, but was the alternative before 5.3.6.
I think "dangerous" is too strong a word, even pre-5.3.6.
A related technique: Using init_command = SET NAMES ... in my.cnf is bad because init_command is not executed when connecting as root.
utf8mb4 is the preferred CHARACTER SET for UTF-8 because it includes Emoji and some Chinese characters that were missing from utf8. That charset is available starting with MySQL version 5.5.3.

Related

Prevent special characters replacement into my DB with PHP

When I save François into my DB, it becomes François.
How can I prevent it to keep François ?
During my PDO connection I already use PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8".
Thanks.
you can change charset to utf8 after starting PDO connection.
$pdo_object = new PDO(...);
$pdo_object->exec("SET NAMES 'utf8'; SET CHARSET 'utf8'");

How to use UTF-8 with Firebird and PHP Data Objects (PDO)

With mysql I can just do this to solve the problem:
$diveOptions = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); // set names utf-8 and works well
$pdo = new PDO('mysql:host=mysql.example.com;dbname=example_db',"username","password",diveOptions);
But I can't do the same with the firebird's pdo connection.
How can I solve this problem of UTF-8?
Already tried charset=utf8 in pdo configuration don t work too..
$str_conn = "firebird:dbname=C:\db\banco.gdb;charset=utf8;host=localhost";
$dbh = new PDO($str_conn, "SYSDBA", "masterkey");
In my db was set to nome like this:
DEFAULT CHARACTER SET NONE COLLATION NONE;

adding hebrew value to sql using PDO

I am trying to add a Hebrew value to a database using php's PDO class.
After finally succeeding doing that
(by using: array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"), I found out that COLLATE HEBREW_CI_AS is added to my value.
Is there any way to prevent this addition?
thank you, and sorry for my bad English.
PHP: The Right Way is a good source of information on this.
Basically check whether your PDO-connection specifies the charset in the DSN:
new PDO(
'mysql:host=your-hostname;dbname=your-db;charset=utf8',
'your-username',
'your-password',
array(
# ... PDO Connection Options
)
);
Make sure your database tables are set to use the utf8-collation, either by phpmyadmin or using the mysql-command line utility and the following query:
ALTER TABLE table_name COLLATE utf8;
Also you might want to consider using utf8mb4 as is suggested in the book.

PDO, mysql, utf8 (arabic text) doesnt show in php

I have the following php code. Connection is OK but it doesn't show the Arabic text stored in the database correctly. Just question marks.
$mysqlPDO = new PDO('mysql:host='.HOSTNAME.';charset=utf8;dbname='.DBNAME.'',DBUSERNAME, DBPASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));
$stmt = $mysqlPDO->prepare("SHOW TABLES LIKE 'main_patches_version'");
$stmt->execute();
The DB collation is already set to utf8_general_ci and the table has utf8 as charset.
This application is calling Zend libraries which I'm not aware of.
I checked that the HTML has utf8 as encoding type. any suggestion?
I'm using xampp server, php version 5.5.11, mysql version 5.6.16
I found the solution here
http://akrabat.com/php/utf8-php-and-mysql/
I unmarked
character_set_server=utf8 from my.ini file and it works.
Thanks all
Make sure your DB collation is set to use utf8_general_ci or utf8mb4_general_ci.

PDO + MySQL and broken UTF-8 encoding [duplicate]

This question already has answers here:
UTF-8 all the way through
(13 answers)
Closed 5 months ago.
I use the PDO library with a MySQL database in PHP, but if I insert any data encoded in UTF-8, like Arabic words, it’s inserted into the database, but as ?????????.
In my own framework, after I create the PDO connection, I send two queries – SET NAMES utf8 and SET CHARACTER SET utf8. It still doesn’t work.
Example:
loadclass('PDO', array(
sprintf(
'mysql:host=%s;port=%s;dbname=%s',
confitem('database', 'host'),
confitem('database', 'port'),
confitem('database', 'name')
),
confitem('database', 'username'),
confitem('database', 'password'),
array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect'))
));
$this->query('SET NAMES ' . confitem('database', 'charset'));
$this->query('SET CHARACTER SET ' . confitem('database', 'charset'));
Workaround: Use the json_encode function to convert data before inserting it to the database, and use json_decode to decode it after fetching. This is how I do it now.
Warning: This answer applies to PHP 5.3.5 and lower. Do not use it for PHP version 5.3.6 (released in March 2011) or later.
Compare with Palec's answer here.
Use:
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName',
'username',
'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
It forces UTF-8 on the PDO connection. It worked for me.
You have to set the correct character set for the connection. Add the charset=utf8 option to the DSN (this is MySQL-specific!)
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName;charset=utf8',
'username',
'password'
);
However, in PHP versions before 5.3.6 (released in March 2011), you must use a workaround as the charset option in the DSN is not supported.
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName',
'username',
'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
All attempts like:
PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "
or
$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt);
or
$this->connection->exec("set names utf8");
still generated unreadable text mess.
In my case, the cause of the problem was: htmlentities used prior to inserting data into a database.
Cyrillic letters were destroyed completely.
Try setting the default_charset value in php.ini to UTF-8. Or you can set it using the ini_set function.
Also, if the input is coming through form submissions, make sure your web pages are set to UTF-8 using the meta tag.
When interacting with mysql or mariadb, charset 'utf8' is not correct. You need to use utf8mb4. Due to historical issues, utf8 in mysql/mariadb is an alias to utf8mb3 which can only contain a subset of utf8 (3 bytes instead of 4)
So adding 'charset=utf8mb4' to your PDO DSN connection string is the correct thing to do for recent PHP versions, NOT charset=utf8.
For example, the poop emoji in full color: 💩 cannot be stored if the column and PDO are not utf8mb4.

Categories