我正在尝试编写一个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。我目前没有任何输出。
答案 0 :(得分:0)
示例函数定义是Transact-SQL(即用于Microsoft SQL Server),它不是有效的MySQL语法。
像这样的函数不会“进入” PHP代码。该函数作为一个单独的步骤在MySQL数据库上创建,类似于创建表。 PHP代码可以调用(引用)已定义的函数,就像引用诸如DATE_FORMAT
或SUBSTR
之类的内置函数一样。
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