PDA

View Full Version : این کوئری چرا کار نمیکنه (حل شد)



engmmrj
چهارشنبه 19 آذر 1393, 20:36 عصر
کوئری زیر را وقتی اجرا میکنم اررو میده !

Yii::app()->db->createCommand("INSERT INTO {{product_like}}(`product_id`, `like`) VALUES('{$id}','1') ON DUPLICATE KEY UPDATE `like` = like+1")->queryAll();

$this->createTable('{{product_like}}', array(
'product_id' => 'int(11) UNIQUE',
'like' => 'int(11) UNSIGNED',
'PRIMARY KEY(`product_id`)'
));

$this->addForeignKey('fk_product_like', '{{product_like}}', 'product_id', '{{product}}', 'id', 'CASCADE', 'CASCADE');

MMSHFE
چهارشنبه 19 آذر 1393, 21:06 عصر
توی migration اسم جدول رو کامل بنویسید.

engmmrj
چهارشنبه 19 آذر 1393, 21:29 عصر
توی migration اسم جدول رو کامل بنویسید.
جدول ایجاد شده ، میخوام با یک خط کد لایک اضافه کنم.
کد کامل :

public function actionLike($id)
{

if(!Product::model()->exists('id=:id', array(':id' => $id)))
{
throw new CHttpException(404, 'Not found page!');
Yii::app()->end();
}

$request = Yii::app()->request;
$like = array();

if(!isset($request->cookies['like']))
$request->cookies['like'] = new CHttpCookie('like', serialize(array()), array('expire' => time()*356));

$like = unserialize($request->cookies['like']);
if(is_array($like) && !in_array($id, array_keys($like))){
$like[$id] = true;
Yii::app()->db->createCommand("INSERT INTO {{product_like}}(`product_id`, `like`) VALUES('{$id}','1') ON DUPLICATE KEY UPDATE `like` = like+1")->queryAll();
}

Yii::app()->request->cookies['like'] = $like;
}

engmmrj
چهارشنبه 19 آذر 1393, 21:31 عصر
خطای CDbCommand در اجرای SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'like+1' at line 1. The SQL statement executed was: INSERT INTO tbl_product_like(`product_id`, `like`) VALUES('1','1') ON DUPLICATE KEY UPDATE `like` = like+1

rezaonline.net
چهارشنبه 19 آذر 1393, 21:31 عصر
به جای متد queryAll از متد execute استفاده کنید .
همچنین متد insert خیلی تمیزتر میتونه کمکتون کنه .

engmmrj
چهارشنبه 19 آذر 1393, 21:33 عصر
به جای متد queryAll از متد execute استفاده کنید .
همچنین متد insert خیلی تمیزتر میتونه کمکتون کنه .
با متد insert نمیشه اون کوئری رو پیاده کرد.

Veteran
چهارشنبه 19 آذر 1393, 22:07 عصر
کار نشد نداره شبکه منوتو رو دیدی تا حالا :متفکر: حتما ببین :لبخند:
من اگه بودم این کارو نمیکردم! اصلا معنی نمیده "میخوام با یک خط کد لایک اضافه کنم."
مگه به تعداد خط هاس ؟
اگه نمیخوای با AR کار بکنی،یک Store Procedure شیک بنویسو اینجا صدا بزن و الکی با کد های SQL بهم نریز کار رو.

MMSHFE
پنج شنبه 20 آذر 1393, 09:16 صبح
like رو توی Backquote بگذارین (با دستور LIKE داره اشتباه میگیره). ضمناً فیلد product_id رو هم Unique کنید تا ON DUPLICATE KEY کار کنه. بجای queryAll هم همونطور که گفتن از execute استفاده کنید.

engmmrj
پنج شنبه 20 آذر 1393, 09:37 صبح
like رو توی Backquote بگذارین (با دستور LIKE داره اشتباه میگیره). ضمناً فیلد product_id رو هم Unique کنید تا ON DUPLICATE KEY کار کنه. بجای queryAll هم همونطور که گفتن از execute استفاده کنید.
با execute نشوتم کار کرد !

Yii::app()->db->createCommand("INSERT INTO {{product_like}}(`product_id`, `like`) VALUES('{$id}','1') ON DUPLICATE KEY UPDATE `like` = `like`+1")->execute();

engmmrj
پنج شنبه 20 آذر 1393, 09:55 صبح
الان یک مشکل دیگه هم پیش اومد ، yii تاریخ expire کوکی هارو با session میازره یعنی مرورگر رو میبندی از بین میره.با فایرباگ نگاه میکنی زده expire = session

$request = Yii::app()->request;
$like = array();

if(!isset($request->cookies['like'])) {
$request->cookies['like'] = new CHttpCookie('like', serialize(array()), array('expire' => time()*356*356));

MMSHFE
پنج شنبه 20 آذر 1393, 10:01 صبح
مشکل از Yii نیست. شما میخوایی کوکی چقدر معتبر باشه؟ باید همون تعداد ثانیه رو با ()time جمع کنید. اینکه دارین ضرب میکنید باعث تولید timestamp غیرمعتبر میشه و درنتیجه مثل وقتی که عمر تعیین نکنید، درنظر میگیره.