我想知道当我不知道列的名称时,如何在表的所有列中搜索子字符串?是否存在foreach-loop-functionallity我不知道?
答案 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的答案)。