问题描述
|
我正在为基于Web的应用程序编写一些MysqL过程,而令我印象深刻的是根本没有参数的类型检查。
例如,如果我有以下内容:
CREATE PROCEDURE foo(n CHAR(4))
我可以随心所欲地调用它,它将接受它并且只接受前四个字符。但是,如果我想做这样的事情:
use base;
DELIMITER $$
DROP PROCEDURE IF EXISTS open $$
CREATE PROCEDURE open(n INT)
BEGIN
SELECT * FROM prod_charts LIMIT n;
END $$
DELIMITER ;
当使用非整数参数调用时,它将崩溃。并且没有反馈:当从PHP调用时,我什么也没得到,当我在PHPMyAdmin中尝试它时,我将被发送回首页。
所以我的问题是:如何使它更安全?有没有办法在这些过程中检查变量的类型?
解决方法
不幸的是,我不知道直接在mySQL中执行此操作的方法。在其他RDMS中(例如MS SQL),可以使用诸如isNumeric()之类的函数。
在mySQL中创建以下函数,并使用它检查传入的值是否为数字。
CREATE FUNCTION ISNUMERIC(myVal VARCHAR(1024))
RETURNS TINYINT(1) DETERMINISTIC
RETURN myVal REGEXP \'^(-|\\\\+)?([0-9]+\\\\.[0-9]*|[0-9]*\\\\.[0-9]+|[0-9]+)$\';
那应该涵盖大多数(如果不是全部)可能性。