Je récupère des données en arabe à partir de tables MySQL avec MySQLi. Donc, j'utilise généralement ceci dans un style procédural:
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
Maintenant, j'utilise le style OOP donc j'essaie de voir s'il y a quelque chose que je pourrais définir plutôt que ce qui précède?
Je n'ai trouvé cela que dans PHP manual alors je l'ai fait, mais qu'en est-il de la définition des noms en UTF8?
$mysqli->set_charset("utf8");
C'est le même:
$ mysqli-> query ("SET NAMES 'utf8'");
Dans le manuel:
C'est le moyen préféré de modifier le jeu de caractères. L'utilisation de mysqli :: query () pour exécuter SET NAMES .. n'est pas recommandée.
$mysqli->set_charset("utf8");
suffit, laissez le pilote mysqli db faire la chose pour vous.
Tu devrais utiliser
$mysqli->set_charset("utf8");
N'utilisez pas explicitement SET NAMES
Ou SET CHARACTER SET
Lorsque vous utilisez MySQLi. Et n'utilisez certainement pas les deux comme le demandeur était ici à l'origine. Raisons pour lesquelles c'est une mauvaise idée:
SET CHARACTER SET utf8
Après SET NAMES utf8
En fait juste annule une partie du travail qui SET NAMES
did .Le manuel PHP nous avertit explicitement d'utiliser mysqli_set_charset
, Pas SET NAMES
:
Il s'agit de la méthode préférée pour modifier le jeu de caractères. Utiliser mysqli_query () pour le définir (comme SET NAMES utf8) n'est pas recommandé. Voir la section Concepts du jeu de caractères MySQL pour plus d'informations.
Sous le capot, mysqli_set_charset
Est juste un wrapper pour mysql_set_character_set
de l'API MySQL C (ou son équivalent mysqlnd). En regardant les documents pour cette fonction , nous pouvons voir la différence entre elle et SET NAMES
:
Cette fonction fonctionne comme l'instruction
SET NAMES
, Mais définit également la valeur demysql->charset
, Et affecte donc le jeu de caractères utilisé parmysql_real_escape_string()
En d'autres termes, $mysqli->set_charset('foo')
fera tout ce que SET NAMES foo
Fait et aussi s'assurera que mysqli_real_escape_string
Respecte le nouvel encodage. Certes, si vous utilisez uniquement des encodages comme Latin 1 et UTF 8 qui étendent strictement ASCII (c'est-à-dire, qui encodent toutes les chaînes ASCII exactement comme elles le feraient) être encodé en ASCII), puis utiliser SET NAMES
au lieu de set_charset
ne cassera rien. Cependant, si vous utilisez des encodages plus inhabituels comme GBK, vous pourriez finir par brouiller vos chaînes ou même en introduisant vulnérabilités d'injection SQL qui contournent mysqli_real_escape_string
.
Il est donc recommandé de n'utiliser que set_charset
, Pas SET NAMES
. Il n'y a rien que SET NAMES
Fait que set_charset
Ne fait pas, et set_charset
Évite le risque que mysqli_real_escape_string
Se comporte de manière incorrecte (ou même de manière non sécurisée).
Vous pouvez l'utiliser. C'est vraiment bien pour le jeu de caractères mysqli
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "dbpass";
$dbname = "dbname";
$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
mysqli_query($conn,"SET CHARACTER SET 'utf8'");
mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'");
Pour les amateurs de style procédural.
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
/* change character set to utf8 */
mysqli_set_charset($conn,"utf8");