MYSQL-处理引号的存储过程和准备好的语句

MYSQL-处理引号的存储过程和准备好的语句,mysql,stored-procedures,prepared-statement,Mysql,Stored Procedures,Prepared Statement,在PHP中,我使用prepared语句(通过绑定参数)并将数据发送到以下存储过程 CREATE PROCEDURE test_my_add_comment(in var_details text, in var_table_name varchar(50)) BEGIN SET @s = CONCAT('INSERT INTO ',var_table_name,'(details) VALUES("',var_details,'")'); PREPARE stmt FRO

在PHP中,我使用prepared语句(通过绑定参数)并将数据发送到以下存储过程

CREATE PROCEDURE test_my_add_comment(in var_details text, in var_table_name varchar(50))
BEGIN    
    SET @s = CONCAT('INSERT INTO ',var_table_name,'(details) VALUES("',var_details,'")');
    PREPARE stmt FROM @s;
    EXECUTE stmt;
   COMMIT;
END;
我的桌子

CREATE TABLE `test_table` (
  `details` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果文本不包含任何引号,则插入记录,但如果文本包含引号,则抛出任何错误

有人能给我一个解决这个问题的建议吗


我的假设是,语句应该处理这种情况。

错误在过程中。下面是如何避免引用。我在这里使用单引号。我还引用了表/列名

SET @s = CONCAT('INSERT INTO `',var_table_name,'` (`details`) VALUES(\'', QUOTE(var_details), '\')');

程序中有错误。下面是如何避免引用。我在这里使用单引号。我还引用了表/列名

SET @s = CONCAT('INSERT INTO `',var_table_name,'` (`details`) VALUES(\'', QUOTE(var_details), '\')');

好的,我在MariaDB 10上测试了它,它可以工作:

DROP PROCEDURE IF EXISTS `test_my_add_comment`;
CREATE PROCEDURE `test_my_add_comment`(IN `var_details` TEXT, IN `var_table_name` VARCHAR(64))
    MODIFIES SQL DATA
BEGIN    
    SET @`add_comment` = CONCAT('INSERT INTO ', `var_table_name`, ' (`details`) VALUES (', QUOTE(`var_details`), ');');
    PREPARE `stmt_add_comment` FROM @`add_comment`;
    EXECUTE `stmt_add_comment`;
    DEALLOCATE PREPARE `stmt_add_comment`;
    SET @`add_comment` = NULL;
END;

CALL `test_my_add_comment`('This is a test','test_table');

我添加了很多
反勾号
,因为如果使用保留字,它们可以帮助您获得更好的错误消息。我对准备好的语句使用了正确的语法,并释放了@add_注释。另外,最好对准备好的语句使用特定的名称,因为如果在更多地方使用相同的名称,可能会出现问题。我将第二个参数改为VARCHAR(64),因为它是真正的表名maxlength。

好的,我在MariaDB 10上测试了这个参数,它可以工作:

DROP PROCEDURE IF EXISTS `test_my_add_comment`;
CREATE PROCEDURE `test_my_add_comment`(IN `var_details` TEXT, IN `var_table_name` VARCHAR(64))
    MODIFIES SQL DATA
BEGIN    
    SET @`add_comment` = CONCAT('INSERT INTO ', `var_table_name`, ' (`details`) VALUES (', QUOTE(`var_details`), ');');
    PREPARE `stmt_add_comment` FROM @`add_comment`;
    EXECUTE `stmt_add_comment`;
    DEALLOCATE PREPARE `stmt_add_comment`;
    SET @`add_comment` = NULL;
END;

CALL `test_my_add_comment`('This is a test','test_table');

我添加了很多
反勾号
,因为如果使用保留字,它们可以帮助您获得更好的错误消息。我对准备好的语句使用了正确的语法,并释放了@add_注释。另外,最好对准备好的语句使用特定的名称,因为如果在更多地方使用相同的名称,可能会出现问题。我将第二个参数改为VARCHAR(64),因为它是真正的表名maxlength。

谢谢您的回复。获取此错误错误:4/25/2013 9:28:46 AM 0:00:00.062:查找错误-MySQL数据库错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解第1行“test_table”(测试表)附近使用的正确语法:call test_my_add_comment('test_table','This is a test')能否复制您使用的准确查询?所以我可以查找“test_table”,谢谢您的回复,这里是call test_my_add_comment(‘这是一个测试’,‘test_table’),谢谢您的回复。获取此错误错误:4/25/2013 9:28:46 AM 0:00:00.062:查找错误-MySQL数据库错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解第1行“test_table”(测试表)附近使用的正确语法:call test_my_add_comment('test_table','This is a test')能否复制您使用的准确查询?因此,我可以查找“测试表”,谢谢您的回复,这里是“调用测试表我的添加注释”(“这是一个测试”,“测试表”),谢谢您的帮助。这对我有帮助。很抱歉,这封信的回复太晚了。谢谢你的帮助。这对我有帮助。很抱歉,这个问题的回复太晚了