mysql - PDOStatement::execute(): SQLSTATE[42S22]: 未找到列: 'field list' 中的 1054 未知列

标签 mysql stored-procedures prepared-statement

5.6.17 - MySQL 社区服务器(GPL)

在mysql中生成了一个简单的rountine(存储过程)来更新一个表,它作为一个变量传入。

我有一个丑陋的修复方法,但我想了解为什么前两种技术不起作用?

存储过程无法识别我传入的表名

DROP PROCEDURE IF EXISTS `setNewCategoryUrlTag`//

CREATE PROCEDURE `setNewCategoryUrlTag`(
    IN _id INT,
    IN _urlid VARCHAR(150),
    IN _tablename VARCHAR(100)
)
BEGIN
    UPDATE _tablename SET urlid=_urlid WHERE ID=_id;
END//

错误是:

PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '_tablename' doesn't exist in

所以我使用了产生第二个错误的 concat 函数。

DROP PROCEDURE IF EXISTS `setNewCategoryUrlTag`//

CREATE PROCEDURE `setNewCategoryUrlTag`(
    IN _id INT,
    IN _urlid VARCHAR(150),
    IN _tablename VARCHAR(100)
)
BEGIN
    set @query = CONCAT('UPDATE ',_tablename,' SET urlid=',_urlid,' WHERE ID=',_id,';');
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END//

错误是:

PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Unknown 'home' column in 'field list' in

home 是变量 _urlid 的实际值

丑陋的修复是添加 if else 语句围绕特定表名的更新。 :(

感谢任何可以向我解释为什么我的存储过程中会出现此错误的人。我以前使用过类似的技术,但这从未发生过。

附加信息

public function dataInsert($category){
    $procedure = "Call setNewCategoryUrlTag(?,?,?)";
    $statement -> bindParam(1, $category['id']);
    $statement -> bindParam(2, $category['urlid']);
    $statement -> bindParam(3, $category['tableName']);
    $statement -> execute();
    echo $category['id']."\t".$category['urlid']."\t".$category['tableName'];
}

德鲁的建议?!?!?! (不确定,因为他的解释不清楚)

DROP PROCEDURE IF EXISTS `setNewCategoryUrlTag`//
CREATE PROCEDURE `setNewCategoryUrlTag`(
    IN _id INT,
    IN _urlid VARCHAR(150),
    IN _tablename VARCHAR(100)
)
BEGIN
    set @t = _tablename;
    set @var1 = _urlid;
    set @var2 = _id;
    set @query = CONCAT('UPDATE ',@t,' SET urlid=',@var1,' WHERE ID=',@var2,';');
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END//

无论如何,这会产生与我的副本相同的错误。

最佳答案

这个:

set @query = CONCAT('UPDATE ',_tablename,' SET urlid=',_urlid,' WHERE ID=',_id,';');

会将其生成为查询组件:

CONCAT('UPDATE foo SET urlid=home WHERE ID=42);
                             ^^^^

因为 home 没有被引用,它被解释为一个字段名,它显然不存在于你的表中 - 所以你会得到一个“没有这样的字段”的错误。

你需要:

set @query = CONCAT('UPDATE ',_tablename,' SET urlid=\'',_urlid,'\' WHERE ID=',_id,';');
                                                     ^^---------^^

关于mysql - PDOStatement::execute(): SQLSTATE[42S22]: 未找到列: 'field list' 中的 1054 未知列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762930/

相关文章:

php - 获取一个字符串数组并将其用作列名

mysql - 使用 count(*) 和 inner join 时查询速度慢

java - 使用dblink和Java调用存储过程

mysql准备语句我应该使用哪个语句

php - Mysqli "Prepare statement"没有创建对象

php - 从mysql获取数据期间Asynctask出错

mysql - 如何实现 Django 用户被其他用户引用的关系?

mysql - 获取按周和按月每天的平均小时数

sql-server - 如何删除 Sql Server 2005 中存在的临时 SP

php - 如果 SQL IN 语句中的 Select 返回 NULL,则选择 ALL