如何使用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()
,就像第一个查询一样。