about 3 years ago
CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 2031 No data supplied for parameters in prepared statement. The SQL statement executed was: INSERT INTO `products` (`name`, `image`, `price`, `description`, `category_id`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4). Bound with :yp0='HTC One X', :yp1=NULL, :yp2=21000, :yp3=NULL, :yp4=2

用Yii的ActiveRecord select or insert into 的時候遇到這樣的問題

這是PDO噴出來的錯,就直接用createCommand 來select 或 insert into也會遇到同樣問題

大至上有兩種問題 佔位符號(:yp1)NULL

1.:yp0:yp1,像這種佔位符號,不可以重複出現例如

select * FROM products WHERE name LIKE :keyword OR description LIKE :keyword

在PHP5.5.x以上的版本,如果這樣寫,就會噴錯...,因此若改為這樣:

select * FROM products WHERE name LIKE :nameKeyword OR description LIKE :descKeyword

就正常了,這是PHP PDO的問題,這就要追一下PHP何時改成這樣較嚴謹的寫法

2.塞NULL值一定要用new CDbExpression('NULL'),不然也會噴2031的錯誤

protected/models/Product.php
array('image, description', 'default', 'value' => new CDbExpression('NULL'))
← mysql-撈某時間區中的固定月份 關於httponly →