You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中addslashes()处理远程TXT文件无法替换所有单引号求助

解决PHP中存入MySQL时单引号未全部转义的问题

嘿,我来帮你搞定这个问题!你遇到的部分单引号没被addslashes()转义的情况,大概率是这两个原因之一:要么文本里的单引号不是普通的ASCII单引号,要么addslashes()本身就不是处理数据库插入的最佳工具。下面给你拆解原因和解决方案:

问题根源分析

  1. 特殊单引号类型:很多网页或文档里的单引号是「智能引号」(比如弯引号‘或’),这些是UTF-8编码的特殊字符,而addslashes()只识别并转义ASCII标准的单引号',所以这类特殊引号不会被处理。
  2. addslashes()的局限性:这个函数只是简单转义部分字符,并非为数据库插入专门设计,它没法适配不同数据库的转义规则,也不能完全防止SQL注入,属于比较老旧的处理方式。

解决方案

方案1:修复addslashes()的处理逻辑(临时过渡用)

如果一定要用addslashes(),先把所有类型的单引号统一转换成普通ASCII单引号,再进行转义:

// 获取远程文本内容
$txtContent = file_get_contents('http://terriblytinytales.com/test.txt');
// 将所有智能单引号(左、右)替换为普通单引号
$txtContent = str_replace(["‘", "’"], "'", $txtContent);
// 再执行转义
$txtFile = addslashes($txtContent);

// 后续存入数据库的代码...

方案2:使用PDO预处理语句(强烈推荐,安全可靠)

这是PHP操作数据库的标准正确姿势,不需要手动转义字符,数据库驱动会自动处理所有特殊字符,还能彻底避免SQL注入:

// 1. 建立PDO数据库连接(替换成你的数据库信息)
$dsn = 'mysql:host=localhost;dbname=your_db_name;charset=utf8mb4';
$dbUser = 'your_username';
$dbPass = 'your_password';

try {
    $pdo = new PDO($dsn, $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("连接失败:" . $e->getMessage());
}

// 2. 获取文本内容
$txtContent = file_get_contents('http://terriblytinytales.com/test.txt');

// 3. 预处理插入语句(替换成你的表名和字段名)
$stmt = $pdo->prepare("INSERT INTO your_table (content_field) VALUES (?)");
// 绑定参数并执行插入
$stmt->execute([$txtContent]);

echo "内容已成功存入数据库!";

额外注意事项

  • 确保你的数据库表和字段的字符集设置为utf8mb4,这样能支持所有Unicode字符(包括各种特殊符号、emoji等),避免出现乱码。
  • 尽量放弃addslashes()和mysql_*系列函数,改用PDO或mysqli的预处理语句,这是现代PHP开发的规范。

内容的提问来源于stack exchange,提问作者crownedlake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:58:01