Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP PDO查询关键字_Php_Mysql_Pdo - Fatal编程技术网

如何使用PHP PDO查询关键字

如何使用PHP PDO查询关键字,php,mysql,pdo,Php,Mysql,Pdo,我有一些代码,我试图找出如何最好地查询关键字和过滤数据。我不断收到语法错误或访问冲突。如果有人能给我指出正确的方向,我将不胜感激 下面是我试图用来查询关键字和排序数据的代码 $whereSQL = $orderSQL = ''; if(!empty($_POST['keywords'])){ $keywords = $_POST['keywords']; $whereSQL = "WHERE ad_city LIKE :keywords"; }else{ $

我有一些代码,我试图找出如何最好地查询关键字和过滤数据。我不断收到语法错误或访问冲突。如果有人能给我指出正确的方向,我将不胜感激

下面是我试图用来查询关键字和排序数据的代码

$whereSQL = $orderSQL = ''; 
if(!empty($_POST['keywords'])){     
    $keywords = $_POST['keywords'];
    $whereSQL = "WHERE ad_city LIKE :keywords"; 
}else{
    $keywords = '';
}
if(!empty($_POST['sortBy']) && (strtoupper($_POST['sortBy']) == 'ASC' || strtoupper($_POST['sortBy']) == 'DESC')){ 
$sortBy = $_POST['sortBy'];
}else{ 
    $sortBy = 'DESC';
} 
$orderSQL = " ORDER BY ad_city $sortBy "; 

// Count all records 
$query = $conn->prepare("SELECT COUNT(*) as rowNum FROM ads $whereSQL $orderSQL"); 
$query->bindValue(':keywords', '%' . $keywords . '%');
$query->execute();
$row = $query->fetch();
$rowCount = $row['rowNum']; 


// Initialize pagination class 
$paginationConfig = array( 
    'baseURL' => $baseURL, 
    'totalRows' => $rowCount, 
    'perPage' => $limit, 
    'currentPage' => $offset, 
    'contentDiv' => 'postContent', 
    'link_func' => 'searchFilter' 
); 
$pagination =  new Pagination($paginationConfig); 

// Fetch records based on the offset and limit 
$query = $conn->prepare("SELECT * FROM ads $whereSQL $orderSQL LIMIT $offset,$limit");
$query->bindValue(':keywords', '%' . $keywords . '%');
$query->execute();
$queryResult = $query->fetchAll();

提前感谢。

您只能对值使用占位符,不能对表或列名使用占位符,也不能对诸如
ASC
DESC
之类的关键字使用占位符。您需要使用普通字符串替换。使用输入验证来防止SQL注入

if(!empty($_POST['sortBy']) && (strtoupper($_POST['sortBy']) == 'ASC' || strtoupper($_POST['sortBy']) == 'DESC')){ 
    $sortBy = $_POST['sortBy'];
}else{ 
    $sortBy = 'DESC';
} 
$orderSQL = " ORDER BY ad_city $sortBy "; 
此外,您的查询保证只返回1行。无需检查
$query->rowCount()
(始终为1),也无需循环结果。只取第一行也是唯一一行

$query->execute();
$row = $query->fetch();
$rowCount = $row['rowNum'];

您不能为诸如
ASC
DESC
之类的关键字使用占位符,它们只能在允许表达式的情况下使用。是的,这对排序选项@Barmar有效,您知道为什么关键字搜索现在似乎抛出错误吗?抛出此错误:致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与您的MariaDB服务器版本相对应的手册,了解使用near:关键字ORDER BY ad_city desc LIMIT 0,18'的正确语法,第1行“唯一的方法是,如果您尝试直接执行查询,而不是使用
prepare()
。感谢@Barmar的帮助,该错误是在下一次查询时向下几行引起的。我添加它是为了显示我所拥有的。您需要使用
prepare()
,而不是
query()
,就像第一个查询一样。