php版的escape函数

本文分享了一组用于处理IE浏览器javascript函数escape编码数据的PHP版本函数:escape和unescape。这些函数能够解决PHP内置URL编码函数无法处理的问题。

php提供的URL编码函数是基于字节的,对由ie的javascript函数escape编码的数据就无能为力了。
因此在此共享本人的php版的escape/unescape函数

function escape($str) {
  preg_match_all("/[/x80-/xff].|[/x01-/x7f]+/",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)
      $ar[$k] = rawurlencode($v);
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
  }
  return join("",$ar);
}

function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|.+/",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
    if(substr($v,0,2) == "%u" && strlen($v) == 6)
      $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));
  }
  return join("",$ar);
}

<think>好的,我现在需要回答用户关于PHPescape函数的作用和使用方法的问题。首先,我得确认用户提到的“escape函数”具体指什么,因为PHP本身并没有一个内置函数直接叫做escape()。根据用户的引用内容,他们可能指的是字符串转义,特别是在数据库操作中的转义处理,比如防止SQL注入。 接下来,我需要整理用户提供的引用信息。引用[1]提到了mysqli_real_escape_string()函数,用于转义特殊字符以便安全地插入数据库。引用[2]和[3]讨论了escape解码函数的实现,这可能涉及到类似JavaScript的escape()函数的处理,但PHP中并没有内置这个函数。引用[4]则比较了addslashes和mysql_real_escape_string,并建议不要使用已弃用的mysql_escape_string。 首先,用户可能混淆了不同上下文中的escape函数。在数据库安全方面,PHP推荐使用mysqli_real_escape_string()或PDO的预处理语句来防止SQL注入。而如果用户指的是类似JavaScript的escape编码,这需要自定义函数来实现,如引用[2]和[3]提到的。 需要分点说明不同情况下的escape处理,并强调安全最佳实践,比如使用预处理语句而非手动转义。同时,要指出已弃用的函数如mysql_escape_string,避免用户误用。 还需要生成相关问题,可能涉及其他安全函数、预处理语句的使用,或者不同转义方法的比较。确保回答结构清晰,步骤明确,符合用户的要求。</think>### PHP中字符串转义函数的作用与使用方法 #### 1. 转义函数的作用 在PHP中,字符串转义函数主要用于**防止SQL注入攻击**和**处理特殊字符**,特别是在拼接SQL语句时。这类函数会对引号、反斜线等特殊字符进行转义,确保数据库操作的语法正确性和安全性[^1][^4]。 #### 2. 核心函数与用法 ##### (1) `mysqli_real_escape_string()` - **作用**:转义SQL语句中的特殊字符(如`'`、`"`、`\`等),适用于MySQLi扩展。 - **用法示例**: ```php $conn = mysqli_connect("localhost", "user", "password", "db"); $input = "O'Reilly"; $safe_input = mysqli_real_escape_string($conn, $input); // 转义结果为 "O\'Reilly" $sql = "INSERT INTO users (name) VALUES ('$safe_input')"; ``` - **注意**:必须已建立数据库连接,否则会返回空值。 ##### (2) `PDO::quote()` - **作用**:PDO扩展提供的更安全的转义方法,自动适配不同数据库的转义规则。 - **用法示例**: ```php $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass"); $input = "Co'de"; $safe_input = $pdo->quote($input); // 结果 "'Co\'de'" $sql = "INSERT INTO posts (content) VALUES ($safe_input)"; ``` ##### (3) 自定义`escape`编码(类似JavaScript) - **场景**:处理URL编码或跨语言数据传输(如与JavaScript交互)。 - **实现方法**: ```php function escape_encode($str) { return preg_replace_callback('/[^\w]/', function($match) { return '%' . strtoupper(dechex(ord($match[0]))); }, $str); } $encoded = escape_encode("Hello 世界"); // 输出 "Hello%20%E4%B8%96%E7%95%8C" ``` #### 3. 已弃用函数警告 - **`mysql_escape_string()`**:已废弃,漏洞较多,禁止使用。 - **`addslashes()`**:不推荐单独使用,无法正确处理所有字符集。 #### 4. 安全建议 优先使用**预处理语句**(Prepared Statements)替代手动转义: ```php $stmt = $conn->prepare("INSERT INTO logs (message) VALUES (?)"); $stmt->bind_param("s", $user_input); // 自动处理转义 $stmt->execute(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值