【问题标题】:PHP-MySQLi OOP usage of fetch_object([ string $class_name = "stdClass" [, array $params ]])fetch_object([ string $class_name = "stdClass" [, array $params ]]) 的 PHP-MySQLi OOP 用法
【发布时间】:2015-08-10 09:53:39
【问题描述】:

在过去的几天里,我一直在用头撞到一堵相当坚硬的墙上,试图掌握 mysqli_result::fetch_object()

我想要做的是实例化一个基于预先编写的类的对象数组,该类包含我操作所需的方法。 够简单吗?当然,直到我尝试将构造函数参数传递给每个对象。

现在在单个实例中将参数传递给类的构造函数可以正常工作,如下所示:

<?php

 class classA {

  private $dbo;

  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }

  public function createObject() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` = 'value';");
   return $stmt->fetch_object('classB', array("A Parameter!"));
  }

 }

 class classB {
  private $param;

  function __construct($param) {
   $this->param = $param;
  }

  public function getParam() {
   return $this->param;
  }

 }

 $classA = new classA();
 echo $classA->createObject()->getParam(); //Returns "A Parameter!"
?>

但是,如果我要在结果集合上尝试此操作,则相同的参数将返回 '' 或 null,如下例所示:

<?php

 class classA {

  private $dbo;

  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }

  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();

   foreach($stmt as $result) {
    $myObjects[] = $result->fetch_object("classB", array("A Parameter!"));
   }

   return $myObjects;
  }

 }

 class classB {
  private $param;

  function __construct($param) {
   $this->param = $param;
  }

  public function getParam() {
   return $this->param;
  }

 }

 $classA = new classA();
 $i = 0;
 foreach($classA->createObjects() as $anObject) {
  echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns nothing?
  $i ++;
 }
?>

至少,它在我的机器上是这样的。

现在回答问题: 这是 mysqli_result::fetch_object() 的实际问题还是设计使然?

有没有办法达到类似的预期结果?

基本上我已经编写了一系列课程,这些课程现在取决于这个“错误”,我还有其他方法可以解决它,但它们不太理想,我宁愿接受挑战并学习一些东西。

感谢您的宝贵时间。

更新: 很有可能我的循环写错了,因为我刚刚测试过:

<?php

 class classA {

  private $dbo;

  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }

  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();

   if($result = $this->dbo->query("SELECT `column` FROM `table`;")) {
    while($row = $result->fetch_object("classB", array("A Parameter!"))) {
     $myObjects[] = $row;
    }
   }

   return $myObjects;
  }

 }

?>

看来我得到了结果,我明天会更深入地测试它。

【问题讨论】:

  • 你没有使用extends
  • extends 在这种情况下不是必需的,因为我没有扩展任何一个类,而是使用一个类来创建另一个类。
  • 感谢您的评论
  • mysqli_result::fetch_object -- mysqli_fetch_object -- 将结果集的当前行作为对象返回.. 试试看this
  • 对不起,我觉得我根本没有帮助你..

标签: php oop mysqli


【解决方案1】:

好吧,原来我只是个笨蛋,前面提到的循环是不正确的。

这是完整的工作示例:

<?php

 class classA {

  private $dbo;

  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }

  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();

   if($result = $this->dbo->query("SELECT `column` FROM `table`;")) {
    while($row = $result->fetch_object("classB", array("A Parameter!"))) {
     $myObjects[] = $row;
    }
   }
   return $myObjects;
  }

 }

 class classB {
  private $param;

  function __construct($param) {
   $this->param = $param;
  }

  public function getParam() {
   return $this->param;
  }

 }

 $classA = new classA();
 $i = 0;
 foreach($classA->createObjects() as $anObject) {
  echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns "object[x]:'A Parameter!'<br />"
  $i ++;
 }
?>

再次感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2015-05-05
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多