为什么sql给我错误“参数号无效:参数未定义”

时间:2015-08-05 13:32:23

标签: php mysql sql yii

今天我收到错误参数号无效:更新数据时我的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);
         }

有人可以解释为什么这个例子显示错误?非常感谢提前。

2 个答案:

答案 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