【问题标题】:why sql give me error "Invalid parameter number: parameter was not defined"为什么sql给我错误“无效的参数号:未定义参数”
【发布时间】:2015-10-28 07:41:18
【问题描述】:

今天我收到错误 Invalid parameter number: parameter was not defined in my yii app while updates data 。然后我知道我的 sql 数据库表列包含带有“-”符号的名称,即“table-post”等。

然后我将“-”更改为“_”,一切正常。

这是查询 sn-p(我将“-”替换为“_”)

/* 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);
         }

有人能解释为什么这个例子显示错误吗?非常感谢。

【问题讨论】:

  • 您能否提供一个失败的查询示例?
  • 还为您正在使用的 DBMS 添加标签(Postgres、Oracle、...)

标签: php mysql sql yii


【解决方案1】:

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

在 MySQL 中存在很多这样的特殊字符或保留字。每次使用其中之一时,都必须使用 反引号

反引号用于表和列标识符,但仅在标识符为 MySQL reserved keyword 或标识符包含空白字符或超出有限集合的字符时才需要(见下文) 通常建议避免尽可能使用保留关键字作为列或表标识符,避免引用问题。

According to MySQL documentation,您不需要使用以下字符集引用(反引号)标识符:

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

您可以使用超出该设置的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们。

在您的情况下,使用 `table-post`(反引号!)而不是 table-post 应该可以工作

【讨论】:

  • 注意:如果 MySQL sql_mode 包含 ANSI_QUOTES,则标识符可以用双引号而不是反引号括起来。
  • 这个答案值得赏金。
【解决方案2】:

基于Schema Object Names上的mysql文档 只允许以下字符作为不带引号的标识符。

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

扩展:U+0080 .. U+FFFF

- ANSI(45) 不允许作为有效标识符,除非它用反引号 (``) 或双引号 ("") 引用,这些 ANSI SQL 与 ANSI_QUOTES 兼容

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

ASCII:U+0001 .. U+007F

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2022-08-05
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多