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

如何通过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>";
    }
} 
?>

关键改动说明

  1. 提取实际数据:用while($row = $raw_results->fetch_assoc())循环遍历结果集,每次取出一行关联数组,然后遍历数组输出字段和对应的值。
  2. 修正语法错误:去掉了show columns语句中多余的点,确保能正确获取表的列信息。
  3. 优化输出体验:增加了表名和列名的标识,让结果更清晰,同时处理了无匹配结果的情况。
  4. 降低安全风险:用real_escape_string转义了用户输入的搜索关键词,减少SQL注入的可能性。

进阶安全建议

对于表名和列名,因为不能用预处理参数绑定,建议额外做一层验证:比如检查表名和列名是否只包含字母、数字和下划线,避免恶意注入的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:36:23