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

标签 php binding parameters mysqli where

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

使用 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')
{
    ...
}

但仅使用一堆 else if 似乎重复且效率低下,特别是如果我有很多列要处理时。

我尝试的第一件事是参数绑定(bind) - ... WHERE? LIKE ...$prep->bind_param('ss', $param, $search) - 但它没有用(我仍然不知道为什么) .

有没有更智能的方法?

最佳答案

如果您对每个参数使用相同的 SQL 代码,只需创建一个可能的参数的散列:(CGI param name => table column name)

$params = array(
    'first_name' => 'first_name',
    'last_name' => 'last_name',
);

从安全的角度来看,这要好得多,因为您可以免受 SQL 注入(inject)攻击。

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

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

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

正如@Akam 所说,无需在查询中使用 CONCAT("%", ?, "%") - 最好将值与前面的百分比绑定(bind)。

关于php - 如何使用 mysqli 将变量传递给 WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845999/

相关文章:

php - 使用 php 在 PDF 中嵌入视频/flash

php - iOS APN Php 无法连接

php - 如何使用 PHP 下载 FTP 上的最新文件?

javascript - 您可以在不使用表单的情况下将数组从 javascript 传递到 asp.net mvc Controller 操作吗?

PowerShell参数集: Require either A or B to be set

php - 如何从一条 laravel 路由获取返回值到另一条路由

c# - WPF MVVM CanExecute方法实现问题

java - 为什么 JAXB 说 "xxx is an interface, and JAXB can' t 处理接口(interface)”。即使生成的类不是接口(interface)

java - 如何仅使用构造函数的部分参数? ( java )

c++ - 参数前的 "class"是什么意思?