今天我得到了错误无效的参数号:参数没有在我的yii应用程序中定义,而更新数据。然后我知道,我的SQL数据库表列包含名称与"-"符号即"表后"等。
然后我把"-"改成了"_",一切都正常了。
这是查询代码片段(我用"_"替换了"-")
/* percentage losses senser*/
$attributes['totlcommloss_sensor'] = $_POST['totlcommloss_sensor'];
$attributes['asp_hour_sensor']= $_POST['asp-hour_sensor'];
$attributes['asp_daily_sensor'] = $_POST['asp-daily_sensor'];
$attributes['asp_weekly_sensor']= $_POST['asp-weekly_sensor'];
$attributes['asp_monthly_sensor'] = $_POST['asp-monthly_sensor'];
$attributes['asp_5_day_senser']= $_POST['asp_5_day_senser'];
/* cost losses */
//$attributes['costlosshourly'] = $_POST['acs-hourly'];
if (0 != intval($user['id'])) {
$command->update('alarm_settings', $attributes, 'id=:id', array(':id' => intval($user['id'])));
}
else {
$NumberOfRowsEffected = $command->insert('alarm_settings', $attributes);
}
谁能解释一下为什么这个例子显示错误?
在您的示例中,表名中的'-'将被视为计算结果,而不是实际表名的一部分。这背后的原因是MySQL只能给一个字符/单词一个函数,并且不知道你在查询的特定位置实际想要使用哪个函数。
在MySQL中有很多这些特殊字符或保留字存在。每次使用其中一个时,必须使用反引号。
反引号用于表和列标识符,但只有当标识符是MySQL保留关键字时才需要,或者当标识符包含空白字符或超出限定集的字符时(见下文)。通常建议尽可能避免使用保留关键字作为列或表标识符,避免引号问题。
根据MySQL文档,您不需要使用以下字符集引用(反打号)标识符:
ASCII:
[0-9,a-z,A-Z$_]
(基本拉丁字母,数字0-9,美元,下划线)
可以使用该字符集以外的字符作为表或列标识符,例如包括空格,但是必须对它们加引号(反打号)。
在您的情况下使用' table-post '(反引号!)而不是table-post应该工作
基于mysql文档中Schema Object Names只允许以下字符作为不加引号的标识符。
ASCII: [0-9,a-z, a-z $_](基本拉丁字母,数字0-9,美元,下划线)
扩展:U+0080 ..U +飞行符
-
ANSI(45)不被允许作为一个有效的标识符,除非它被反引号(' ')或双引号(")所引用,这是与ANSI_QUOTES
兼容的ANSI SQL
带引号的标识符中允许的字符包括完整的Unicode基本多语言平面(BMP),除了U+0000:
ASCII: U+0001 ..U + 007 f