【问题标题】:PDO LIKE query not returning resultsPDO LIKE 查询不返回结果
【发布时间】:2012-10-17 00:10:27
【问题描述】:

嗯,我已经在这个问题上待了几个小时,我这辈子都搞不清楚哪里出了问题。代码如下:

$str = "%" . $_POST['str'] . "%";
$offset = (int) $_POST['offset'];

try {
    $stmt = $dbh->prepare("SELECT * FROM Spells WHERE :col LIKE :str ORDER BY :sort LIMIT 10 OFFSET :offset");
    $stmt->bindParam(":col",$_POST['col']);
    $stmt->bindParam(":str",$str);
    $stmt->bindParam(":offset",$offset, PDO::PARAM_INT);
    $stmt->bindParam(":sort",$_POST['sort']);

    $stmt->execute();
}
catch (PDOException $e) {
    echo "MySQL error: " . $e->getMessage() . "<br/>";
    die();
}

与数据库的连接工作正常,没有发生错误。如果我在搜索字段中输入%(在查询中将输出为%%%),结果将按预期返回。

我在 phpMyAdmin 中尝试过相同的查询,它工作正常。我一直在从已弃用的 mysql_* 函数中更新此脚本,该函数之前运行良好。

先前已弃用的查询示例:

$sql = "SELECT * FROM Spells WHERE " . $col . " LIKE '%" . $str . "%' ORDER BY " . $sort . " LIMIT 10 OFFSET " . $offset;

正如我可能已经说过的,我也一直在这个网站上搜索,试图找到解决方案;没有任何效果,甚至 MySQL 的 CONCAT('%',:str,'%') 也没有。

我正在测试的服务器正在运行 php 版本 5.3.17。

如果我没有说清楚,我的问题是我在这里做错了什么?对于那些想知道的人(我以为我放了这个,但显然我没有放),没有错误消息。

【问题讨论】:

  • 您的问题是什么?您收到错误消息了吗?
  • 如果你没有收到错误消息,我假设它没有抛出任何错误,所以它实际上是在进行查询,作为回报,它不会返回/输出任何内容。你试过:strbindParam()方法的第三个参数PDO::PARAM_STR了吗?
  • @inhan 我确实有,没有变化。
  • See this 调试/查看您的查询。
  • 我建议尽可能简化这一点,以确保它确实是破坏的 LIKE(删除所有其他参数)。

标签: php mysql pdo sql-like


【解决方案1】:

问题是您不能使用参数代替identifiers。这意味着您不能参数化列名或表名。

您的查询在执行时的基本外观是

SELECT * FROM Spells WHERE 'some_column_name' LIKE '%something%'...

我会建立一个搜索和排序列名称的白名单,并使用它们来构建您的查询。这是一个非常简单的例子

$search = array('col1', 'col2', 'col3');
$defaultSearch = 'col1';

$sort = array('col1', 'col2');
$defaultSort = 'col1';

$col = in_array($_POST['col'], $search) ? $_POST['col'] : $defaultSearch;
$sort = in_array($_POST['sort'], $sort) ? $_POST['sort'] : $defaultSort;

$sql = sprintf('SELECT * FROM Spell WHERE %s LIKE :str ORDER BY %s LIMIT 10 OFFSET :offset',
    $col, $sort);

$stmt = $dbh->prepare($sql);
// bind :str and :offset, and so on

【讨论】:

  • 请注意,如果您想动态生成列白名单,您可以使用 information_schema 数据库(假设为 MySql)
  • @therefromhere 当然,但这只有在您想按任何和所有列搜索/排序时才适用
猜你喜欢
  • 1970-01-01
  • 2015-01-29
  • 2017-05-18
  • 2014-02-25
  • 2017-05-24
  • 2023-04-10
  • 2016-09-03
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多