如何通过PHP变量与循环实现MySQL多表多列搜索并获取表数据?
解决方法:提取查询结果中的实际数据
你当前的代码只是输出了mysqli_result对象的结构(就是你看到的那个对象信息),并没有从这个结果集中取出实际的表数据。另外代码里还有个小语法错误,我一起帮你修正:
问题分析
- 你用
print_r($raw_results)输出的是查询结果的对象实例,不是实际数据,需要通过mysqli的结果集方法(比如fetch_assoc())来遍历获取每一行数据。 - 代码中
show columns from ".$res.".;多了一个多余的点,应该改成show columns from ".$res.";,否则列查询会失败。 - 存在SQL注入风险:直接把用户输入的
$query拼到SQL语句里是不安全的,我会在后面给你提安全建议。
修正后的代码
<?php $mysqli = new mysqli("localhost", "root", "", "mobirise"); if ($mysqli->connect_error) { die("Connection failed: " . $mysqli->connect_error); } if(!empty($_POST['stext'])){ $query = $_POST['stext']; $min_length = 3; if(strlen($query) >= $min_length){ // 转义用户输入,降低SQL注入风险 $safe_query = $mysqli->real_escape_string($query); $sql_r= $mysqli->query("show tables from mobirise;"); while($table = mysqli_fetch_array($sql_r)) { $res = $table[0]; // 修正列查询的语法错误:去掉多余的点 $sql_i= $mysqli->query("show columns from ".$res.";"); while($tables = mysqli_fetch_array($sql_i)) { $reslt = $tables[0]; // 执行搜索查询 $raw_results = $mysqli->query("SELECT * FROM $res WHERE $reslt LIKE '%".$safe_query."%'"); // 检查是否有结果 if($raw_results->num_rows > 0){ echo "<h3>表:$res,列:$reslt 的匹配结果</h3>"; echo "<ul>"; // 遍历结果集,取出每一行数据 while($row = $raw_results->fetch_assoc()){ echo "<li>"; // 输出该行的所有字段和值 foreach($row as $key => $value){ echo "$key: $value | "; } echo "</li>"; } echo "</ul>"; } else { echo "<p>表:$res,列:$reslt 没有匹配结果</p>"; } } } } else { echo "<p>搜索关键词长度不能少于 $min_length 个字符</p>"; } } ?>
关键改动说明
- 提取实际数据:用
while($row = $raw_results->fetch_assoc())循环遍历结果集,每次取出一行关联数组,然后遍历数组输出字段和对应的值。 - 修正语法错误:去掉了
show columns语句中多余的点,确保能正确获取表的列信息。 - 优化输出体验:增加了表名和列名的标识,让结果更清晰,同时处理了无匹配结果的情况。
- 降低安全风险:用
real_escape_string转义了用户输入的搜索关键词,减少SQL注入的可能性。
进阶安全建议
对于表名和列名,因为不能用预处理参数绑定,建议额外做一层验证:比如检查表名和列名是否只包含字母、数字和下划线,避免恶意注入的可能。
内容的提问来源于stack exchange,提问作者Faraz Hussain
相关产品推荐
相关产品推荐

