2015-12-18 2 views
0

Я пытаюсь вставить некоторые данные в таблицу базы данных, но я получаю это исключение, когда пытаюсь сохранить символ евро в столбце валюты :Невозможно вставить символы MySQL в MySQL, используя PHP/PDO

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

Если я не использую какие-либо символы, он работает нормально. Никакое исключение не выбрасывается, и данные записываются правильно в таблице базы данных.

Это стек технологии я использую:

  • PHP 5.6.16
  • MySQL 5,7
  • Apache 2,4
  • PDO (вместо MySQLi)

У меня есть попытался найти решение Google, но для меня ничего не работало:

  • Я попытался изменить набор символов из моих баз данных, таблиц и столбцов UTF8mb4
  • Я сделал изменения конфигурации наборов символов в моей php.ini
  • Я попробовал его с MySQLi и maysql вместо PDO
  • Я написал «кодировки = utf8mb4» в строке подключения объекта PDO

Но ничего не было полезно ...

Это создать сценарий моего стола, я использую в данный момент:

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; 

Мое соединение PDO выглядит следующим образом:

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(); 
    } 
} 

РНР код с оператора вставки:

$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(); 

Было бы очень хорошо, если бы кто-то может помочь мне из этого тез. Всякая помощь высоко оценивается.

Заранее спасибо.

+0

Возможно, мне не хватает этого, потому что я не слишком хорошо знаком с PDO, но где код, который пытается вставить символ евро? В какой колонке это происходит?Вы предоставили определение таблицы для таблицы «cars», в которой нет ничего, что, казалось бы, предназначено для хранения символа евро, поэтому я думаю, вам нужно предоставить больше кода. – dman2306

+0

Спасибо, что прочитали мой вопрос. Я добавил еще несколько кодов. Надеюсь, это поможет вам. – F4k3d

+0

'\ x80', конечно, не является кодовым кодом Unicode, а не UTF-8. Я предполагаю, что ваш исходный код и с ним ваши строки не UTF-8. Тем не менее, мы используем 'utf8_unicode_ci' без проблем с символами вне диапазона ASCII. –

ответ

0

У меня есть решение, которое я не знаю, если оно совершенное, но, по крайней мере, оно работает нормально!

Я добавил эту строку кода после того, как я открыл подключение к базе данных:

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

После этого запроса я мог вставить то, что когда-нибудь я хочу (например ÄÜÖöäü§ €% $ '# и т.д. ...) и он, наконец, правильно хранится в моей таблице.

Хорошо, спасибо за попытку помочь мне. Надеюсь, это решение поможет кому-то другому, у кого такая же проблема.

Желаю вам счастливого нового года. :-)

Смежные вопросы