PDO 没有返回数据

No data returned with PDO

这是我的 PHP 代码的相关部分:

$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//get values from AJAX
$whereCategory = isset($_GET['cat_code'])? "{$_GET['cat_code']}" : '';
$sortvalue = isset($_GET['sortvalue'])? "{$_GET['sortvalue']}" : '';
$sortorder = isset($_GET['sortorder'])? "{$_GET['sortorder']}" : '';

$sql = "select * from  {$table} where cat_code = ':cat_code' order by ':sortvalue' ':sortorder';";
$stmt2 = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) );
$stmt2->execute(array(':cat_code' => $whereCategory,':sortvalue' => $sortvalue, ':sortorder' => $sortorder));
$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
header('Content-type: application/json');
echo json_encode($result);

如果我var_dump变量$where_category$sortorder$sortvalue,它们都是我所期望的,也是需要传入的正确数据查询。我在没有 PDO 的情况下直接尝试了查询,只是代入了正确的变量,我得到了我想要的东西,但显然我没有用我的 PDO 方法正确发送变量(就像它们一样)。

我没有收到任何错误,但也没有返回任何数据。

有什么建议吗?

改变这个-

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);

对此 -

$result = $stmt2->fetchAll(PDO::FETCH_ASSOC);

您正在尝试再次 运行 查询,而您需要做的只是获取结果。

尝试不带引号:

$sql = "select * from  {$table} where cat_code = :cat_code order by :sortvalue :sortorder;";

您的查询 运行 针对的是不正确的准备语句,删除查询并从执行语句分配结果将起作用。您的 php 中还有很多其他问题。同样使用直接来自用户的输入,例如 table(在此代码片段中似乎未定义)、排序顺序和排序值让您可以进行 sql 注入。

$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//get values from AJAX
$whereCategory = isset($_GET['cat_code'])? $_GET['cat_code'] : '';
$sortvalue = isset($_GET['sortvalue'])? $_GET['sortvalue'] : '';
$sortorder = isset($_GET['sortorder'])? $_GET['sortorder'] : '';

/** you cannot use prepared statements for doing the order by */
$sql = "select * from $table where cat_code = :cat_code order by $sortvalue $sortorder;";
$stmt2 = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) );
$query = $stmt2->execute(['cat_code' => $whereCategory]);
/** below line isn't needed because above on deals with it */
//$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$result = $query->fetchAll();
header('Content-type: application/json');
echo json_encode($result);

首先,命名占位符不需要被引用,所以放弃那些。

其次,你不能绑定标识符(table/columns/DESC/ASC)你只能将它们列入白名单。

第三,不要混用->query()->execute()。单独使用->execute()

header('Content-type: application/json');
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//get values from AJAX
if(isset($_GET['cat_code'], $_GET['sortvalue'], $_GET['sortorder'])) {

    $whereCategory = $_GET['cat_code'];
    $sortvalue = $_GET['sortvalue'];
    $sortorder = $_GET['sortorder'];

    // super simple filtering
    $default_tables = array('table1', 'table2', 'table3');
    $default_columns = array('column1', 'column2', 'column3');
    in_array(needle, haystack)
    if(
        in_array($table, $default_tables) &&
        in_array($sortvalue, $default_columns) &&
        in_array($sortorder, array('ASC', 'DESC'))
    ) {
        // good to go

        $sql = "SELECT * FROM $table where cat_code = :cat_code ORDER BY $sortvalue $sortorder";
        $stmt2 = $dbh->prepare($sql);
        $stmt2->execute(array(':cat_code' => $whereCategory));
        echo json_encode($stmt2->fetchAll(PDO::FETCH_ASSOC));

    } else {
        // did not satisfy condition
    }

}

旁注:那些默认的表格和列只是示例,您需要将其填充并对应到您的表格和列中。如果您真的想确定的话,您可以创建自己的 method/function,它会创建一个包含表格及其相应列的地图。

像这样使用

$result = $stmt2->fetchAll(PDO::FETCH_ASSOC);