PHP输出含PHP代码的HTML表格时出现语法错误求助
问题分析与修复方案
你的代码核心问题是在echo语句里嵌套了完整的PHP标签(<?php ?>),这些标签会被当作纯文本输出到页面,根本不会被PHP解析执行。另外还有重复查询、变量未定义、SQL注入风险这些问题,下面是逐一修复后的方案:
错误点拆解
- echo内嵌套PHP标签无效:你试图用echo输出包含
<?php ?>的字符串,PHP只会把这些标签当成普通文本打印,不会执行里面的代码。 - 重复数据库查询:已经执行了
$fetchVideos查询,没必要在echo里再执行一次select * from videos,属于冗余操作。 - 变量未定义:
$location这个变量根本没定义,应该用$rows['location']从查询结果里取值。 - SQL注入风险:直接把用户输入
$input拼进SQL语句里,很容易被注入攻击,必须用预处理语句。
修复后的完整代码
<!doctype html> <html> <head> <title>Search</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous"> <link rel="stylesheet" href="styles.css"> </head> <body> <?php include("config.php"); if (isset($_POST['input'])){ $input = $_POST['input']; // 用预处理语句防止SQL注入 $query = "SELECT * FROM videos WHERE location LIKE ? OR FileName LIKE ? OR ImageSize LIKE ? OR MediaDuration LIKE ? OR VideoFrameRate LIKE ? OR CreateDate LIKE ? OR author LIKE ? OR tags LIKE ? OR genre LIKE ? OR rating LIKE ?"; $stmt = mysqli_prepare($con, $query); // 拼接%前缀,匹配以输入开头的内容 $searchTerm = $input . '%'; // 绑定10个字符串参数(对应10个LIKE条件) mysqli_stmt_bind_param($stmt, "ssssssssss", $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 把查询结果转为数组,方便后续遍历 $videos = mysqli_fetch_all($result, MYSQLI_ASSOC); // 直接输出HTML,嵌入PHP逻辑,不用echo嵌套PHP if (!empty($videos)) { ?> <table class="table table-bordered" style="margin-top: 50px;"> <tr> <th> Video </th> <th> Názov </th> <th> Autor </th> <th> Tagy </th> <th> Žáner </th> <th> Hodnotenie </th> <th> Rozlíšenie videa </th> <th> Počet Snímkov </th> <th> Dĺžka videa</th> <th> Dátum Vytvorenia </th> </tr> <?php foreach($videos as $rows) { ?> <tr> <td><video src="<?php echo htmlspecialchars($rows['location']); ?>" controls width='320px' height='320px' ></video></td> <td><?php echo htmlspecialchars($rows['FileName']); ?></td> <td><?php echo htmlspecialchars($rows['author']); ?></td> <td><?php echo htmlspecialchars($rows['tags']); ?></td> <td><?php echo htmlspecialchars($rows['genre']); ?></td> <td><?php echo htmlspecialchars($rows['rating']); ?></td> <td><?php echo htmlspecialchars($rows['ImageSize']); ?></td> <td><?php echo htmlspecialchars($rows['VideoFrameRate']); ?></td> <td><?php echo htmlspecialchars($rows['MediaDuration']); ?></td> <td><?php echo htmlspecialchars($rows['CreateDate']); ?></td> </tr> <?php } ?> </table> <?php } else { echo "<p>Žiadne videá nájdené.</p>"; } } ?> </body> </html>
额外优化说明
- 添加了
htmlspecialchars()函数,防止XSS攻击,把用户输入的特殊字符转义成HTML实体。 - 用预处理语句替代直接拼接SQL,彻底解决SQL注入风险。
- 移除了冗余的重复查询,只执行一次搜索查询。
- 增加了无结果时的提示信息,提升用户体验。
- 修复了原表格里的拼写错误(
Dĺžka videa</th>s多了个s)。
内容的提问来源于stack exchange,提问作者Petco
相关产品推荐
相关产品推荐

