php - вернуть несколько значений из mysql

Я имею дело с соединительной таблицей для отношений "многие ко многим" между продуктами и категориями. С помощью этой конкретной функции я пытаюсь взять переменную product_ID и получить все связанные имена категорий в массиве. Однако при текущей настройке я получаю только одну категорию для каждого идентификатора продукта, когда я знаю, что у нескольких из них 2. Есть мысли? Также кто-нибудь знает хорошее простое решение для более визуального отслеживания отношений M2M в mysql?


    //INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES
    function productcat($pid) {
        global $sql;
        $query = "SELECT * FROM Product_Category WHERE Product_ID = '$pid'";
        $result = mysqli_query($sql, $query);
        $catidarray = array();
        while($row = mysqli_fetch_array($result)) {
                array_push($catidarray, $row['Category_ID']);
        }

        foreach($catidarray as $i) {
            $query = "SELECT * FROM Categories WHERE Category_ID = '$i'";
            $result = mysqli_query($sql, $query);
            $namearray = array();
            while($row = mysqli_fetch_array($result)) {
                array_push($namearray, $row['Name']);
            }

        }

        return $namearray;
    }


person Dustin Maxey    schedule 15.02.2014    source источник
comment
у вас есть таблица product и таблица category как много ко многим? тогда сколько таблиц он содержит в вашей базе данных по отношению к этим таблицам?   -  person Vainglory07    schedule 15.02.2014
comment
Вы также можете показать структуру таблицы?   -  person Vainglory07    schedule 15.02.2014
comment
Я новичок в php и mysql. Но моя настройка таблицы довольно проста, у меня есть: Категории: с Category_ID и несколькими другими полями Продукты: с Product_ID и несколькими другими полями Product_Category (Junction Table) с Product_Category_ID и Product_ID / Category_ID, индексирующие эти поля в соответствующих таблицах Product и Category   -  person Dustin Maxey    schedule 15.02.2014
comment
у вас Product_Category_ID автоматическое приращение?   -  person Vainglory07    schedule 15.02.2014
comment
Все правильно, все основные идентификаторы таблиц - это AI.   -  person Dustin Maxey    schedule 15.02.2014


Ответы (1)


Что-то не так с вашей функцией.

Во втором цикле foreach вы помещаете переменную $ namearray внутрь цикла, который при каждом запуске сбрасывает свое значение в пустой массив $ namearray = array ();. Просто поместите это за пределы foreach:

//--> put it here
$namearray = array();
foreach($catidarray as $i) {
    $query = "SELECT * FROM Categories WHERE Category_ID = '$i'";
    $result = mysqli_query($sql, $query);

    while($row = mysqli_fetch_array($result)) {
        array_push($namearray, $row['Name']);
    }
}

И я просто хочу сделать несколько предложений по вашей функции. Поскольку у вас есть junction table, вам действительно не нужно иметь отдельный запрос для product и category, чтобы получить желаемые значения из этих таблиц.

Просто выполните INNER JOIN, чтобы максимально использовать отношения таблиц.

Используйте свою соединительную таблицу Product_Category, потому что это настоящая цель, для которой она была создана.

SELECT *
FROM Product_Category AS a
INNER JOIN Category AS b
ON a.Category_ID = b.Category_ID
WHERE Product_ID = $pid

В своей функции вы можете попробовать следующее: не тестировал, но надеюсь, что это даст вам представление.

//INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES
function productcat($pid) {
    global $sql;
    $query = "SELECT *
              FROM Product_Category as a
              INNER JOIN Category as b
              ON a.Category_ID = b.Category_ID
              WHERE Product_ID = {$pid}";
    $result = mysqli_query($sql, $query);
    $namearray = array();
    while($row = mysqli_fetch_array($result)) {
            array_push($catidarray, $row['Name']);
    }
    return $namearray;
}

Тогда все :)

И, кстати, в последней версии php функции mysql_ уже устарели. Намного лучше, если вы собираетесь использовать PDO или MySQLi. Также проверьте это: PDO против MySQLi

person Vainglory07    schedule 15.02.2014