Php PDO未返回任何数据

Php PDO未返回任何数据,php,mysql,pdo,Php,Mysql,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 $where

以下是我的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\u dump
变量
$where\u 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;";

您运行的查询针对的是不正确的预处理语句,删除查询并从execute语句中分配结果将有效。php中还有很多其他问题。另外,直接使用来自用户的输入,如表(在本代码段中似乎未定义)、排序顺序和排序值,也会让您接受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);

首先,命名占位符不需要被引用,所以不要引用它们

其次,您不能绑定标识符(表/列/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
    }

}
旁注:这些默认表和列只是示例,您需要将它们填充并对应到您的表和列中。您可以创建自己的方法/函数,该方法/函数可以创建一个带有表及其相应列的映射,如果您确实想确定的话。

这样使用

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

请确保您的错误报告处于打开状态。仅供参考:占位符不需要引号为什么要使用{}作为您的值?@Ghost我在哪里不需要引号?@jonmrich在PDO语句中,SQL中的
…catcode=':cat_code'…
不需要用引号括起来,因此请使用
…cat_code=:cat_code…
,对于所有占位符(占位符是冒号变量)。
:sortvalue'
用于在查询中说明查询应按什么排序(即,什么列),因此我需要它。这在第一行
$stmt2
上给了我一个致命错误:“PHP致命错误:未捕获异常'PDOException',消息'SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在/Applications/MAMP/htdocs/live/php/all_get_login.php:24中第1行“?”附近使用的正确语法只是做了这个更改,没有任何区别。检查您的错误日志@jonmrich,并在您的PDO中添加一些错误检查。您未捕获错误。未意识到您无法为order by执行准备的语句。这就是问题所在。我确实需要从用户那里获取这些值,那么在传递它们之前是否有其他方法可以“清理”这些值?您可以定义被接受的值,而不是允许它按任何方式排序。例如,假设您没有为查询中正在排序的列编制索引,那么该列的性能将很差。至于排序器,解决它是一个更容易的挑战DESC':'ASC'这非常有帮助,完全有道理
$table
是“干净的”,因为我从我的数据库中得到了它,
$sort\u order
很容易检查
$sort\u value
有点棘手,因为我需要从数据库表中提取。我将发布另一个关于这个的问题。我很接近,但还不太清楚。@jonmrich如果不是用户输入,那没关系,但如果你想确定,你必须这样做,很高兴这有帮助。这肯定是用户输入,所以我必须确保它在白名单上。这是我的新问题,我一直在做一个数组来测试: