Bonjour,
Je me suis récemment mis à PHP et MYSQL, et avec les tutos je faisais les requêtes avec l'extension mysql_. Mon site fait une prise en charge multilingue, ce qui fait que je dois indiquer l'encodage UTF8 à la connexion à la BDD avec l'instruction :
mysql_set_charset( 'utf8' );
Cette instruction n'était pas dans les tutos que j'étudiais, mais je l'ai dénichée quelque part pour répondre à la nécessité de l'UTF8.
Problème : les tutos du SdZ sur le PHP et MYSQL sont en chamboulement, et aux dernières nouvelles, il faut préférer l'extention PDO à mysql_. Mais alors dans ce cas, quelle est la nouvelle ligne d'instruction avec PDO qui fait la même chose que :
ça peut aussi venir d'un bug de certaines versions de PHP où cette constante n'est pas définie, il faut alors la remplacer par sa valeur (enfin pas sûr que ça fonctionne non plus ) :
ça peut aussi venir d'un bug de certaines versions de PHP où cette constante n'est pas définie, il faut alors la remplacer par sa valeur (enfin pas sûr que ça fonctionne non plus ) :
<?php
$mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$mysql->exec('SET NAMES utf8');
Quant à la première solution, effectivement, ça ne marche pas. Ca me renvoie tout une tartine de messages (autant qu'il y a d'entrées dans ma table) du genre :
Notice: Undefined index: francais in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 30
Quant à la seconde, voici la récolte... :
Notice: Undefined variable: mysql in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 7
Fatal error: Call to a member function exec() on a non-object in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 7
Je précise (pour Jordan)que la PDO est activée, suivant scrupuleusement les instructions du docteur M@teo...
C'est donc peut-être une affaire de bug de mon PHP... Je fais quoi alors dans ce cas ? Pour information, j'utilise WampServer 2.0...
C'est la variable que j'ai utilisée dans mon code, qui est d'ailleurs une application d'un exemple de tuto. Je pense que son emploi est cohérent. Si tu veux, je te donne le script en entier pour que tu l'analyses :
<?php
//Configuration des termes du verba pour la langue du site
try
{
$bdd = new PDO('mysql:host=localhost;dbname=coursphp', 'root', '');// Connexion à MySQL
//$mysql->exec('SET NAMES utf8');
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
//mysql_set_charset( 'utf8' ); //Indication de l'encodage de MySQL
//SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8';
$reponse = $bdd->prepare('SELECT terme, verba, ? FROM essais_gloss') or die(print_r($bdd->errorInfo())); // Préparation de la requête
$reponse->execute(array ($langue_site)); // exécution de la requête
// On fait une boucle pour lister tout ce que contient la table :
while ($liste_termes = $reponse->fetch())
{
${'v_' . $liste_termes['terme']} = $liste_termes['verba'];
${$liste_termes['terme']} = $liste_termes[$langue_site];
/*echo ${'v_' . $liste_termes['terme']}. '<br />';
echo ${$liste_termes['terme']}. '<br /><br />';*/
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>
Oops ! Tout bête... Il m'avait échappé celui-là... C'est en fait ce que voulait dire Jordan... J'avais donc pas compris son très laconique : "$bdd et non pas $mysql". Mais pas trop bavarde la mec... Merci pour tous.
je suis sur le même probleme, j'essaie de créer un flux rss avec des données de ma base SQL.
Mon flux fonctionne mais sans mes variables. J'ai utilisé W3G pour tester mon code et c'est mon PDO qui apparament bug mais je ne sais pas ou. Est ce que vous auriez une idée de ou chercher ?
La deuxième est fausse : c'est utf8 et non UTF-8 chez MySQL (cf SHOW CHARACTER SET;)
Sinon, oui, la première pourrait théoriquement valoir des injections, je cite la doc de la fonction C mysql_real_escape_string utilisée derrière par PHP (d'autant que les requêtes préparées sont émulées par défaut par le pilote mysql) :
If you must change the character set of the connection, use the mysql_set_character_set() function rather than executing a SET NAMES (or SET CHARACTER SET) statement. mysql_set_character_set() works like SET NAMES but also affects the character set used by mysql_real_escape_string(), which SET NAMES does not.
Qui dit en clair de ne JAMAIS exécuter SET NAMES (à moins de ne pas avoir le choix - ie PHP < 5.3.6) en tant que requête puisque le client, n'ayant pas l'information, serait dès lors incapable de réaliser un échappement correct. Il faut passer par l'équivalent client, ici, le paramètre charset du DSN.
Même si en pratique, ça ne doit concerner que les jeux de caractères asiatiques codés sur plusieurs octets (comme SJIS, BIG5 et GBK).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli