2011-11-28 26 views
11

Bugün PHP, MySql ve Zend Framework tabanlı bir uygulama geliştirirken bir hatayla karşılaştım. Ayrıca, AES algorithm kullanarak verileri şifrelemek için phpseclib kullanıyorum ve sorun geldi. AES algoritmasının çıktısı, MySql'nin beğenmediği bir formdadır. Veriyi veritabanına eklemeye çalıştığımda Infact bir Sql İstisnası aldı. hatadır:Mysql: Genel hata: 1366 Yanlış dize değeri

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE4\xD5\xABtZM...' for column 'Name' 

Zaten Stackoverflow yayınlanan tüm cevapları okudum ve aynı zamanda sorunu Google'da ancak tüm çözüm önerisi benim kodunda zaten. Veritabanı, tablolar ve tüm cols Collation utf8_general_ci var. Eğer ilgili kodun görebilirsiniz:

  1. Application.ini ben denemek görmek için veritabanı bağlantısı
  2. Model.php almak nasıl olduğunu görmek için bağlantıyı
  3. DatabaseFunctions.php nasıl ayarlandığını görmek için Ben
  4. Tablo tanım verileri şifrelemek için AES sınıfını nasıl kullandıklarını görmek için veritabanında
  5. şifrelemek() verilerini eklemek için
(bütün utf8 olduklarını biliyorsanız yeterli değildir) 0

application.ini

resources.db.adapter = "Pdo_Mysql" 
resources.db.params.charset = "utf8" 
resources.db.params.host = "localhost" 
resources.db.params.username = "********" 
resources.db.params.password = "********" 
resources.db.params.dbname = "dbname" 

DatabaseFunctions.php

public static function getDb() 
{ 
    if (self::$Db === NULL) 
     self::$Db = Zend_Db_Table::getDefaultAdapter(); 
    return self::$Db; 
} 

model.php

$Values = array(
    'Id' => $this->Id, 
    'Name' => $this->Name, 
    'CreationDate' => $this->CreationDate, 
); 
$RowChanged = $Db->insert('TABLENAME', $Values); 

şifrelemek()

public static function encrypt($Data, $EncryptionKey) 
{ 
    $AES = new Crypt_AES(); 
    $AES->setKey($EncryptionKey); 
    return $AES->encrypt($Data); 
} 

tablo

CREATE TABLE IF NOT EXISTS `table` (
    `Id` mediumint(8) unsigned NOT NULL, 
    `Name` varchar(200) DEFAULT NULL, 
    `CreationDate` date NOT NULL, 
    PRIMARY KEY (`Id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Soru: Sorunu çözmek ve veritabanına veri depolamak nasıl?

+0

ilgili soru http://stackoverflow.com/questions/7461962/mysql-how-to-store-aes-encrypted-data – hafichuk

cevap

9

Ben AES ikili bir dizi dönmek gibi görünüyor gibi sizin varchar(200) bir varbinary(200) (veya daha büyük) değiştirmek gerekebilir gibi ancak görünüyor bu MySQL için AES_ENCRYPT için reference olduğunun farkında.

MySQL sitesinde daha az net explanation var.

Many encryption and compression functions return strings for which the result might contain arbitrary byte values. If you want to store these results, use a column with a VARBINARY or BLOB binary string data type. This will avoid potential problems with trailing space removal or character set conversion that would change data values, such as may occur if you use a nonbinary string data type (CHAR, VARCHAR, TEXT).

+0

1 - Mutlaka doğru yolda beni koy. Daha sonra şifreli/şifre çözme işlemini deneyeceğim. Tamamsa, doğru cevabı kontrol edeceğim. Şu anda ... çok teşekkür ederim! –

+0

np, bunu gönderiyorum - kendim yeni bir şey öğrendim. – hafichuk

+0

Harika çalışıyor. Çok tekrar teşekkür ederim! –