今天我收到错误参数号无效:更新数据时我的yii应用中没有定义参数。然后我才知道我的sql数据库表列包含带“ - ”符号的名称,即“table-post”等。
然后我用“_”改变了“ - ”,一切正常。
这是查询片段(我将“ - ”替换为“_”)
/* 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);
}
有人可以解释为什么这个例子显示错误?非常感谢提前。
答案 0 :(得分:9)
在您的情况下,' - '在您的表名称中将被视为计算而不是实际表名称的一部分。这背后的原因是MySQL只能为一个字符/单词赋予一个函数,并且不知道您实际想要在查询中的特定位置使用哪一个函数。
在MySQL中,存在很多特殊字符或保留字。每次使用其中一个时,都必须使用反引号。
反引号用于表和列标识符,但仅在标识符为MySQL reserved keyword时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议使用尽可能避免使用保留关键字作为列或表标识符,避免引用问题。
According to MySQL documentation,您不需要使用以下字符集引用(反引号)标识符:
ASCII:
[0-9,a-z,A-Z$_]
(基本拉丁字母,数字0-9,美元,下划线)
您可以使用超出该组的字符作为表或列标识符,例如包括空格,但是必须引用(反引号)它们。
在你的情况下使用`table-post`(反引号!)而不是table-post应该可以工作
答案 1 :(得分:4)
基于Schema Object Names上的mysql文档 只允许以下字符作为非引用标识符。
ASCII:[0-9,a-z,A-Z $ _](基本拉丁字母,数字0-9,美元,下划线)
扩展:U + 0080 .. U + FFFF
-
ANSI(45)不允许作为有效标识符,除非使用反引号(``)或双引号(“”)引用,它们与ANSI ANSI_QUOTES
兼容}
带引号的标识符中的允许字符包括完整的Unicode基本多语言平面(BMP),但U + 0000除外:
ASCII:U + 0001 .. U + 007F