使用mySQL的PHP对象数组

使用mySQL的PHP对象数组,php,mysql,Php,Mysql,当对象属性来自mySQL查询时,有没有一种简单的方法可以在php中创建对象数组 下面是我的代码,以便向您展示我在做什么。我可能离这很远,因为我根本不习惯php,而且由于某种原因我不能掌握它 public function loadMeals(){ $stmt = $this->conn->prepare("SELECT id, dishName, ingredients FROM meals"); $stmt->execute(); $stmt-

当对象属性来自mySQL查询时,有没有一种简单的方法可以在php中创建对象数组

下面是我的代码,以便向您展示我在做什么。我可能离这很远,因为我根本不习惯php,而且由于某种原因我不能掌握它

    public function loadMeals(){
    $stmt = $this->conn->prepare("SELECT id, dishName, ingredients FROM meals");
    $stmt->execute();
    $stmt->bind_result($id, $dishName, $ingredients);
    $meals = array();
    while ($stmt->fetch()) {

        $this->id = $id;
        $this->dishName = $dishName;
        $this->ingredients = $ingredients;
        $meals[] = $this;
    } 
    return $meals;
}
请记住,这一切都是在课堂上进行的

谢谢各位

对于PDO:

public function loadMeals(){
    $stmt = $this->conn->prepare("SELECT id, dishName, ingredients FROM meals");
    $stmt->execute();
    $meals = array();
    while ($obj = $stmt->fetch(PDO::FETCH_OBJ)) {
        $meals[] = $obj;
    } 
    return $meals;
}

或$MEIN=$stmt->fetchObject'myMEIN',$ctor_args;请参阅PHP手册。还请注意这里的构造函数的第一个注释,以期待使用此结果可能导致的意外结果。

< P>这可能是解决问题的一个简短解决方案,但在从数据库中获取元素时,请考虑使用MyQuLyFutChysAsOC。

有关更多阅读和示例:

根据您如何使用它创建一个用餐对象数组,该方法应声明为静态方法,在不使用$this上下文的情况下调用。循环可以通过新的self创建用餐对象,并在附加到数组之前设置适当的属性

如果你仔细想想,这个方法的目的不是作用于一顿饭,所以它是静态的是有意义的

由于在没有$this上下文的情况下调用它,因此需要将MySQLi连接作为参数传递

public static function loadMeals($conn) {
    // Do the query/fetch like you already have
    // except that $conn is a local param, not a class prop.
    $stmt = $conn->prepare("SELECT id, dishName, ingredients FROM meals");
    $stmt->execute();
    $stmt->bind_result($id, $dishName, $ingredients);
    $meals = array();
    while ($stmt->fetch()) {
      // Create a new Meal object
      $meal = new self();
      // And set its properties
      $meal->id = $id;
      $meal->dishName = $dishName;
      $meal->ingredients = $ingredients;

      // Append it to the array
      $meals[] = $meal;
    }
    // Return it
    return $meals;
}
要在类外使用它,请执行以下操作:

// Call the function statically.
// You'll need to pass the database connection to it
$meals = Meal::loadMeals($conn);
我要指出的是,尽管养成做prepare/execute的习惯是非常好的,但实际上这里并不需要它,因为您没有向查询传递任何输入。您只需调用$conn->query,就可以消除MySQLi的bind_结果变量引用的复杂性

$result = $conn->query("SELECT id, dishName, ingredients FROM meals");
if ($result) {
  // Fetch and instantiate a Meal object in one go.
  while ($meal = $result->fetch_object('Meal')) {
     $meals[] = $meal;
  }
} 

这是MySQLi,不是PDO,OP打算返回fine对象,而不是泛型stdClass。@MichaelBerkowski没有注意到bind_结果。我的错误。你能发布来自Dine类的_构造吗?好的,谢谢-我想验证你的构造函数没有使用额外的参数,这样可以很容易地实例化Dine。为什么你推荐一个在你提供的链接中有一个巨大的弃用警告的函数?你可以回答的快速问题。我习惯于在类文件的开头列出属性,然后通常在构造函数中设置它们的其他语言。为什么至少在我们的示例中,这通常不是在php中完成的,为什么是self-preferred?@Requiem在php中也是如此,您可以在类的开头列出属性。但这是一种静态方法。它的工作是列出所有膳食,而不是对单个膳食对象执行操作,这需要实例化该对象并直接调用该对象上的方法。self关键字引用当前类的类名,因此它与该类上下文中的$MEIN=new MEIN相同。当然,还有其他方法可以使用工厂模式构建get all objects方法,例如,而不是在此方法中直接调用new MEIN。不过,这在OO设计中更深入。