• 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

VPS Starter Arubacloud
0 głosów
365 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 (25,130 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 (25,130 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 (25,130 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ź 195 wizyt
pytanie zadane 12 lutego 2021 w PHP przez mat19 Obywatel (1,580 p.)
0 głosów
2 odpowiedzi 1,272 wizyt
0 głosów
2 odpowiedzi 978 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...