我有一个包含数据的数组,我正在遍历数据。
对于每个字符串,我想检查它是否存在于数据库中(整个表)。它可能在另一个字符串中(所以如果表包含heyredcat,并且你检查红色,它也会返回true)。
我已经想出了这个示例脚本,但我无法提出MySQL查询,Googling为“if column equals string”提出了许多很好的建议,但不是整个表中的字符串。
<?php
$colors = array("red","green","blue","yellow");
foreach ($colors as $value)
{
$result = mysql_query("SELECT * FROM products where $value ...... ") or die(mysql_error());
if($result){
echo "Color" .$value. "is present";
else {
echo "Color" .$value. "is not present";
}
}
?>
我应该使用什么MySQL查询?另外,我想知道,这是一种有效的方法吗? (耗费时间)
答案 0 :(得分:3)
这就是查询的样子:
$res = mysql_query("SELECT 1 FROM `products` WHERE
`col1` LIKE '%" . $value . "%'
OR `col2` LIKE '%" . $value . "%'
OR `col3` LIKE '%" . $value . "%'
.. etc
");
$num = mysql_num_rows($res);
if ($num === 0) { // not found
但是请记住,如果用户可以选择颜色列表,则容易受到SQL注入。
所以你想做:
$value = mysql_real_escape_string($value);
mysql_query("SELECT 1 FROM `products` WHERE
`col1` LIKE '%" . $value . "%'
OR `col2` LIKE '%" . $value . "%'
OR `col3` LIKE '%" . $value . "%'
.. etc
");
你可以通过查看mysql架构来动态生成列名。欺骗性的方法是首先SELECT * FROM table LIMIT 1
获取所有列名称。
更好的是使用PDO
驱动程序,它具有更好(不易出错)的方式将参数插入查询。
答案 1 :(得分:2)
如果你想检查整个数据库,那么你做错了。
以下是如何做到这一点的主要内容:
首先收集所有数据库表和列:
Select table_schema, table_name, column_name from information_schema.COLUMNS where table_schema=[your_db_name] and table_name=[your_table_name]
您刚刚获得了整个数据库服务器列。
现在,您需要检查每列是否与您的字符串一样。
<?php
while ($row = mysqli_fetch_array($result)){
mysqli_select_db($row['table_schema']);
$res = mysqli_query('select * from '.$row['table_name'].' where '.$row['column_name'].' like "%'.$your_string.'%"');
while($res_line = mysqli_fetch_array($res)){
var_dump($res_line);
}
}
?>
哦,我不负责任何db滞后:D
你可能想在转储中添加table_schema,table_name和column_name,我不会带来所有的乐趣,有一些。
答案 2 :(得分:0)
您还需要循环访问数据库中每个表的列表,并查询每个表中的每个列。我不知道可以查询数据库中每个表中的每一列的查询。也许你最好使用mysqldump和grep?