You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL存储数据时自动替换\n为换行符的问题求助

解决PHP UPDATE语句中换行符丢失的问题

嘿,我之前也碰到过一模一样的情况!你现在的问题核心是直接把变量硬拼进SQL语句时,换行符被错误处理,而且这种写法还存在严重的SQL注入风险,下面给你一步步解决的办法:

1. 赶紧换成预处理语句(最关键的一步)

直接把$conteudo$id塞进SQL字符串里,不仅容易被黑客攻击,PHP还会因为字符串解析、转义规则的问题,把你的换行符给“吃掉”或者转成别的东西。用PDO或者MySQLi的预处理语句,就能保证原始字符串完完整整传到数据库里。

PDO版本示例:

// 假设你已经有了PDO连接实例$pdo
$conteudo = "Sobre\nmim";
$id = 1; // 替换成你的实际ID

// 准备预处理语句
$stmt = $pdo->prepare("UPDATE `prove750_mrdias`.`stringsMrDias` SET `conteudo` = :conteudo WHERE `ID` = :id");
// 绑定变量,PDO会自动处理转义和类型
$stmt->bindParam(':conteudo', $conteudo, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
// 执行语句
$stmt->execute();

MySQLi版本示例:

// 假设你已经有MySQLi连接实例$conn
$conteudo = "Sobre\nmim";
$id = 1;

$stmt = $conn->prepare("UPDATE `prove750_mrdias`.`stringsMrDias` SET `conteudo` = ? WHERE `ID` = ?");
// 绑定参数:"s"代表字符串类型,"i"代表整数类型
$stmt->bind_param("si", $conteudo, $id);
$stmt->execute();

2. 排查现有代码里的转义问题

如果你暂时没法立刻改预处理,先检查下有没有自动转义的设置(比如老PHP版本里的magic_quotes_gpc,不过现在已经废弃了,但老环境可能还开着),或者你自己手动调用了addslashes()这类函数,把换行符转成了\n的字面量,导致数据库存的不是实际换行。

你可以在执行SQL前,输出字符串的十六进制来验证:

// 输出原始字符串的十六进制,正常的换行符是0A
echo bin2hex($conteudo);
// 要是输出里有536f6272650a6d696d,说明换行符还在;要是没有0A,那就是之前就丢了

如果换行符确实提前丢了,得去查变量赋值的源头——比如是不是从表单接收的时候,被trim()或者其他字符串处理函数给改了。

3. 确认数据库字段的设置

最后再检查下你的conteudo字段,类型得是TEXTVARCHAR(长度够的话)或者LONGTEXT,字符集设成utf8mb4,避免因为字段类型限制把换行符给截断或者转换了。

为啥phpMyAdmin手动输入就正常?

因为phpMyAdmin会把你输入的\n直接解析成实际的换行符,而PHP硬拼SQL的时候,要么把\n当成普通转义字符处理,要么被转义函数改成\\n,最后数据库里存的就是字面量的sobre\\nmim,显示的时候就变成了sobre mim(或者直接显示sobre\nmim)。


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

火山引擎 最新活动