Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用php实现sql查询中的动态值_Php_Sql - Fatal编程技术网

用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);