Ассоциативный массив загружается из базы данных и отображается как «столбцы»

Я пытаюсь создать обзор свойств продукта для системы счетов. Пока что большинство вещей объединяется с использованием классов и PDO. У меня есть следующая проблема.

В моем классе я создал функцию, которая создает массив моих продуктов. Он загружает некоторую информацию из базы данных, чтобы построить этот массив. Этот массив я хочу использовать для отображения всех продуктов, которые я выбрал:

$prod1 - $prod1Name - $prod1Descr - $prod1Price
$prod2 - $prod2name - $prod2Descr - $prod2Price
и т. д.

Я решил, что ассоциативный массив поможет мне создать столбцы. Хотя проблема в том, что я немного не понимаю, как таким образом создавать несколько строк и столбцов. Я думал о чем-то вроде:
$prod[1]["name"] - $prod[1]["descr"] - и т.д.
Затем использовать это в foreach цикла, чтобы создать столько новых строк, сколько требуется. Единственное, что я мог придумать, это мой index.php (как показано ниже), потому что использование индекса (определение [1]), похоже, не работает так, как я думаю, это должно быть реализовано.

Насколько я понимаю, я присваиваю переменную в своем классе как массив, а затем переопределяю массив при загрузке информации из базы данных. Может ли кто-нибудь сказать мне, как я могу попытаться решить эту проблему?


У меня есть следующий класс:

    <?    
    class Invoice{

        var $vendorID;
        var $product = array();

            function product_array(){
                global $db;
                $query = $db->conn->prepare('
                SELECT ProductName, ProductDescription, ProductDuration, ProductPriceInclVat, ProductPriceExclVat, ProductVatType
                FROM products WHERE VendorID = :VendorID
                ');

                $array = array (
                    'VendorID' => $this->vendorID
                );

                $query->execute($array);

                $result = $query->fetchall();

                if (empty($result)){
                    echo"Could not find any products matching your criteria.";
                    die;
                } else {
                        foreach($result as $row) {
                            $this->product = array("Name" => $row['ProductName'],
                                                    "Description" => $row['ProductDescription'],
                                                    "Duration" => $row['ProductDuration'],
                                                    "PriceExclVat" => $row['ProductPriceExclVat'],
                                                    "PriceInclVat" => $row['ProductPriceInclVat'],
                                                    "VatType" => $row['ProductVatType']
                                                    );
                        }

                }       
            }
        }
?>

а затем у меня есть следующий код в моем index.php:

<?
$invoice = new Invoice();

foreach ($invoice->product as $key => $value){
    echo $key . "<br>";
    echo $value . "$value";

    echo "<br>";
}
?>

person Stefan Oostwegel    schedule 17.08.2014    source источник


Ответы (2)


Когда вы назначаете массивы результатов свойству продукта, вы каждый раз перезаписываете массив. Вместо этого вам нужно добавить в массив, например:

$this->product = array();
foreach($result as $row) {
    $this->product[] = array(...);
}

В качестве альтернативы вы можете просто присвоить результаты fetchAll свойству продукта, если вам не нужно переименовывать ключи полей (или вы можете присвоить им псевдоним в SQL).

person Jonathon    schedule 17.08.2014
comment
Благодарю за ваш ответ. Я изменил свой класс, как вы предложили. Поэтому я изменил свой index.php и добавил следующий код: 'foreach ($invoice->product[$row] as $key => $value){ echo $value; } ' Тем не менее, это дает мне ошибки, правильно ли я думаю? - person Stefan Oostwegel; 17.08.2014

$query = $db->conn->prepare('
                SELECT ProductName as Name,
                ProductDescription as Description, 
                ProductDuration as Duration, 
                ProductPriceInclVat as PriceInclVat, 
                ProductPriceExclVat as PriceExclVat, 
                ProductVatType as VatType
                FROM products WHERE VendorID = :VendorID
                ');

                $array = array (
                    'VendorID' => $this->vendorID
                );

                $query->execute($array);

                $product = $query->fetchall(PDO::FETCH_ASSOC);

$product теперь в нужном вам формате. После этого вы можете избежать цикла foreach в счете-фактуре класса. Еще я заметил, что вы создали функцию product_array(), которая не вызывается, поэтому в index.php вы получаете пустой массив (определенный в классе Invoice). Итак, в классе Invoice это должно быть

$product = product_array()

и функция product_array должна возвращать значение.

person undefined_variable    schedule 17.08.2014
comment
Спасибо за ваш комментарий. Я не думал о FETCH_ASSOC. product_array() устанавливается в конструкторе, я не хотел помещать сотни строк ненужного кода, извините за это. Итак, я изменил код, как вы описали, но это оставляет меня с проблемой, что я до сих пор не понимаю, как вызывать переменные в моем index.php для отображения результатов. Оба используют echo $invoice-›product[ProductDuration]; или foreachloop не работают. Любые предложения для меня? - person Stefan Oostwegel; 17.08.2014