PHP版本:PHP5.4.16
ThinkPHP版本:3.2.3
直接上代码:
$data:Array([area]=>aa[brand]=>bb[color]=>cc[type]=>通勤车[alerted_police]=>0[status]=>0[lost_time]=>[info]=>dd[email]=>email@email.com[update_time]=>[timestamp]=>1[img_info_id]=>201610081621501801716297)
$sql=$ReportLost->fetchSql(true)->add($data);
INSERTINTO`report_lost`(`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`)VALUES('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL)
接下来执行$result=$ReportLost->add($data);
就会报错:
ERR:SQLSTATE[HY093]:Invalidparameternumber:numberofboundvariablesdoesnotmatchnumberoftokens
然而在mysql中直接执行$sql
中的
mysql>INSERTINTO`report_lost`(`area`,`brand`,`color`,`type`,`alerted_police`,`status`,`lost_time`,`info`,`email`,`update_time`)VALUES('aa','bb','cc','通勤车','0','0',NULL,'dd','email@email.com',NULL);QueryOK,1rowaffected(0.02sec)
是可以插入的。
数据表结构
--表的结构`report_lost`--CREATETABLEIFNOTEXISTS`report_lost`(`id`int(11)NOTNULL,`title`varchar(80)CHARACTERSETutf8mb4DEFAULTNULL,`keyword`varchar(100)CHARACTERSETutf8mb4DEFAULTNULL,`area`varchar(50)CHARACTERSETutf8mb4DEFAULTNULL,`brand`varchar(20)CHARACTERSETutf8mb4DEFAULTNULL,`sub_brand`varchar(20)CHARACTERSETutf8mb4DEFAULTNULL,`color`varchar(20)CHARACTERSETutf8mb4NOTNULL,`type`varchar(20)CHARACTERSETutf8mb4NOTNULL,`alerted_police`int(4)NOTNULLDEFAULT'0',`status`int(4)NOTNULLDEFAULT'0',`info`textCHARACTERSETutf8mb4,`image`textCHARACTERSETutf8mb4,`user`varchar(50)CHARACTERSETutf8mb4DEFAULTNULL,`email`varchar(50)CHARACTERSETutf8mb4NOTNULL,`contact`varchar(50)CHARACTERSETutf8mb4DEFAULTNULL,`descrpition`textCHARACTERSETutf8mb4,`uuid`varchar(36)CHARACTERSETutf8mb4DEFAULT'00000000-0000-0000-0000-000000000000',`lost_time`timestampNULLDEFAULTNULL,`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`update_time`timestampNULLDEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;
表中的字段的确比$data中的要多,但是在$data中未定义的都可以NULL。
这是thinkphp的限制吗?或是php的限制?有什么解决办法,我需要在$data中把所有mysql需要的字段都先定义了吗?
这个问题很奇怪,可否告知MySQL的版本,或者存在其他隐藏问题?
提供更详细的runtime/下的日志报告?
TP3.2版本的模型save()
方法已经支持自动过滤字段了,所以不应该是TP的限制,你也无需在保存前定义全部的字段。至少我在项目中直接使用save()方法无异常的。