• Как сделать множественную выборку?

    @Chesterfield25 Автор вопроса
    Дмитрий, Если у меня запрос такого рода

    // выбираем все записи по странам где cp.country_id IN (1) это id страны
        $query = "SELECT p.name, p.id 
        FROM products AS p
        LEFT JOIN product_country AS cp 
        ON cp.product_id = p.id 
        WHERE cp.country_id IN (1)";


    или такого

    // выбираем все записи по странам где cp.country_id IN (2) это id страны
        $query = "SELECT p.name, p.id 
        FROM products AS p
        LEFT JOIN product_country AS cp 
        ON cp.product_id = p.id 
        WHERE cp.country_id IN (2)";


    То выбирает все записи по стране где cp.country_id IN (2) это id страны

    А если запрос такого рода

    // выбираем все записи по странам где cp.country_id IN (2) это id страны
        $query = "SELECT p.name, p.id 
        FROM products AS p
        LEFT JOIN product_countryNj  AS cp 
        ON cp.product_id = p.id 
        WHERE cp.country_id IN (1,2)";


    То выбирает не просто все записи а дублирует их как в таблице product_country
    Товар 1 и товар 3 выводит по два раза.
    631a3d2423835260648990.png
    631a3daf6883e916152778.png

    Если взять такое условие то выводятся всего три товар то есть либо у которых country_id=1 или country_id=2
    WHERE cp.country_id IN (1 || 2)";
    А вот условие ниже работает по какой то причине точно так же как и то что выше, а должно выводить товары у которых и country_id=1 и country_id=2
    WHERE cp.country_id IN (1 && 2)";
  • Как сделать множественную выборку?

    @Chesterfield25 Автор вопроса
    Дмитрий, При переходе по ссылке /api/products/readAllCountry.php?country_id=1
    Получить товары у которых в product_country на против в таблице country_id=1
    631a1a9e59c3e133096989.png

    А по ссылке /api/products/readAllCountry.php вывести только те товары у которых есть напротив в таблице и country_id=1 и country_id=2 то есть все города.

    Исходя из таблицы product_country выше если переход на страницу /api/products/readAllCountry.php должен вывестись только товар с id 1 так как этот товар продается во всех странах в данном случае в двух. А перейдя по ссылке /api/products/readAllCountry.php?country_id=1 я должен получить уже два товара с id=1 и 2
  • Как сделать множественную выборку?

    @Chesterfield25 Автор вопроса
    Дмитрий, 1 продукт привязан к двум странам а 2 к одной
    В файле readAllCountry.php
    Добавил строку
    $product->country_id = isset($_GET["country_id"]) ? $_GET["country_id"] : die();

    И при переходе по ссылке /api/products/readAllCountry.php?country_id=1 и по ссылке /api/products/readAllCountry.php?country_id=2
    Я получаю один и тот же результат
  • Как сделать множественную выборку?

    @Chesterfield25 Автор вопроса
    Создал такую функцию

    // метод readCountryIdAll() - получение абсолютно всех товаров которы продаются во всех странах
       function readCountryIdAll() {
    
        // выбираем все записи
        $query = "select 
        country.* ,
       products.*
    from country
    join product_country on country.id = product_country.country_id
    join products on products.id = product_country.product_id";
    
        // подготовка запроса
        $stmt = $this->conn->prepare($query);
    
        // выполняем запрос
        $stmt->execute();
    
        return $stmt;
    }


    В файле readAllCountry.php вывожу в JSON формате. То если я перехожу по ссылке /api/products/readAllCountry.php получаю два раза один и тот же продукт c id1 и один продукт с id2. Всего в бд 2 продукта

    <?php
    // необходимые HTTP-заголовки
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    
    // подключение базы данных и файл, содержащий объекты
    include_once "../config/database.php";
    include_once "../models/products.php";
    
    // получаем соединение с базой данных
    $database = new Database();
    $db = $database->getConnection();
    
    // инициализируем объект
    $product = new Product($db);
     
    // запрашиваем товары
    $stmt = $product->readCountryIdAll();
    $num = $stmt->rowCount();
    
    // проверка, найдено ли больше 0 записей
    if ($num>0) {
    
        // массив товаров
        $products_arr = array();
        $products_arr["records"] = array();
    
        // получаем содержимое нашей таблицы
        // fetch() быстрее, чем fetchAll()
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    
            // извлекаем строку
            extract($row);
    
            $product_item = array(
                "id" => $id,
                "name" => $name,
                "description" => html_entity_decode($description),
                "price" => $price,
                "subcategory_id" => $subcategory_id,
                "subcategory_name" => $subcategory_name
            );
    
            array_push($products_arr["records"], $product_item);
        }
    
        // устанавливаем код ответа - 200 OK
        http_response_code(200);
    
        // выводим данные о товаре в формате JSON
        echo json_encode($products_arr);
    } else {
    
        // установим код ответа - 404 Не найдено
        http_response_code(404);
    
        // сообщаем пользователю, что товары не найдены
        echo json_encode(array("message" => "Товары не найдены."), JSON_UNESCAPED_UNICODE);
    }


    Только у него разные подкатегории и цены

    {"records":[
    {"id":"1",
    "name":"Sony Noise Cancelling Headphones WHCH710N: Wireless Bluetooth Over the Ear Headset with Mic for Phone-Call, Black","description":"Sony Noise Cancelling Headphones WHCH710N: Wireless Bluetooth Over the Ear Headset with Mic for Phone-Call, Black","price":"98","subcategory_id":"1","subcategory_name":null},
    {"id":"1",
    "name":"Sony Noise Cancelling Headphones WHCH710N: Wireless Bluetooth Over the Ear Headset with Mic for Phone-Call, Black","description":"Sony Noise Cancelling Headphones WHCH710N: Wireless Bluetooth Over the Ear Headset with Mic for Phone-Call, Black","price":"98","subcategory_id":"1","subcategory_name":null},
    {"id":"2",
    "name":"PlexDisc DVD-R 4.7GB 16x Branded Logo Recordable Media Disc - 100 Disc (no Container) FFP 632-817-BX","description":"PlexDisc DVD-R 4.7GB 16x Branded Logo Recordable Media Disc - 100 Disc (no Container) FFP 632-817-BX","price":"21","subcategory_id":"2","subcategory_name":null}]}
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Одиночка Айс, Так какой вариант лучше подойдет для моего решения?
    63186894e921d099128023.png

    У меня есть таблица с странами далее таблица разделов, категорий относящихся к определенным разделам, подкатегорий относящихся к определенным категориям и таблица продуктов которая относится к определенной подкатегорие и одной, нескольким или всем странам. Для реализации изначально поставленного вопроса подойдет products_countries (product_id, country_id) данное решение. Ну как быть если после того как пользователь выберет определенную страну, в ней выводить не все разделы, категории и подкатегории а только те в которых есть продукты относящиеся к выбранной стране?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Женя Ренессанс, А если нужно что бы и страна имела много продуктов и продукт имел много стран, в некоторых случаях это может быть и одна страна а в некоторых и все которые я укажу. Как тогда структурировать бд?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    SagePtr, Правильно я понял?

    CREATE TABLE IF NOT EXISTS `product_country` (
        `product_id` int(11) NOT NULL,
        `country_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_shop` (
        `product_id` int(11) NOT NULL,
        `shop_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_section` (
        `product_id` int(11) NOT NULL,
        `section_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_category` (
        `product_id` int(11) NOT NULL,
        `category_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_subcategory` (
        `product_id` int(11) NOT NULL,
        `subcategory_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;


    А у таблицы products удалить shop_id, country_id и subcategory_id?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Женя Ренессанс, Правильно я понял?

    CREATE TABLE IF NOT EXISTS `product_country` (
        `product_id` int(11) NOT NULL,
        `country_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_shop` (
        `product_id` int(11) NOT NULL,
        `shop_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_section` (
        `product_id` int(11) NOT NULL,
        `section_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_category` (
        `product_id` int(11) NOT NULL,
        `category_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
    
    CREATE TABLE IF NOT EXISTS `product_subcategory` (
        `product_id` int(11) NOT NULL,
        `subcategory_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;


    А у таблицы products удалить shop_id, country_id и subcategory_id?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Женя Ренессанс, В примере выше что именно используется OneToMany - один ко многим или ManyToMany - многие ко многим?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Женя Ренессанс, Спасибо не заметил. Может в таком случае имеет смысл создать таблицу не products_countries (product_id, country_id) а таблицу
    products_countries_categories (product_id, country_id, categry_id,)
    Что бы можно было выводить не все категории если пользователь выберет определенную страну а только те категории в которых есть товары которые относятся к указанной стране?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Rsa97, Может в таком случае имеет смысл создать таблицу не products_countries (product_id, country_id) а таблицу
    products_countries_categories (product_id, country_id, categry_id,)
    Что бы можно было выводить не все категории если пользователь выберет определенную страну а только те категории в которых есть товары которые относятся к указанной стране?
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    Если правильно понимаю вот примерно то что мне нужно

    1. База стран
    CREATE TABLE IF NOT EXISTS `country` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


    2. База магазинов
    CREATE TABLE IF NOT EXISTS `shop` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


    3. База product_id и country_id
    CREATE TABLE IF NOT EXISTS `product_coutry` (
        `product_id` varchar(256) NOT NULL,
        `country_id` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;


    4. База разделов товаров
    CREATE TABLE IF NOT EXISTS `sections` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


    5. База категорий товаров, категория принадлежит определенному разделу
    CREATE TABLE IF NOT EXISTS `categories` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        `section_id` int(11) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


    6. База подкатегорий товаров, подкатегория принадлежит определенной категорие
    CREATE TABLE IF NOT EXISTS `subcategory` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        `category_id` int(11) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


    7. База товаров
    CREATE TABLE IF NOT EXISTS `products` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(256) NOT NULL,
        `description` varchar(256) NOT NULL,
        `url` varchar(256) NOT NULL,
        `price` double NOT NULL,
        `shop_id` int(11) NOT NULL,
        `created` datetime NOT NULL,
        `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  • Как структурировать бд?

    @Chesterfield25 Автор вопроса
    В таком случае столбец в products с названием id_country не нужно создавать?
  • Почему не подгружаются стили?

    @Chesterfield25 Автор вопроса
    Убрал точки но проблема осталась. Плюс ко всему если просто открыть страницу signup.php то данной проблемы нету
  • Почему не могу создать регистрацию?

    @Chesterfield25 Автор вопроса
    Ипатьев, а с чего вы взяли что я вызываю на прямую а не через форму? У меня есть форма.
  • Почему не могу создать регистрацию?

    @Chesterfield25 Автор вопроса
    Потом другая проблема появляется
    [06-Sep-2022 05:15:00 UTC] PHP Notice:  Undefined index: username in /home/patedfrb/public_html/affiliateproduct/do_register.php on line 7
    [06-Sep-2022 05:15:00 UTC] PHP Notice:  Undefined index: username in /home/patedfrb/public_html/affiliateproduct/do_register.php on line 17
    [06-Sep-2022 05:15:00 UTC] PHP Fatal error:  Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'username' cannot be null in /home/patedfrb/public_html/affiliateproduct/do_register.php:18
    Stack trace:
    #0 /home/patedfrb/public_html/affiliateproduct/do_register.php(18): PDOStatement->execute(Array)
    #1 {main}
      thrown in /home/patedfrb/public_html/affiliateproduct/do_register.php on line 18


    do_register.php

    <?php
    
    require_once __DIR__.'/boot.php';
    
    // Проверим, не занято ли имя пользователя
    $stmt = pdo()->prepare("SELECT * FROM `admin` WHERE `username` = :username");
    $stmt->execute(['username' => $_POST['username']]);
    if ($stmt->rowCount() > 0) {
        flash('Это имя пользователя уже занято.');
        header('Location: /'); // Возврат на форму регистрации
        die; // Остановка выполнения скрипта
    }
    
    // Добавим пользователя в базу
    $stmt = pdo()->prepare("INSERT INTO `admin` (`username`, `password`) VALUES (:username, :password)");
    $stmt->execute([
        'username' => $_POST['username'],
        'password' => password_hash($_POST['password'], PASSWORD_DEFAULT),
    ]);
    
    header('Location: login.php');
  • Как открыть ссылку в фрейме?

    @Chesterfield25 Автор вопроса
    А можно сделать так что бы ссылка открывалась не во фрейме а в том же окне только в определенном контейнере?

    <div class="container w-100 p-3">
    
            <div class="row justify-content-center">
                <div class="col-4">col-4</div>
                <div class="col-8">
                    
                    <form class="row justify-content-center">
                        <div class="col-8">
                          <label for="inputPassword2" class="visually-hidden">URL</label>
                          <input type="text" class="form-control" id="inputUrl" placeholder="Url">
                        </div>
                        <div class="col-auto">
                          <button type="submit" class="btn btn-primary mb-3">Open</button>
                        </div>
                    </form>
    
                </div>
            </div>
        </div>


    А конкретно в контейнере <div class="col-8">
  • Как сделать итерацию массива?

    @Chesterfield25 Автор вопроса
    Молодец. Только данный комментарий к сути вопроса отношения не имеет никакого.
  • Как получить все значения элементов массива?

    @Chesterfield25 Автор вопроса
    Araya, учусь поэтому и спрашиваю. Когда пойму что где и зачем оно там нужно, перестану.
  • Как получить все значения элементов массива?

    @Chesterfield25 Автор вопроса
    Алан Гибизов,

    public class MaxArrayValue {
      int[] numbers = {1, 7, 5, 2, 4};
      public static int getMaxNumber(int[] numbers) {
        //Write code below this line
        int max = 1;
        for(int i = 0; i < numbers.length; i++) {
          System.out.println(numbers[i]);
        }
        return numbers[i];
      }
    }


    но таким образом в i я получаю индекс массива