未捕获错误:调用数组上的成员函数function()

时间:2017-05-14 04:21:45

标签: php

我有一个php / oop的问题,因为在调用对象的方法时我得到了这个错误:"未捕获错误:在E:\ xampp中的数组中调用成员函数obtener_nombre() \ htdocs \ hackatonphp \ App \ RepositoryProducts .php:79"这是代码

实例化对象的类

<?php 

class Producto {

    private $nombre;
    private $precio;
    private $categoria;

    //Constructor
    public function __construct($nombre,$precio,$categoria){
        $this -> nombre = $nombre;
        $this -> precio = $precio;
        $this -> categoria = $categoria;
    }

    //Setters
    public function definir_nombre($nombre){
        $this -> nombre = $nombre;
    }

    public function definir_precio($precio){
        $this -> precio = $precio;
    }

    public function definir_categoria($categoria){
        $this -> categoria = $categoria;
    }

    //Getters
    public function obtener_nombre(){
        return $this -> nombre;
    }

    public function obtener_precio(){
        return $this -> precio;
    }

    public function obtener_categoria(){
        return $this -> categoria;
    }
}

显示productos的代码

        public function obtener_productos($conexion,$categoria){

        $productos = array();

        if (isset($conexion)) {
            try {
                $sql = 'SELECT * FROM productos WHERE categoria = :categoria';

                $sentencia = $conexion -> prepare($sql);

                $sentencia -> bindParam(':categoria', $categoria);

                $sentencia -> execute();

                $productos = $sentencia -> fetchAll();

                foreach ($productos as $producto) {
                    $productos[] = new Producto($producto['nombre'],$producto['precio'],$producto['categoria']);
                }
            } catch (PDOException $ex) {
                print 'ERROR' . $ex->getMessage();
            }
        }

        return $productos;
    }

     public static function mostrar_productos($categoria) {
        Conexion::abrir_conexion();
        $productos = self::obtener_productos(Conexion::obtener_conexion(),$categoria);
        Conexion::cerrar_conexion();
        if (count($productos)) {

            foreach ($productos as $producto) {
                self::escribir_producto($producto);
            }
        }
    }

    public static function escribir_producto($producto) {
        if (!isset($producto)) {
            return;
        } else {
        ?>
            <div class='columns'>
                <!-- Inicio de la presentación -->
                <div class='card h1-strong column is-one-third'>
                    <a href='#'>
                        <center>
                            <img class='img-index' src='Vendor/img/higiene.png'>
                            <h1 style='font-size: 3em;'><?php $producto -> obtener_nombre(); ?></h1>
                            <h3 style='font-size: 2em;'><?php $producto -> obtener_precio(); ?></h3>
                        </center>
                        <br>
                    </a>
                </div>
                <!-- Fin de la presentación -->
            </div>
        <?php
        }
    }`

实施:

<!-- Linea de opciones -->

<?php

    RepositorioProductos::mostrar_productos("comida");

?>

1 个答案:

答案 0 :(得分:0)

问题是obtener_productos()正在为$prodctos返回的数组和它返回的fetchAll()数组使用变量Producto。因此,它返回的数组元素包含数据库中的行(它们是关联数组)和对象。

使用不同的变量。

public function obtener_productos($conexion,$categoria){

    $productos = array();

    if (isset($conexion)) {
        $productos = array();
        try {
            $sql = 'SELECT * FROM productos WHERE categoria = :categoria';
            $sentencia = $conexion -> prepare($sql);
            $sentencia -> bindParam(':categoria', $categoria);
            $sentencia -> execute();
            $results = $sentencia -> fetchAll();
            foreach ($results as $producto) {
                $productos[] = new Producto($producto['nombre'],$producto['precio'],$producto['categoria']);
            }
        } catch (PDOException $ex) {
            print 'ERROR' . $ex->getMessage();
        }
    }

    return $productos;
}