如何从MySQL表条目中删除所有非数字字符

时间:2019-06-12 18:16:11

标签: php mysql

我正在尝试编写一个PHP程序来根据电话号码更新MySQL表条目。在数据库中输入的电话号码没有限制,通常以XXX-XXX-XXXX的格式设置,但有时由于输入错误而包含其他字符。为了确保查询每次都能正常工作,我想从条目中删除所有非数字字符,以便可以将条目与来自单独来源的格式如XXXXXXXXXX的电话号码进行比较。

我已经进行了一些研究,找到了一些解决方案,但是不确定如何将它们合并到PHP脚本中。我对MySQL还是相当陌生,大多数解决方案都提供了用户定义的MySQL函数,而且我不知道如何将它们放入PHP脚本并将其与我已有的查询一起使用。

这是我找到的解决方案之一:

private func updateScoreLabel() {
    scoreLabel.text = String(score)

这是我需要以下解决方案的查询:

CREATE FUNCTION [dbo].[CleanPhoneNumber] (@Temp VARCHAR(1000))
RETURNS VARCHAR(1000) AS BEGIN

DECLARE @KeepValues AS VARCHAR(50)
SET @KeepValues = '%[^0-9]%'
WHILE PATINDEX(@KeepValues, @Temp) > 0
    SET @Temp = STUFF(@Temp, PATINDEX(@KeepValues, @Temp), 1, '')

RETURN @Temp
END

查询应返回单个患者的pid列中的数据,因此,如果电话号码为1234567890并且pid为15,则应返回15。我目前没有任何输出。

1 个答案:

答案 0 :(得分:0)

示例函数定义是Transact-SQL(即用于Microsoft SQL Server),它不是有效的MySQL语法。

像这样的函数不会“进入” PHP代码。该函数作为一个单独的步骤在MySQL数据库上创建,类似于创建表。 PHP代码可以调用(引用)已定义的函数,就像引用诸如DATE_FORMATSUBSTR之类的内置函数一样。

SELECT语句遵循易受SQL注入攻击的SQL模式。合并到SQL文本中的任何潜在不安全值都必须正确转义。更好的模式是使用带有绑定占位符的预准备语句。

作为MySQL函数的示例:

 DELIMITER $$

 CREATE FUNCTION clean_phone_number(as_phone_string VARCHAR(1024))
 RETURNS VARCHAR(1024)
 DETERMINISTIC
 BEGIN
    DECLARE c         CHAR(1)       DEFAULT NULL;
    DECLARE i         INT DEFAULT   0;
    DECLARE n         INT DEFAULT   0;
    DECLARE ls_digits VARCHAR(20)   DEFAULT '0,1,2,3,4,5,6,7,8,9';
    DECLARE ls_retval VARCHAR(1024) DEFAULT '';
    IF ( as_phone_string IS NULL OR as_phone_string = '' ) THEN
       RETURN as_phone_string;
    END IF;
    SET n := CHAR_LENGTH(as_phone_string);
    WHILE ( i < n ) DO
       SET i := i + 1;
       SET c := SUBSTR(as_phone_string,i,1);
       IF ( FIND_IN_SET(c,ls_digits) ) THEN
          SET ls_retval := CONCAT(ls_retval,c);
       END IF;
    END WHILE;
    RETURN ls_retval;
 END$$

 DELIMITER ;

我们可以在具有足够特权的用户身份连接的mysql命令行客户端中执行这些语句,以创建函数。

这不一定是编写函数的最佳方法,但是它确实是一个演示。

一旦创建了函数,我们就可以引用它的一条SQL语句,例如:

 SELECT t.foo
      , clean_phone_number(t.foo)
   FROM ( SELECT '1' AS foo
          UNION ALL SELECT '1-888-TAXICAB'
          UNION ALL SELECT '888-555-1212'
          UNION ALL SELECT '+=_-()*&^%$#@"''<>?/;:"abc...xyz'
          UNION ALL SELECT ''
          UNION ALL SELECT NULL
        ) t