【发布时间】:2018-04-07 22:45:59
【问题描述】:
我正在尝试使用 PDO 从 mysqli 转录我的代码。
我正在制作一个简单的从低到高的价格过滤器,反之亦然
在 preview.php 内部,我有一个带有单选检查按钮的表单,这些按钮通过 POST 方法发送到 search.php 文件中
我在进行验证的 search.php 中尝试了什么:
$sql = "SELECT * FROM products";
$cat_id = (($_POST['cat']!= '')?sanitize($_POST['cat']):'');
if($cat_id == ''){
$sql .= ' WHERE deleted = 0';
}else{
$sql .= "WHERE categories = '{$cat_id}' AND DELETED = 0";
}
$price_sort =(($_POST['price_sort'] != '')?sanitize($_POST['price_sort']):'');
$min_price =(($_POST['min_price'] != '')?sanitize($_POST['min_price']):'');
$max_price =(($_POST['max_price'] != '')?sanitize($_POST['max_price']):'');
if($min_price != ''){
$sql .= " AND price >= '{$min_price}'";
}
if($max_price != ''){
$sql .= " AND price <= '{$max_price}'";
}
if($price_sort == 'low'){
$sql .= " ORDER BY price";
}
if($price_sort == 'high'){
$sql .= "ORDER BY price DESC";
}
$sql->execute();
这是返回
未捕获的错误:在字符串上调用成员函数 execute()
在execute 上发生错误,我尝试使用准备好的语句和绑定,但没有找到解决方案
感谢@Chris 和@Cobra_Fast,我设法通过以下方式解决了我的全部问题:
- 确保我的 PDO 对象正在准备语句
- 绑定所有参数(在查询语句中转义有变量)
$sql = "SELECT * FROM products";
$cat_id = (($_POST['cat']!= '')?sanitize($_POST['cat']):'');
if($cat_id == ''){
$sql .= ' WHERE deleted = 0';
}else{
// $sql .= "WHERE categories = '{$cat_id}' AND DELETED = 0";
$sql .= "WHERE categories = :cat_id AND DELETED = 0";
}
$price_sort =(($_POST['price_sort'] != '')?sanitize($_POST['price_sort']):'');
$min_price =(($_POST['min_price'] != '')?sanitize($_POST['min_price']):'');
$max_price =(($_POST['max_price'] != '')?sanitize($_POST['max_price']):'');
if($min_price != ''){
$sql .= " AND price >= :min_price";
$sql->bindParam( ":max_price", $min_price, PDO::PARAM_STR );
}
if($max_price != ''){
$sql .= " AND price <= :max_price";
$sql->bindParam( ":max_price", $max_price, PDO::PARAM_STR );
}
if($price_sort == 'low'){
$sql .= " ORDER BY price";
}
if($price_sort == 'high'){
$sql .= " ORDER BY price DESC";
}
// $veza->query($sql);
$productQ =$veza->prepare($sql);
$productQ->bindParam( ":cat_id", $cat_id, PDO::PARAM_STR );
$productQ->execute();
【问题讨论】:
-
…仔细阅读错误信息。它似乎在告诉你什么?你看到你在哪里打电话给
execute()了吗?你看到你在调用什么类型的对象了吗? -
我通过将查询连接到字符串来做错了?
-
嗯,通过将字符串粘贴在一起来构建 SQL 查询通常并不安全。您可能对 SQL 注入持开放态度(我不知道
sanitize()做了什么,但几乎可以肯定这是错误的事情。)但这不是问题所在。您要使用什么数据库 API?我在任何地方都看不到任何连接信息或适当的函数调用。字符串不能被执行;通常,您会将字符串传递给数据库连接对象的执行函数。 -
sanitize 是希望转义 html 实体的函数,我使用的是 PDO,我没有使用 oop,而是使用原始 php。这段代码在 mysqli 上运行良好,但我不知道如何用 pdo 处理它。我的连接是在 config.php 中设置的
-
不要转义 HTML 实体。那没有任何用处。为了防止 SQL 注入,您需要使用参数化查询(即准备语句,将参数绑定到它们,然后执行它们——请参阅stackoverflow.com/a/4364697/354577)。如果您使用 PDO,则需要一个 PDO 连接对象。你有吗?
标签: php