首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sql给我错误“无效的参数号:参数没有定义”

为什么sql给我错误“无效的参数号:参数没有定义”
EN

Stack Overflow用户
提问于 2015-08-05 13:32:22
回答 2查看 3.4K关注 0票数 9

今天,我得到了错误无效的参数号:参数没有在我的yii应用程序中定义,同时更新数据。然后,我了解到我的sql数据库表列包含"-“符号i.e " table -post”等名称。

然后我用"_“换了"-”,一切都正常了。

这是查询片段(我将"-“替换为"_")

代码语言:javascript
复制
/* 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);
         }

有人能解释一下为什么这个例子会出现错误吗?在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-05 16:52:27

在您的示例中,表名中的“-”将被视为计算,而不是实际表名的一部分。这背后的原因是,MySQL只能给一个字符/单词一个函数,并且不知道您实际上想在查询中的特定位置使用哪个函数。

在MySQL中,存在着大量的特殊字符或保留字。每次使用其中之一时,必须使用backticks

Backticks用于表和列标识符,但只有在标识符是MySQL保留关键字时,或者当标识符包含的空格字符或字符超出有限集时(见下文),通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题。

根据MySQL文档,您不需要使用以下字符集引用(回勾)标识符:

[0-9,a-z,A-Z$_] (基本拉丁字母,数字0-9,美元,下划线)

您可以使用该集合以外的字符作为表或列标识符,例如,包括空格,但是必须引用(回勾)它们。

在您的情况下使用table-post (backticks!)而不是表柱应该可以工作。

票数 9
EN

Stack Overflow用户

发布于 2015-08-11 05:02:10

基于模式对象名上的mysql文档,只允许以下字符作为非引号标识符。

ASCII:_ 扩展: U+0080 .U+FFFF

- ANSI(45)不允许作为有效的标识符,除非它带有与ANSI_QUOTES兼容的反引号()或双引号(“”)。

引号中允许的字符包括完整的Unicode基本多语言平面(BMP),但U+0000除外: U+0001 .U+007F

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31834053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档