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

Error przy pytaniu SQL używając PDO

Object Storage Arubacloud
0 głosów
531 wizyt
pytanie zadane 25 czerwca 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)

Cześć mam duży problem z zapytaniem mającym za zadanie dodać nowy produkt na stronę poprzez wstawienie informacji o nim do tabeli 'products'. 

Mam stworzoną klasę w PHP o nazwie 'Product', która posiada m. in. funkcję 'addProduct':

class Product
{
    public $db = null;

    public function __construct(DBController $db){
        if(!isset($db->con)) return null;
        $this->db = $db;
    }

    
    // add product
    public function addProduct($item_genre, $item_brand, $item_name, $item_price, $item_image, $table){
        if ($this->db->con != null) {
            if(isset($item_name) && isset($item_genre) && isset($item_brand) && isset($item_price) &&
                isset($item_image)){
                if(is_double(doubleval($item_price))) {

                    $columns = 'item_genre, item_brand, item_name, item_price, item_image';

                    $result = $this->db->con->query("INSERT INTO {$table}({$columns}) VALUES ({$item_genre}, {$item_brand}, {$item_name}, {$item_price}, {$item_image})");

                    return $result;
                } else {
                    echo "<div class='px-5 pb-2'><p style='color: red'>Cena musi być wartością numeryczną</p></div>";
                }
            } else {
                echo "<div class='px-5 pb-2'><p style='color: red'>Proszę uzupełnić wszystkie dane</p></div>";
            }
        }
    }

}

 

Chcę teraz, żeby po naciśnięciu odpowiedniego przycisku na stronie pojawił się formularz z polami do wpisania odpowiednich danych, wysłanych później jako zapytanie typu INSERT INTO do tabeli 'products'. Oto jak wygląda to na stronie:

<!-- New Products-->
<?php

    if (!isset($_SESSION['logged'])) {
        header('Location: ../login.php');
        exit();
    }

    shuffle($product_shuffle);

    // request method post
    if($_SERVER['REQUEST_METHOD'] == "POST"){
        if(isset($_POST['new_products_submit'])){                      
            // call method addToCart
            $Cart->addToCart($_POST['user_id'], $_POST['item_id']);            // inna funkcja odpowiedzialna za dodawanie produktów do koszyka
        }

        // wywołanie funkcji aby dodać produkt
        if(isset($_POST['add_product_confirm'])){
            // call method addProduct
            $product->addProduct($_POST['item_genre'], $_POST['item_brand'], $_POST['item_name'], $_POST['item_price'], $_POST['item_image'], 'product'); 
        }
    }
?>
<section id="new-products">
    <div class="container">
        <h4 class="font-rubik font-size-20">Nowe Produkty</h4>
        <?php
            if(!isset($_POST['add_product_submit'])){
        ?>
        <form method="POST"> 
              // przycisk, który ma wyświetlić formularz
            <button type="submit" name="add_product_submit" class="btn btn-success text-white font-size-16">DODAJ PRODUKT</button>
        </form>
        <?php
            } else {           // jeżeli przycisk jest wciśnięty wyświetl formularz
                echo "<div class='pt-2'><hr>";
                echo "<h4 style='color: green'>Dodaj produkt:</h4>";
                echo "<form method='post'>";
                echo "<p>Nazwa produktu: <input type='text' name='item_name'></p>";
                echo "<p>Gatunek muzyczny: <input type='text' name='item_genre'></p>";
                echo "<p>Artysta: <input type='text' name='item_brand'></p>";
                echo "<p>Cena produktu: <input type='text' name='item_price'></p>";
                echo "<p>Ścieżka do obrazka: <input type='text' name='item_image'></p>";
                echo "<p><input type='submit' name='add_product_confirm'></p>";
                echo "</form>";
                echo "<hr></div>";
            }
        ?>
        <hr>
        <div class="owl-carousel owl-theme">
            <?php foreach ($product_shuffle as $item) {?>
                <div class="item p-2 bg-light">
                    <div class="product font-rale">
                        <a href="<?php printf('%s?item_id=%s', 'Admin_product.php', $item['item_id']); ?>"><img src="<?php echo $item['item_image'] ?? "/assets/products/1.png"; ?>" alt="product1" class="img-fluid"></a>
                        <div class="text-center pt-4">
                            <h6><?php echo $item['item_name'] ?? "Unknown";?></h6>
                            <p class="font-size-14"><?php echo $item['item_brand'] ?? "Brand"; ?></p>
                            <div class="price py-1">
                                <span>$<?php echo $item['item_price'] ?? '0'; ?></span>
                            </div>
                            <form method="POST">
                                <input type="hidden" name="item_id" value="<?php echo $item['item_id'] ?? '1'; ?>">
                                <input type="hidden" name="user_id" value="<?php echo '1'; ?>">
                                <?php
                                    if (in_array($item['item_id'], $Cart->getCartId($product->getData('cart')) ?? [])){
                                        echo '<button type="submit" disabled class="btn btn-success font-size-12">W Koszyku</button>';
                                    }else{
                                        echo '<button type="submit" name="top_sale_submit" class="btn color-skin-bg color-second font-size-12">Dodaj do Koszyka</button>';
                                    }
                                ?>
                            </form>
                        </div>
                    </div>
                </div>
            <?php } // closing foreach ?>
        </div>


    </div>
</section>
<!-- !New Products-->

Tak prezentuje się tabela product:

i przykładowe dane, które zwiera:

 

Problem pojawia się po wysłaniu przykładowych danych przez formularz:

 Mianowicie wyświetla błąd:

Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Pop' in 'field list' in C:\Users\kawcz\PhpstormProjects\Sklep_Internetowy\database\Product.php:52 Stack trace: #0 C:\Users\kawcz\PhpstormProjects\Sklep_Internetowy\database\Product.php(52): PDO->query('INSERT INTO pro...') #1 C:\Users\kawcz\PhpstormProjects\Sklep_Internetowy\Admin Template\Admin_new-products.php(20): Product->addProduct('Pop', 'Tyler', 'IGOR', '10.40', 'assets/products...', 'product') #2 C:\Users\kawcz\PhpstormProjects\Sklep_Internetowy\Admin_Index.php(29): include('C:\\Users\\kawcz\\...') #3 {main} thrown in C:\Users\kawcz\PhpstormProjects\Sklep_Internetowy\database\Product.php on line 52

Pokazuje że na linii 52, ponieważ nie wklejałem tutaj niepotrzebnych w tej sprawie funkcji klasy Product, ale chodzi o linię:

$result = $this->db->con->query("INSERT INTO {$table}({$columns}) VALUES ({$item_genre}, {$item_brand}, {$item_name}, {$item_price}, {$item_image})");

Nie mam pojęcia czemu, ale wygląda na to, że skrypt przyjmuje wartości, które mają być przesłane jako nazwy kolumn (Column not found: 1054 Unknown column 'Pop' in 'field list'). Czy byłby ktoś w stanie pomóc rozwiązać ten problem, jest to dla mnie bardzo ważne. Z góry dziękuję.

komentarz 25 czerwca 2022 przez wizarddos Nałogowiec (26,070 p.)
Tak przy okazji. Walidujesz gdzieś te wprowadzane dane (w sensie zmienne $item_genre, $item_brand etc.).

A pokazywanie formularza można zrobić JS'em (i on będzie do tego lepszy)
komentarz 26 czerwca 2022 przez MKolaj15 Bywalec (2,270 p.)
Walidację planowałem dodać później, na razie chciałem sprawdzić, czy w ogóle działa
1
komentarz 26 czerwca 2022 przez MKolaj15 Bywalec (2,270 p.)

Okej, mam inne rozwiązanie, po prostu dodałem pojedynczy cudzysłów ('') wokół zmiennych reprezentujących wartości, które chcę wstawić do tabeli:

$result = $this->db->con->query("INSERT INTO {$table}({$columns}) VALUES ('{$item_genre}', '{$item_brand}', '{$item_name}', '{$item_price}', '{$item_image}')");

i działa laugh

1 odpowiedź

0 głosów
odpowiedź 25 czerwca 2022 przez wizarddos Nałogowiec (26,070 p.)
Sprawdź dokładnie swoją funkcję query w klasie DBController (przy użyciu np. debuggera) i dokładnie krok po kroku analizuj co robi kod, bo tam może tkwić jakiś problem.

(Bez jej kodu ciężko nam będzie pomóc, dodaj ją tu jeżeli możesz i chcesz)
komentarz 26 czerwca 2022 przez MKolaj15 Bywalec (2,270 p.)

Tak wygląda moja klasa DBConnector:

<?php

class DBController
{
    //Database Connection Properties
    private $host = 'localhost';
    private $user = 'root';
    private $password = '';
    private $database= 'sklep';

    // connection property
    public $con = null;

    // call constructor
    public function __construct()
    {
        try {
            $this->con = new PDO("mysql:host=$this->host;dbname=$this->database", $this->user, $this->password);
        } catch (Exception $error){
            die("Connection failed: " . $error->getMessage());
        }
    }

    public function __destruct(){
        $this->closeConnection();
    }

    //for PDO closing connection
    private function closeConnection(){
        if($this->con != null){
            $this->con = null;
        }
    }

}

funkcja query to wbudowana funkcja w PHP służąca do wykonywania zapytań SQL.

2
komentarz 26 czerwca 2022 przez wizarddos Nałogowiec (26,070 p.)

Ok, Lepiej używać zamiast query poleceń przygotowanych. Są bezpieczniejsze.

Spróbuj napisać to z ich użyciem, bo zapytanie wygląda na poprawne.

komentarz 26 czerwca 2022 przez MKolaj15 Bywalec (2,270 p.)
Dzięki za radę, tego spróbuję

Podobne pytania

0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 12 lutego 2021 w PHP przez mat19 Obywatel (1,580 p.)
0 głosów
2 odpowiedzi 1,338 wizyt
0 głosów
2 odpowiedzi 1,119 wizyt

92,761 zapytań

141,685 odpowiedzi

320,483 komentarzy

62,105 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

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!

...