php – 如何使用mysqli将变量传递给WHERE子句?

我目前有一个只有两个元素的小搜索表单:一个名为search的文本输入和一个名为param的“select”框.在该框中选择的选项应该用作参数,以选择将获取我的数据库中的哪个表列.

使用mysql_函数,可以这样做:

$param  = $_POST['param' ];
$search = $_POST['search'];

$query = 'SELECT * FROM table WHERE $param LIKE "%$search%"';

但我无法使用mysqli_语法.我正在尝试使用准备好的语句,但到目前为止我做的最好的是:

$param  = $_POST['param' ];
$search = $_POST['search'];

if($param == 'first_name')
{
    if($prep = $link->prepare('SELECT * FROM table
                               WHERE first_name
                               LIKE CONCAT("%",?,"%")'))
    {
        $prep->bind_param('s',$search);
        $prep->execute();
        $prep->bind_result($first_name,$last_name);

        while($prep->fetch())
            echo $first_name . ' ' . $last_name;

        $prep->close();
     }
     else
         echo 'Error while preparing statement.';
}
else if($param == 'last_name')
{
    ...
}

但是,只是使用一堆其他ifs似乎有很多重复和非生产性,特别是如果我有很多列要处理.

我尝试的第一件事是参数绑定 – … WHERE? LIKE …和$prep-> bind_param(‘ss’,$param,$search) – 但是它不起作用(我仍然不知道为什么).

有没有办法以更聪明的方式做到这一点?

如果您为每个参数使用相同的SQL代码,只需创建可能的参数的散列:(CGI参数名称=>表列名称)
$params = array(
    'first_name' => 'first_name','last_name' => 'last_name',);

从安全的角度来看,这是更好的,因为您可以防止SQL注入.

然后从哈希中获取列名并将其放入查询中 – 您将摆脱if-s:

$name = $params[$param];
$sql = "SELECT * FROM table
WHERE 
$name LIKE ?";

if($prep = $link->prepare($sql))
{
    $prep->bind_param('s',"%$search%");
    ...

正如@Akam所说,查询中不需要CONCAT(“%”,?,“%”) – 最好将值与前面的百分比绑定.

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...