【问题标题】:PDO expeced array not returning only a boolean of 1 on webpagePDO 预期数组在网页上仅返回布尔值 1
【发布时间】:2019-03-07 15:14:39
【问题描述】:

我正在创建一个内容类,它将通过 PDO 从数据库中提取所有内容,然后通过将结果转换为对象的方法运行结果,然后循环遍历对象,并将对象回显到网页的特定模块。

预期结果

当类被激活时,将通过 PDO 创建一个实例,该实例将从 mysql 数据库中检索所需的数据。然后此信息将回显并显示在网页上。

发生了什么

我最终没有错误,并且内容应该是布尔数字“1”。起初我以为这是一个 sql 错误。如果我使用 print_r($query_result),我会得到相同的结果“1”。请参阅下面的测试。

我的课程代码如下

    <?php


    class Content {

    // --- START OF ACTIVE RECORD CODE ---

    public $n_id; 
    public $n_name; 
    public $n_text; 
    public $n_photo; 

    // Instantiating a STATIC Database Connection for the class to use
    static protected $dbconnect;

    static public function database($dbconnect) {
      self::$dbconnect = $dbconnect;
    }
    // constructing arguments

    public function __construct($args=[]) {

      $this->n_id = $args['n_id'] ?? '';
      $this->n_name = $args['n_name'] ?? '';
      $this->n_text = $args['n_text'] ?? '';
      $this->n_photo = $args['n_photo'] ?? '';
    }

    // Multi use method to pass in sql that will execute the PDO only two parameters are bound ID and contentText.
    static public function find_by_sql($sql) {

    // -------------BEGIN PDO-----------

    // preparing PDO by loading sql, calling db connection, and storing in variable $stmt

      $stmt = self::$dbconnect->prepare($sql);
      // Binding Parameters for sql
      $stmt->bindParam(':nid', $n_id,  PDO::PARAM_INT);
      $stmt->bindParam(':nall', $n_name,  PDO::PARAM_STR);
      $stmt->bindParam(':ntext', $n_text,  PDO::PARAM_STR);
      $stmt->bindParam(':nphoto', $n_photo,  PDO::PARAM_INT);
      // executing $stmt PDO and storing the result in $stmt
      $query_result = $stmt->execute();
      return $query_result;
      // clearing the PDO after information is stored in $record
      $stmt->closeCursor();


    // ------------END PDO ----------

      // Checking to see if a result exist. If nop result is stored in $stmt, then it will echo "Database query failed."
      if(!$query_result) {
        exit("Query doesn't exist.");
      }
    // -------- BEGIN TURNING RESULTS INTO OBJECTS --------
    $object_array = [];

      // The result $stmt will be stored in the variable $record

      while($record = $query_result->fetchAll()) {

        // Taking $record and passing it to the static method instantiate() - see below. This method will return the $object_array.

        $object_array[] = self::instantiate($record);

    }

        return $object_array;

    // ------------ END TURNING RESULTS INTO OBJECTS --------

    }
    // method to test passing $sql to method find_all_sql();

    static public function find_all(){

      $sql = "SELECT * FROM nmain WHERE nid = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto";
        return self::find_by_sql($sql);

    }

    // --- BEGIN INSTANTIATE METHOD TO CREATE OBJECTS ---

    static protected function instantiate($record) {
      $object = new self;
      // Auto assign values
      foreach($record as $property =>  $value) {
        if(property_exists($object, $property)){
          $object->$property = $value;
        }
      }
      return $object;
      }
    // ----- END INSTANTIATE OF RECORD TO CREATE OBJECTS ---

    // ---END OF ACTIVE RECORD CODE---

    }

    ?>

**On my html webpage:**

        $contents = Content::find_all();
         foreach ((array) $contents as $content) {
       echo $content;
     }

我测试过的内容

这是我运行 var_dump($stmt); 时得到的输出

object(PDOStatement)#3 (1) { ["queryString"]=> string(119) "SELECT * FROM ndb WHERE id = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto" }

如果我复制查询并将其粘贴到 myphpadmin 中,查询将运行绑定参数。

这是我运行 var_dump($query_result) 时的输出:

 bool(true) if I use print_r($query_result) I get "1"

这通过了我的 if(!$query_result) 测试

如果我运行 var_dump($record) 或 var_dump($query_result) 我什么也得不到。好像$query_result,因为是bool,没有数组传给$record。所以也没有什么可以转换成对象的。我这里一头雾水。是我的 PDO 绑定吗?

【问题讨论】:

  • 看起来你过早地从你的函数中返回。您的 find_by_sql() 函数中有 return $query_result;,但是在您的 return 语句之后有代码。
  • 另外,你需要获取并返回一行数据,而不是pdo语句。 $row = $query_result-&gt;fetch(PDO::FETCH_ASSOC); return $row;
  • 我正在尝试将 PDO $stmt 的结果存储在新变量 $query_result 中。如果我不返回 $query_result,那么我最终会在布尔值上调用成员函数 fetchAll()。我应该从哪里返回函数?
  • 这不是我在循环中“while($record = $query_result->fetchAll())”所做的吗?
  • 如果我将类剥离为 pdo,我仍然会得到一个布尔错误。

标签: php mysql sql pdo boolean


【解决方案1】:

您的 fetch 应该在语句上,而不是执行的结果(这只是说执行成功或失败),fetchAll 也将尝试返回所有记录,您最可能想要的是 @987654322 @ 一次处理 1 条记录。所以你应该有类似...

while($record = $stmt->fetch()) {

您现在可以删除更早的 return,它正在停止进一步处理。

【讨论】:

  • 感谢您的回复。问题仍然是 PDO 的布尔返回“致命错误:未捕获的错误:在布尔值上调用成员函数 fetch()”
  • 刚刚注意到您通常不需要的$stmt-&gt;closeCursor();。所以试着把它注释掉。
  • 还是没有变化。
猜你喜欢
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2021-09-24
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多