用php实现sql查询中的动态值
我想在不同表的所有列中搜索某个字符串,因此我在每个列名中循环查询。但如果我把它作为动态值,它似乎不起作用。 怎么了用php实现sql查询中的动态值,php,sql,Php,Sql,我想在不同表的所有列中搜索某个字符串,因此我在每个列名中循环查询。但如果我把它作为动态值,它似乎不起作用。 怎么了 <?php $search = $_POST['search']; $columns = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'feedback'"; $columns_result = $conn->query($columns); $columns_arra
<?php
$search = $_POST['search'];
$columns = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'feedback'";
$columns_result = $conn->query($columns);
$columns_array = array();
if (!$columns_result) {
echo $conn->error;
} else {
while ($row = $columns_result->fetch_assoc()) {
//var_dump($row);
//echo $row['COLUMN_NAME']."</br>";
array_push($columns_array, $row['COLUMN_NAME']);
}
}
var_dump($columns_array);
$row_result = array();
for ($i = 0; $i < count($columns_array); $i++) {
echo $columns_array[$i] . "</br>";
$name = "name";
// $sql = 'SELECT * FROM feedback WHERE "'.$search.'" in ("'.$columns_array[$i].'")';
$sql = 'SELECT * FROM feedback WHERE ' . $name . ' like "' . $search . '"';
$result = $conn->query($sql);
if (!$result) {
echo "hi";
echo $conn->error;
} else {
foreach ($result as $row) {
array_push($row_result, $row);
echo "hey";
}
}
}
var_dump($row_result);
在我看来,您希望生成一个where
子句,该子句查看表中任何可用的nvarchar
列,以查找可能的匹配项。也许像下面这样的东西对你有帮助
我在写以下内容时考虑到了SQL Server,因为一开始这个问题没有明确标记为MySql。然而,事实证明,对MySql的查询工作也进行了一些小的更改(nvarchar
需要变成varchar
):
以上是使用准备好的报表的修订版本。我现在已经使用PHP7.2.12和SQLServer测试了这个最新版本。结果我不得不重写我的参数绑定部分。无论如何,匹配这么多列并不是一种非常优雅的查询方式。但是这是一个很好的练习。看起来您正在使用mysqli,所以我想通过mysqli给出另一种方法
它的作用与cars10m解决方案大致相同
$search = $_POST['search'];
$columns = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'feedback'";
$columns_result = $conn->query($columns)->fetch_all(MYSQLI_ASSOC);
// Here dynamically prepare WHERE with all the columns joined with OR
$sql = 'SELECT * FROM feedback WHERE ';
$arrayOfWHERE = [];
foreach($columns_result as $col){
$arrayOfWHERE[] = '`'.$col['COLUMN_NAME'].'` LIKE ?';
}
$sql .= implode(' OR ', $arrayOfWHERE);
// prepare/bind/execute
$stmt = $conn->prepare($sql);
$stmt->bind_param(str_repeat("s", count($arrayOfWHERE)), ...array_fill(0, count($arrayOfWHERE), $search));
$stmt->execute();
$result = $stmt->get_result();
$row_result = $result->fetch_all(MYSQLI_ASSOC);
var_dump($row_result);
当然,这将在表的每一列中搜索该值。它不考虑数据类型。和往常一样,我必须指出,使用PDO比使用mysqli更好。如果您可以切换到PDO。您是否尝试过删除$name.
?A)这是什么类型的SQL(在类似的事情上它们是不同的)?和B)您使用什么工具/语言来执行它?如果是客户端语言,那么请同时提供客户端代码行。这是由于引号引起的,我很愚蠢。你为什么这样做?这看起来不安全。@Manoj我建议尽快在代码中阅读并实现它,因为代码中存在安全风险。如果你更喜欢mysqli,那么请阅读而不是高兴你喜欢我的贡献。然而,我想指出的是,这段代码仍然对注入开放。也许你应该看看这个,以帮助你想出一个更安全的版本:请再看一次,我改变了我的解决方案,使它成为注射安全的。嘿,谢谢@Dharman!是的,当然,PDO错误函数是PDO::errorInfo()
。我没有遇到SQL错误——这就是我没有注意到的原因。
$search = $_POST['search'];
$columns = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'feedback'";
$columns_result = $conn->query($columns)->fetch_all(MYSQLI_ASSOC);
// Here dynamically prepare WHERE with all the columns joined with OR
$sql = 'SELECT * FROM feedback WHERE ';
$arrayOfWHERE = [];
foreach($columns_result as $col){
$arrayOfWHERE[] = '`'.$col['COLUMN_NAME'].'` LIKE ?';
}
$sql .= implode(' OR ', $arrayOfWHERE);
// prepare/bind/execute
$stmt = $conn->prepare($sql);
$stmt->bind_param(str_repeat("s", count($arrayOfWHERE)), ...array_fill(0, count($arrayOfWHERE), $search));
$stmt->execute();
$result = $stmt->get_result();
$row_result = $result->fetch_all(MYSQLI_ASSOC);
var_dump($row_result);