• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Podawanie do danego produktu więcej kategorii

Object Storage Arubacloud
0 głosów
115 wizyt
pytanie zadane 29 kwietnia 2023 w PHP przez MisticVoid Początkujący (490 p.)

Dzień dobry. Mam mały problem a brzmi on następująco próbuję dodać do tabeli kategoria_produkt dane produktu oraz n kategorii które zostały zaznaczone w checkboxach. Problem jest taki że serwer zwraca taki błąd: 


"Fatal error: Uncaught mysqli_sql_exception: Cannot add or update a child row: a foreign key constraint fails (`baza_sklep`.`category_product`, CONSTRAINT `category_product_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `produkty` (`product_id`) ON DELETE CASCADE ON UPDATE CASCADE) in..."

mam w bazie stworzone trzy tabele (porodukt (z kluczem podstawowym "produkt_id"), categoria (z kluczem podstawowym kategoria_id) oraz tabele która je łączy produkt_categoria za pomocą produkt_id, kategoria_id). Rekacje w obu są ON DELETE: CASCADE i ON UPDATE: CASCADE a to kod php 
 

formularz: 

            <div class="add-new-product">
                <h1>Dodawanie kategorii do produktu</h1><br>
                <form method="POST">
                    <select name="select" id="">
                    <?php @include 'includes/select_all_products.php';
                        if($results->num_rows > 0) { ?>
                            <?php while ($row1 = $results->fetch_assoc()){ ?>
                                <option name="option" value="<?php echo $row1['product_id']; ?>"><?php echo $row1['product_name']; ?></option>
                            <?php } ?>
                        <?php } ?>
                    </select><br><br>
                        
                        
                    <?php @include 'includes/category_change.php'; if($result->num_rows > 0) { ?>
                        <?php while ($row = $result->fetch_assoc()){?>
                            <p><input type="checkbox" name="category[]" value="<?php echo $row['category_id'];?>"> <?php echo $row['category_name']; ?> </p> 
                        <?php } ?>
                    <?php } ?>
                    <input type="submit" name="submitCat" value="Wyślij">
                </form>
            </div>

select_all_products.php:


    @include 'includes/connect.php';
    $query = "SELECT * FROM produkty";
    $results = $connect->query($query);

category_change.php:

    @include 'includes/connect.php';

    // category query
    $cat_query = "SELECT * FROM category";
    $result = $connect->query($cat_query);

    $value = $_POST['option'];

    if (isset($_POST['submitCat'])) {
    $query="INSERT INTO category_product(product_id, category_id) VALUES ";
        foreach ($_POST['category'] as $kategoria_id) {
            $query .="('$value','".$kategoria_id."'),";
        }
        $query = rtrim($query, ",");

    $connect->query($query);
    }

Z góry dziękuję za pomocsmiley

komentarz 29 kwietnia 2023 przez VBService Ekspert (252,660 p.)
edycja 29 kwietnia 2023 przez VBService

BTW, pierwsze co widzę to

$value = $_POST['option'];

powinno być w if-ie

if (isset($_POST['submitCat'])) {
    $value = $_POST['option'];
    $query="INSERT INTO category_product(product_id, category_id) VALUES ";
    foreach ($_POST['category'] as $kategoria_id) {
        $query .="('$value','".$kategoria_id."'),";
    }
    $query = rtrim($query, ",");
 
    $connect->query($query);
}

 

nie lepiej oddzielić też

@include 'includes/connect.php';
 
// category query
$cat_query = "SELECT * FROM category";
$result = $connect->query($cat_query);

do np. select_all_categories.php

komentarz 29 kwietnia 2023 przez VBService Ekspert (252,660 p.)
edycja 30 kwietnia 2023 przez VBService

@MisticVoid, piszesz

produkt_categoria za pomocą produkt_id, kategoria_id)

a w kodzie masz

 INSERT INTO category_product(product_id, category_id)

 

no i mieszasz w nazwach tabel i kolumn w bazie danych angielskie nazewnictwo z polskim, to samo przy nazwach zmiennych w php.

1 odpowiedź

0 głosów
odpowiedź 30 kwietnia 2023 przez VBService Ekspert (252,660 p.)
edycja 30 kwietnia 2023 przez VBService

Hipotetyczny wygląd Twojego formularza

<?php
    if (isset($_POST['submitCat'])) {

        var_dump($_POST);

    }
?>
<div class="add-new-product">
    <h1>Dodawanie kategorii do produktu</h1><br>
    <form method="POST">
        <select name="select" id="">
            <option name="option" value="1">Produkt-1</option>
            <option name="option" value="2">Produkt-2</option>
            <option name="option" value="3">Produkt-3</option>
            <option name="option" value="4">Produkt-4</option>
        </select><br><br>
             
        <p><input type="checkbox" name="category[]" value="1">Kategoria-1</p> 
        <p><input type="checkbox" name="category[]" value="2">Kategoria-2</p> 
        <p><input type="checkbox" name="category[]" value="3">Kategoria-3</p>
        <p><input type="checkbox" name="category[]" value="4">Kategoria-4</p>
        <p><input type="checkbox" name="category[]" value="5">Kategoria-5</p>

        <input type="submit" name="submitCat" value="Wyślij">
    </form>
</div>

zaznacz dane w formularzu i sprawdź co otrzymasz

 

Umieszczenie w zapisie kodu

$value = $_POST['option'];

powinno pokazać błąd np.

Notice: Undefined index: option ...

 

AFAIK <option> nie posiada atrybutu name

w takim razie zapis

$query .= "('$value', ... )"

jest nieprawidłowy, bo $value nie zawiera danych.

 

Usuń z zapisu name

        <select name="select" id="">
            <option value="1">Produkt-1</option>
            <option value="2">Produkt-2</option>
            <option value="3">Produkt-3</option>
            <option value="4">Produkt-4</option>
        </select>

i  w kodzie odwołuj się do

$value = $_POST['select'];

 

sprawdź

<?php
    if (isset($_POST['submitCat'])) {
        var_dump($_POST);

        $value = $_POST['select'];
        var_dump($value);
    }
?>
<div class="add-new-product">
    <h1>Dodawanie kategorii do produktu</h1><br>
    <form method="POST">
        <select name="select" id="">
            <option value="1">Produkt-1</option>
            <option value="2">Produkt-2</option>
            <option value="3">Produkt-3</option>
            <option value="4">Produkt-4</option>
        </select><br><br>
             
        <p><input type="checkbox" name="category[]" value="1">Kategoria-1</p> 
        <p><input type="checkbox" name="category[]" value="2">Kategoria-2</p> 
        <p><input type="checkbox" name="category[]" value="3">Kategoria-3</p>
        <p><input type="checkbox" name="category[]" value="4">Kategoria-4</p>
        <p><input type="checkbox" name="category[]" value="5">Kategoria-5</p>

        <input type="submit" name="submitCat" value="Wyślij">
    </form>
</div>

 

Podobne pytania

0 głosów
2 odpowiedzi 307 wizyt
0 głosów
2 odpowiedzi 128 wizyt
0 głosów
0 odpowiedzi 111 wizyt

92,535 zapytań

141,376 odpowiedzi

319,449 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...