我将一个变量传递给执行查询的函数
MySQL连接只发生在函数内部,并在函数内部关闭
我希望能够在将字符串发送到函数之前安全地转义字符串
我不能使用mysql_real_escape_string,因为它需要一个MySQL连接(只在函数内部进行)
我知道简单的答案是在函数内部转义字符串,但我不能这样做,因为我需要发送一些转义字符串,以及字符串的一些非转义部分
例如,我需要运行这样的函数:
myquery("'" . escape_me("My string") . "'");
Run Code Online (Sandbox Code Playgroud)
请注意我发送两个撇号 - 未转义,内部有一个转义字符串.出于这个原因,我无法对myquery函数内的参数进行全面的mysql_real_escape_string.
我找到了以下代码,建议我可以使用它作为mysql_real_escape_string的替代方法:
// escape characters
function escape_me($value) {
$return = '';
for($i = 0; $i < strlen($value); ++$i) {
$char = $value[$i];
$ord = ord($char);
if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
$return .= $char;
else
$return .= '\\x' . dechex($ord);
}
return $return;
}
Run Code Online (Sandbox Code Playgroud)
我不知道这个函数是否对多字节攻击是安全的,但我想我每次查询时都需要撤消该函数
例如,输入:测试3的"确定"变为数据库中的测试3x27s x22OKx22
所以我的主要问题是:你知道是否还有另一个函数可以作为mysql_real_escape_string的替代品来安全地转义字符?
你可以使用这样的替换
myquery("SELECT * FROM table WHERE id = %s","My string");
你可以使用另一种替代方式,一种现代方式:准备好的陈述.它将在许多其他答案中描述.
正如没人发布的那样,这是一个粗略的例子
function fetchAll(){
$args = func_get_args();
$query = array_shift($args);
$stmt = $pdo->prepare($query);
$stmt->execute($args);
return $stmt->fetchAll();
}
$a=$db->fetchAll("SELECT * FROM users WHERE status=? LIMIT ?,?",$status,$start,$num);
Run Code Online (Sandbox Code Playgroud)