Задать вопрос
Qairat
@Qairat
frontend developer, angular 2+

Как написать правильный объединенный mysql код для php?

День добрый.
Не могу исправить ошибку. Хочу чтобы этот код заработала и все.
public static function getProductsList()
{
    $db = Db::getConnection();

    $result = $db->query('SELECT "p.id", "p.name", "c.name", "p.price", "p.code" FROM product as p, category as c WHERE "c.id" = "p.category_id"');
    $productsList = array();
    $i = 0;
    while ($row = $result->fetch()) {
        $productsList[$i]['p.id'] = $row['p.id'];
        $productsList[$i]['p.name'] = $row['p.name'];
        $productsList[$i]['c.name'] = $row['c.name'];
        $productsList[$i]['p.code'] = $row['c.code'];
        $productsList[$i]['p.category_id'] = $row['c.category_id'];
        $productsList[$i]['p.price'] = $row['c.price'];
        $i++;
    }
return $productsList;
}

Таким образом хочу брать все значения которые мне нужны и показать через php код, Но не работает.
<?php foreach ($productsList as $product): ?>
                        <tr>
                            <td><?php echo $product['p.id']; ?></td>
                            <td><?php echo $product['p.code']; ?></td>
                            <td><?php echo $product['p.name']; ?></td>
                            <td><?php echo $product['c.name']; ?></td>
                            <td><?php echo $product['p.category_id']; ?></td>  
                            <td><?php echo $product['p.price']; ?></td>  
                        </tr>
                    <?php endforeach; ?>

Попробовал все эти скобки: `p.id`, "p.id", 'p.id'. Ничего не помогает. Как будет правильнее?
  • Вопрос задан
  • 224 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Сколько бесполезных манипуляций.
public static function getProductsList()
{
    $query = "select p.id, ...";
    return Db::getConnection()->query($query);
}

И mysqli и PDO для объекта результата давным давно предоставляют traversable. А плоский массив при необходимости многократно обходить результат получается элементарным fetchAll() без этой простыни.

<?php foreach ($productsList as $product): ?>
     <tr>
         <td><?=$product['id']; ?></td>
     </tr>
<?php endforeach; ?>

Если бы вы действительно делали var_dump, то уже давно бы заметили, что алиас таблицы ни PDO ни mysqli в результат не предоставляют. Только имена самих полей или алиасы этих полей.

Ну, это если считать, что PDO::ATTR_DEFAULT_FETCH_MODE у вас установлен в PDO::FETCH_ASSOC или хотя бы в дурацкий дефолтный PDO::FETCH_BOTH.

В любом случае у вас выключено отображение ошибок. Переключите error_reporting в нормальный девелоперский E_ALL.
Ответ написан
xpert13
@xpert13
Full Stack Developer
$result = $db->query('SELECT p.id, p.name, c.name, p.price, p.code FROM product as p, category_id as c WHERE c.id = p.category_id');
...


А вообще у вас запрос по всей видимости неверный. На сколько я понимаю вам нужно выводить список продуктов вместе с именем категории в которой они находятся, тогда нужно делать JOIN, скорее всего что-то типа:

$result = $db->query('SELECT p.id, p.name, c.name, p.price, p.code FROM product as p LEFT JOIN category as c ON p.category_id = c.id');
...


Возможно ошибся в названии таблицы категории, она у вас вообще почему-то называется category_id

А еще у вас эта строка не будет работать, потому что в селекте нету c.category_id:
$productsList[$i]['p.category_id'] = $row['c.category_id'];
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы