2015-12-18 1 views
0

J'essaie d'insérer des données dans ma table de base de données mais je reçois cette exception, lorsque j'essaie d'enregistrer le symbole de l'euro dans la colonne des devises :Impossible d'insérer des symboles comme '€' dans MySQL en utilisant PHP/PDO

PDOException: SQLSTATE[HY000]: General error: 1366 
Incorrect string value: '\x80' for column 'currency' at row 1 

Si je n'utilise aucun symbole, cela fonctionne correctement. Aucune exception n'est levée et les données sont écrites correctement dans la table de la base de données.

C'est la pile technologique J'utilise:

  • PHP 5.6.16
  • MySQL 5.7
  • Apache 2.4
  • AOP (au lieu de mysqli)

Je essayé de google une solution, mais rien n'a fonctionné pour moi:

  • J'ai essayé de changer le jeu de caractères de ma base de données, des tables et des colonnes à UTF8mb4
  • J'ai fait des modifications de configuration aux jeux de caractères dans mon php.ini
  • Je l'ai essayé avec mysqli et maysql au lieu de PDO
  • Je l'ai écrit « charset = utf8mb4 » dans la chaîne de connexion de l'objet AOP

Mais rien utile ...

Voici le script de créer ma table, je me sers au moment:

CREATE TABLE `cars` (
`car_id` int(11) NOT NULL AUTO_INCREMENT, 
`brand` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, 
`model` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, 
`car_trim` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
`model_year` int(11) DEFAULT NULL, 
`car_condition` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
`car_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
`currency` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, <-- Where the € should be 
PRIMARY KEY (`xy`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_unicode_ci; 

Ma connexion PDO ressemble à ceci:

if(!isset(self::$connection)) { 
     try { 
     self::$connection = new PDO('mysql:host='.self::$config['host']. 
           ';dbname='.self::$config['dbname']. 
           ';port='.self::$config['port']. 
           ';charset='.self::$config['charset'], //utf8mb4 
           self::$config['username'], 
           self::$config['password'] 
           ); 
     self::$connection->setAttribute(PDO::ATTR_ERRMODE, 
             PDO::ERRMODE_EXCEPTION); 
     } catch (PDOException $e) { 
     self::$logger->LogError('Connection.php: ' . $e->getMessage()); 
     echo $e->getMessage(); 
     self::$connection->rollBack(); 
     $this->closeConnection(); 
    } 
} 

Le code PHP avec l'instruction d'insertion:

$db = new Db(); 

$car = new Car($_POST['carBrand'], $_POST['carModel'], $_POST['carTrim'],  
$_POST['carModelYear'], $_POST['carCondition'], 
$_POST['carType'], $_POST['carFuelType'], $_POST['carTransmission'], 
$_POST['carEngine'], $_POST['carCylinder'], 
$_POST['carMileage'], $_POST['carExteriorColor'], 
$_POST['carInteriorColor'], $_POST['carLocation'], $_POST['carVin'], 
$_POST['carDriveTrain'], $_POST['carStock'], $_POST['carPrice'], 
$_POST['carPriceDetails'], $_POST['carCurrency'], 
$_POST['carTax'], $_POST['carTaxDetails'], $_POST['carDescr'], 
$_POST['carBodyDescr'], $_POST['carDriveTrainDescr'], 
$_POST['carExteriorDescr'], $_POST['carElectronicsDescr'], 
$_POST['carSaftyFeaturesDescr'], $_POST['carSpecialFeaturesDescr'], 
null, null, null, null, null, null, null, null, null, null, 'Edi', 'Edi', 
(empty($_POST['carOnline'])) ? 'off' : 'on'); 

$car_insertStm = 'INSERT INTO cardealer.cars (' . 
'brand, model,car_trim,model_year,car_condition,car_type, fuel_type, transmission, ' . 
'car_engine, cylinder, mileage, exterior_color, interior_color, location, vin, drive_train, ' . 
'stock, price, price_descr, currency, tax, tax_descr, car_descr_long, body_descr, ' . 
drive_train_descr, exterior_descr, electronics_descr, safty_features_descr, special_features_descr, car_pic_1, car_pic_2, car_pic_3, ' . 
'car_pic_4, car_pic_5, car_pic_6, car_pic_7, car_pic_8, car_pic_9, car_pic_10, create_user, ' . 
'change_user, car_online) ' . 
'VALUES (:brand, :model, :car_trim, :model_year, :car_condition, :car_type, :fuel_type, :transmission, :car_engine, :cylinder, ' . 
':mileage, :exterior_color, :interior_color, :location, :vin, :drive_train, 
:stock, :price, :price_descr, :currency, :tax, :tax_descr, ' . 
':car_descr_long, :body_descr, :drive_train_descr, :exterior_descr, 
:electronics_descr, :safty_features_descr, :special_features_descr, ' . 
':car_pic_1, :car_pic_2, :car_pic_3, :car_pic_4, :car_pic_5, :car_pic_6, 
:car_pic_7, :car_pic_8, :car_pic_9, :car_pic_10, :create_user, ' . 
':change_user, :online) '; 

$pStatement = $db->getConnection()->prepare($car_insertStm); 

$pStatement->bindParam(':brand', $_POST['carBrand'], PDO::PARAM_STR); 
$pStatement->bindParam(':model', $_POST['carModel'], PDO::PARAM_STR);   
$pStatement->bindParam(':car_trim', $_POST['carTrim'], PDO::PARAM_STR);   
$pStatement->bindParam(':model_year',    
         $_POST['carModelYear'],PDO::PARAM_INT);   
$pStatement->bindParam(':car_condition', 
         $_POST['carCondition'], PDO::PARAM_STR);   
$pStatement->bindParam(':car_type', $_POST['carType'], PDO::PARAM_STR);   
$pStatement->bindParam(':fuel_type', $_POST['carFuelType'], PDO::PARAM_STR);   
$pStatement->bindParam(':transmission', 
         $_POST['carTransmission'], PDO::PARAM_STR); 
$pStatement->bindParam(':car_engine', $_POST['carEngine'], PDO::PARAM_STR);    
$pStatement->bindParam(':cylinder', $_POST['carCylinder'], PDO::PARAM_STR);  
$pStatement->bindParam(':mileage', $_POST['carMileage'],PDO::PARAM_INT);   
$pStatement->bindParam(':exterior_color', 
         $_POST['carExteriorColor'], PDO::PARAM_STR); 
$pStatement->bindParam(':interior_color', 
         $_POST['carInteriorColor'], PDO::PARAM_STR);  
$pStatement->bindParam(':location', $_POST['carLocation'], PDO::PARAM_STR);  
$pStatement->bindParam(':vin', $_POST['carVin'], PDO::PARAM_STR);   
$pStatement->bindParam(':drive_train', 
         $_POST['carDriveTrain'], PDO::PARAM_STR); 
$pStatement->bindParam(':stock', $_POST['carStock'], PDO::PARAM_STR);   
$pStatement->bindParam(':price', $_POST['carPrice'], PDO::PARAM_STR);   
$pStatement->bindParam(':price_descr', 
         $_POST['carPriceDetails'], PDO::PARAM_STR);  
$pStatement->bindParam(':currency', $_POST['carCurrency'], PDO::PARAM_STR); // Parameter binding for the currency --> €  
$pStatement->bindParam(':tax', $_POST['carTax'],PDO::PARAM_INT);    
$pStatement->bindParam(':tax_descr', 
         $_POST['carTaxDetails'], PDO::PARAM_STR);  
$pStatement->bindParam(':car_descr_long', 
         $_POST['carDescr'], PDO::PARAM_STR);   
$pStatement->bindParam(':body_descr', 
         $_POST['carBodyDescr'], PDO::PARAM_STR); 
$pStatement->bindParam(':drive_train_descr', 
         $_POST['carDriveTrainDescr'], PDO::PARAM_STR); 
$pStatement->bindParam(':exterior_descr', 
         $_POST['carExteriorDescr'], PDO::PARAM_STR); 
$pStatement->bindParam(':electronics_descr', 
         $_POST['carElectronicsDescr'], PDO::PARAM_STR);  
$pStatement->bindParam(':safty_features_descr', 
         $_POST['carSaftyFeaturesDescr'], PDO::PARAM_STR); 
$pStatement->bindParam(':special_features_descr', 
         $_POST['carSpecialFeaturesDescr'], PDO::PARAM_STR); 
$pStatement->bindValue(':car_pic_1', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_2', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_3', null, PDO::PARAM_LOB); 
$pStatement->bindValue(':car_pic_4', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_5', null, PDO::PARAM_LOB);  
$pStatement->bindValue(':car_pic_6', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_7', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_8', null, PDO::PARAM_LOB);    
$pStatement->bindValue(':car_pic_9', null, PDO::PARAM_LOB);   
$pStatement->bindValue(':car_pic_10', null, PDO::PARAM_LOB);    
$pStatement->bindValue(':create_user', "Edi", PDO::PARAM_STR);  
$pStatement->bindValue(':change_user', "Edi", PDO::PARAM_STR); 
$pStatement->bindValue(':online', 
         (empty($_POST['carOnline'])) ? "off" : "on", 
         PDO::PARAM_STR); 

$result = $pStatement->execute(); 

serait très bien si quelqu'un pouvait me aider à sortir de cette mes. Chaque aide est très appréciée.

Merci d'avance.

+0

Peut-être que je l'ai manqué parce que je ne connais pas trop PDO, mais où est le code qui essaie d'insérer le symbole de l'euro? Dans quelle colonne va-t-il?Vous avez fourni une définition de table pour une table "cars" qui ne contient aucun élément qui semblerait avoir l'intention de contenir un symbole de l'euro, donc je pense que vous devez fournir plus de code. – dman2306

+0

Merci d'avoir lu ma question.J'ai mis un peu plus de code. J'espère que cela vous aide. – F4k3d

+0

'\ x80' n'est sûrement pas un codec Unicode et pas UTF-8 non plus. Je suppose que votre code source et avec lui vos chaînes ne sont pas UTF-8. Cela dit, nous utilisons 'utf8_unicode_ci' sans aucun problème avec les caractères en dehors de la plage ASCII. –

Répondre

0

J'ai une solution, que je ne sais pas si c'est la parfaite, mais au moins ça marche bien!

J'ai ajouté cette ligne de code après avoir ouvert la connexion de base de données:

$pStatement = $db->getConnection()->query("SET CHARACTER SET utf8"); 

Après cette requête, je pourrais insérer ce que je veux (par exemple ÄÜÖöäü§ €% $ '# etc ...) et il est finalement stocké correctement dans ma table.

Eh bien, merci d'avoir essayé de m'aider. J'espère que cette solution peut aider quelqu'un d'autre, qui a le même problème.

Je vous souhaite une bonne année. :-)