Php 类PDO查询不返回结果

Php 类PDO查询不返回结果,php,mysql,pdo,sql-like,Php,Mysql,Pdo,Sql Like,好吧,我已经做了几个小时了,我一辈子都不知道到底出了什么问题。代码如下: $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(

好吧,我已经做了几个小时了,我一辈子都不知道到底出了什么问题。代码如下:

$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();
}
正如我可能已经说过的,我也一直在这个网站上搜索,试图找到一个解决方案;什么都没用,甚至MySQL的
CONCAT(“%”,:str,“%”)

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


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

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

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

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

你的问题是什么?你收到错误消息了吗?如果你没有收到错误消息,我假设它没有抛出任何错误,因此它实际上在进行查询,而查询不会返回/输出任何内容。你试过
bindParam()
方法中第三个参数的
PDO::PARAM_STR
了吗?@inhan我确实没有改变。调试/查看您的查询。我建议尽可能简化此操作,以确保它确实是中断的类型(删除所有其他参数)。请注意,如果您希望动态生成列白名单,您可以使用
information\u schema
数据库(假设为MySql)@从这里开始当然,但是,只有当您希望按任意列和所有列进行搜索/排序时,才会出现这种情况
$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