【问题标题】:Uncaught Error: Call to a member function execute() on string未捕获的错误:调用字符串上的成员函数 execute()
【发布时间】: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,我设法通过以下方式解决了我的全部问题:

  1. 确保我的 PDO 对象正在准备语句
  2. 绑定所有参数(在查询语句中转义有变量)


  $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


【解决方案1】:

string 是 PHP 中的原始类型,根本不公开任何方法,因此在 string 上调用 execute() 会使 PHP 感到困惑,因为您试图将其用作类实例。

您似乎也在尝试执行 SQL 查询,这意味着您需要获取刚刚在 $sql 中构建的 SQL 查询并使用您的数据库驱动程序执行它。

如果是 PDO,可能如下所示:

$sql = "SELECT * FROM products";
// ...
$pdo->query($sql);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多