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/