PHP输出SQL查询结果时,长comment字段超出屏幕的解决方法
解决长评论内容超出屏幕范围的问题
嘿,这个问题很好解决,给你几个实用的方案,你可以根据自己的需求来选:
1. 用CSS强制换行(最推荐,前端处理更灵活)
这是最常用的方法,不需要修改文本内容,通过CSS让容器自动适配宽度,长文本自动换行。你只需要把评论内容放在一个带样式的容器里就行:
修改后的输出代码:
if($con){ mysqli_select_db($con, "db3"); // 这里先提醒下:你的SQL有注入风险,后面会说怎么改 $query1 = "SELECT * FROM data WHERE id = $id"; $result = mysqli_query($con, $query1); while ($row = mysqli_fetch_array($result)){ echo "<div style='word-wrap: break-word; max-width: 100%;'>"; echo "<b>Sent by: " . $row['uname'] . ":</b><br>"; echo $row['comment'] . "<br>"; echo "<u>Sent on: " . $row['time'] . "</u><br><br>"; echo "</div>"; } }
word-wrap: break-word:会把过长的单词拆分开,避免单个单词撑破容器max-width: 100%:保证容器不会超出父元素的宽度
如果你的页面有全局CSS文件,更推荐给这个容器加一个类名(比如comment-box),然后在CSS里统一设置样式,这样代码更整洁:
.comment-box { word-wrap: break-word; max-width: 100%; /* 还可以加一些内边距、背景色让评论区更好看 */ padding: 10px; background-color: #f5f5f5; border-radius: 4px; margin-bottom: 10px; }
对应的PHP代码就改成:
echo "<div class='comment-box'>"; // 后面的输出内容不变
2. PHP截断长文本(适合需要限制字数的场景)
如果不想展示完整的长评论,只想显示前N个字符并加省略号,可以用mb_substr()处理文本(支持中文等多字节字符,避免乱码):
if($con){ mysqli_select_db($con, "db3"); $query1 = "SELECT * FROM data WHERE id = $id"; $result = mysqli_query($con, $query1); while ($row = mysqli_fetch_array($result)){ // 截取前200个字符,超过的话加省略号 $comment = $row['comment']; $truncated_comment = mb_substr($comment, 0, 200, 'UTF-8'); if(mb_strlen($comment, 'UTF-8') > 200){ $truncated_comment .= '...'; } echo "<b>Sent by: " . $row['uname'] . ":</b><br>"; echo $truncated_comment . "<br>"; echo "<u>Sent on: " . $row['time'] . "</u><br><br>"; } }
你可以根据需求调整200这个数字,改成适合你页面的字数。
3. PHP自动插入换行符(适合纯文本评论)
如果评论是纯文本格式(没有HTML标签),可以用wordwrap()函数手动给长文本插入换行符:
if($con){ mysqli_select_db($con, "db3"); $query1 = "SELECT * FROM data WHERE id = $id"; $result = mysqli_query($con, $query1); while ($row = mysqli_fetch_array($result)){ // 每80个字符插入一个<br>标签 $wrapped_comment = wordwrap($row['comment'], 80, "<br>", true); echo "<b>Sent by: " . $row['uname'] . ":</b><br>"; echo $wrapped_comment . "<br>"; echo "<u>Sent on: " . $row['time'] . "</u><br><br>"; } }
这个方法适合那种没有自然换行的纯文本,强制让内容在指定长度处换行。
重要提醒:你的SQL存在注入风险!
看到你的代码里直接把$id拼进SQL语句里了,这非常危险,容易被SQL注入攻击。一定要用预处理语句来修复:
if($con){ mysqli_select_db($con, "db3"); // 用预处理语句 $query1 = "SELECT * FROM data WHERE id = ?"; $stmt = mysqli_prepare($con, $query1); // 绑定参数,"i"表示$id是整数,如果是字符串就用"s" mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); while ($row = mysqli_fetch_array($result)){ // 输出内容不变,用上面的任意一种方案处理评论 echo "<div style='word-wrap: break-word; max-width: 100%;'>"; echo "<b>Sent by: " . $row['uname'] . ":</b><br>"; echo $row['comment'] . "<br>"; echo "<u>Sent on: " . $row['time'] . "</u><br><br>"; echo "</div>"; } // 记得关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($con); }
这个改动能有效防止SQL注入,一定要加上哦!
内容的提问来源于stack exchange,提问作者pauloc1995
相关产品推荐
相关产品推荐

