如何在表的所有列中搜索

时间:2014-04-10 15:57:27

标签: php mysql sql

我想知道当我不知道列的名称时,如何在表的所有列中搜索子字符串?是否存在foreach-loop-functionallity我不知道?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,那么这可能有效,蛮力强制搜索所有结果。

以下是PDO-based示例:

$stmt = $dbh->prepare("SELECT * FROM table");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rows as $row){   
    foreach($row as $column){

        if(strpos($column, "find me") !== false)
            echo $match."found in:".$column."<br />";;
    }

}

答案 1 :(得分:1)

我也很懒。我也是ColdFusion程序员,而不是php。然而,无论语言是什么,编程逻辑都是相同的。我会这样做:

步骤1 - 运行此查询并在某处输出结果

select * 
from mytable
where 1 = 2

输出的结果将包括字段名称。然后将其复制并粘贴到源代码中作为注释。删除您不会查询的那些。将剩余的转换为列表变量。在ColdFusion中,该列表看起来像这样:

listOfFields = "field2,field3,field8,etc";

有意排除第1,4,5,6和7栏。然后我们将在查询中循环遍历列表。在ColdFusion中,这将是语法

<cfquery>
select somefields
from sometables
where 1 = 2
<cfloop list="#listOfFields#" index = "thisField">
or #thisField# = something
</cfloop>

这符合懒惰标准,因为您只需要获取一次字段名称。是否比从系统表中获取列并循环遍历它们更好还是更糟。这样做会使您自己的应用程序运行得更快,因为您不必每次都查询系统表。但是,如果您的表中添加了新列,则必须修改源代码以将其包含在搜索中。

如果您决定查询系统表,请确保只选择char和varchar字段。

答案 2 :(得分:1)

调整https://stackoverflow.com/a/1054988/1967396

时给出的样本查询
SELECT *
FROM Northwind.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'

获取列的名称。然后循环遍历这些名称,一次一列地搜索特定字符串。这利用了SQL搜索的效率,并阻止您制作整个数据库的副本,只是用嵌套的foreach循环(慢慢地)搜索它(如@ Silver89的答案)。