【问题标题】:MYSQL - stored procedure and prepared statements handling quotesMYSQL - 处理引号的存储过程和准备好的语句
【发布时间】:2013-04-21 11:39:40
【问题描述】:

从 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;

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

谁能建议我解决这个问题?

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

【问题讨论】:

    标签: mysql stored-procedures prepared-statement


    【解决方案1】:

    好的,我在 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。

    【讨论】:

    • 感谢您的帮助。这对我有帮助。抱歉,这个回复晚了
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。收到此错误错误:4/25/2013 9:28:46 AM 0:00:00.062:查找错误 - MySQL 数据库错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'test_table'')' 附近使用正确的语法 1: call test_my_add_comment('test_table','This is a test')
    • 你能复制你使用的确切查询吗?所以我可以寻找“test_table”
    • 感谢您的回复,这里是调用 test_my_add_comment('This is a test','test_table')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多