0

从 PHP 我使用准备好的语句(通过绑定参数)并将数据发送到以下存储过程

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;

如果文本不包含任何引号,则插入记录,但如果文本包含引号,则会引发任何错误。

有人可以建议我解决这个问题吗?

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

4

2 回答 2

4

好的,我在 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');

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

于 2013-04-27T13:09:29.440 回答
1

错误在程序中。以下是如何转义引号。我在这里使用单引号。我还引用了表/列名。

SET @s = CONCAT('INSERT INTO `',var_table_name,'` (`details`) VALUES(\'', QUOTE(var_details), '\')');
于 2013-04-25T09:53:08.943 回答