Yii ékezetes karakterek mentése

Szevasztok

Elkezdtem egy oldalt készíteni yii-ben megcsináltam a regisztrációt meg a login oldalt, de van egy probléma.

Amikor ékezetes karaktert írok bele a textfield-be akkor hibát kapok és nem menti ez az adatbázisba.

Nyílván Rule-ban lehet szabályozni hogy ne lehessen ékezetest beírni, de én ott pont akarok ékezetest is írni.

Mutatom a hibát:

CDbCommand hibába ütközött az SQL parancs végrehajtása közben: SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xE3\xA1\xE3\xA1\xE3\xA1…’ for column ‘question’ at row 1. The SQL statement executed was: INSERT INTO user (username, password, email, question, answer) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4)

Mysql adatbázis van uf8_general_ci-vel

a fileokat BOM nélkül mentem.

de ezt a hibát szerintem a model->save(); generálja ahol rosszúl menti az adatot.

Valaki találkozott már ilyen problémával,és mi volt a megoldás?

Ilyen hibát nem tapasztaltam eddig Yii-ben. Alapvetően AR mintát használtam és kevésbé hívtam meg a CDbCommand parancsot, de ha igen, akkor sem volt gond. Talán másoljál be valami kódrészletet, mert lehet máshol lesz a hiba. Adatbázis kapcsolat és az érdekelne valamivel részletesebben, hogy segíteni tudjak.

ez van a protected/config/main.php-ben

‘db’=>array(

		'connectionString' => 'mysql:host=localhost;dbname=legjobbfilm',


		'emulatePrepare' => true,


		'username' => 'root',


		'password' => '',


		'charset' => 'utf8',


	),

SiteController-ben meg ez

public function actionRegister()

{


	$model=new User;





	// if it is ajax validation request


	if(isset($_POST['ajax']) && $_POST['ajax']==='register-form')


	{


		echo CActiveForm::validate($model);


		Yii::app()->end();


	}


	// collect user input data


	if(isset($_POST['User']))


	{


		$model->attributes=$_POST['User'];


		// validate user input and redirect to the previous page if valid


		if($model->validate() && $model->save())


			$this->redirect(Yii::app()->user->returnUrl);


	}


	// display the login form


	$this->render('register',array('model'=>$model));


}

User model-t meg gii vel legyártottam.

A form pedig így néz ki

<?php

$this->pageTitle=Yii::app()->name . ’ - Regisztráció’;

$this->breadcrumbs=array(

'Regisztráció',

);

?>

<h1>Regisztráció</h1>

<div class="form">

<?php $form=$this->beginWidget(‘CActiveForm’, array(

'id'=&gt;'register-form',


'enableClientValidation'=&gt;true,


'clientOptions'=&gt;array(


	'validateOnSubmit'=&gt;true,


),

)); ?>

&lt;p class=&quot;note&quot;&gt;A &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; jelzett mezők kitöltése kötelező&#33;.&lt;/p&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'username'); ?&gt;


	&lt;?php echo &#036;form-&gt;textField(&#036;model,'username'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'username'); ?&gt;


&lt;/div&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'password'); ?&gt;


	&lt;?php echo &#036;form-&gt;passwordField(&#036;model,'password'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'password'); ?&gt;


&lt;/div&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'password2'); ?&gt;


	&lt;?php echo &#036;form-&gt;passwordField(&#036;model,'password2'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'password2'); ?&gt;


&lt;/div&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'email'); ?&gt;


	&lt;?php echo &#036;form-&gt;textField(&#036;model,'email'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'email'); ?&gt;


&lt;/div&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'question'); ?&gt;


	&lt;?php echo &#036;form-&gt;textField(&#036;model,'question'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'question'); ?&gt;


&lt;/div&gt;





&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'answer'); ?&gt;


	&lt;?php echo &#036;form-&gt;textField(&#036;model,'answer'); ?&gt;


	&lt;?php echo &#036;form-&gt;error(&#036;model,'answer'); ?&gt;


&lt;/div&gt;





&lt;?php if(extension_loaded('gd')): ?&gt;


&lt;div class=&quot;row&quot;&gt;


	&lt;?php echo &#036;form-&gt;labelEx(&#036;model,'verifyCode'); ?&gt;


    &lt;div&gt;


    &lt;?php &#036;this-&gt;widget('CCaptcha'); ?&gt;


    &lt;?php echo &#036;form-&gt;textField(&#036;model,'verifyCode'); ?&gt;


    &lt;/div&gt;


&lt;/div&gt;


&lt;?php endif; ?&gt;





&lt;div class=&quot;row buttons&quot;&gt;


	&lt;?php echo CHtml::submitButton('Regisztráció'); ?&gt;


&lt;/div&gt;

<?php $this->endWidget(); ?>

</div><!-- form -->

Szerintem ezek a kódok teljesen rendben vannak. A Gii által legyártott model-re gyanakszom. Légyszi azt is írd meg!

Érdemes használnod a kódkiemelést itt a fórumon sokkal jobban olvashatóak így az üzeneteid.


 <?php echo "így érdemes a kódokat beszúrni..." ?> 


class User extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @param string $className active record class name.

	 * @return User the static model class

	 */

	public $password2;

    public $verifyCode;

	public $rememberMe;

	 

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'user';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

				array(array('username','password','password2'), 'match', 'pattern' => '/^[A-Za-z0-9]+$/u', 'message' => Yii::t('default', 'Ékezetes betű nem engedélyezett!')),

				array('username','length','max'=>32),

				// convert username to lower case

                array('username', 'filter', 'filter'=>'strtolower'),

				array('username','length','max'=>10, 'min'=>3),

                array('password','length','max'=>64, 'min'=>6),

                array('password2','length','max'=>64, 'min'=>6),

                // compare password to repeated password

                array('password2', 'compare', 'compareAttribute'=>'password'), 

                array('email','length','max'=>256),

                // make sure email is a valid email

				array('email','email'),

				// make sure username and email are unique

				array('username, email', 'unique'), 

				array('question','length','max'=>256),

				// convert question to lower case

				array('question', 'filter', 'filter'=>'strtolower'),

				array('answer','length','max'=>128),

				// convert answer to lower case

				array('answer', 'filter', 'filter'=>'strtolower'),

				array('username, password, password2, email, question, answer, verifyCode', 'required'),

				// verifyCode needs to be entered correctly

				array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'username' => 'Felhasználónév',

			'password' => 'Jelszó',

			'password2' => 'Jelszó ismét',

			'email' => 'Email',

			'question' => 'Biztonsági kérdés',

			'answer' => 'Válasz',

			'verifyCode' => 'Megerősítő kód',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		//$criteria=new CDbCriteria;


		//$criteria->compare('id',$this->id);

		//$criteria->compare('username',$this->username,true);

		//$criteria->compare('password',$this->password,true);

		//$criteria->compare('email',$this->email,true);

		//$criteria->compare('question',$this->question,true);

		//$criteria->compare('answer',$this->answer,true);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

	public function beforeSave()

	{

		// Check if question has a ? at the end

		$last = $this->question[strlen($this->question)-1]; 

		if($last !== "?")

		{

			$this->question .= '?';

		}

		$pass = md5(md5($this->password).Yii::app()->params["salt"]);

		$this->password = $pass;

		return true;

	}

}

A beforeSave metódus nem a Gii része. :)

Ha UTF-8-ban dolgozol, akkor az mb_**** parancsok használata javallott. Azaz írtál egy ilyen részt:




  ... 

   <?php 

     // strlen($this->question)-1 

     mb_strlen($this->question)-1 // --> 


 ?> 

  ...



A második elgondolkoztató kérdés, hogy az alapértelmezett Rule, hogy boldogul a magyar karakterekkel. Érdemes írnod egy új Rule-t.

<?php array(‘username’, ‘filter’, ‘filter’=>‘strtolower’), // … ?>

A rule-ban a gyári Gii kódhoz képest változtattál. Arra gyanakszom, hogy ott lesz a hiba, bár nem láttam most elsőre. Azt alaposabban nézd át!

Nekem volt hasonló problémám, de nem a Yii oldalon keresendő a hiba.

Db-ben mindent erre állíts át(táblát és kapcsolatot is): utf8_hungarian_ci

Üdv!

Meglett a probléma … A yii-ben minden jó volt csak a szerver programot kellett újra telepítenem.

Gondolom mysql-ben valamikor valamit elállítottam valamiért