Добавить инфу в БД используя PDO

190
26 октября 2018, 14:00

Всем привет.

У меня есть форма который в принципе должен добавить информацию через админку в БД.

Я только только использую PDO (да и саму PHP тоже) поэтому строго не ругать 99% кода не я писал.

В БД создал таблицу category и 3 свойства id (автоинкремент) name и image навяский пожарный скажу что сравнение там стоит latin1_swedish_ci в многих ресурсах используют utf8_general_ci но я думаю это не столь критично.

Форма такого типо

HTML

<form action="categories.php" method="POST" enctype="multipart/form-data">
     <fieldset>
         <label for="name">Name:</label>
         <input type="text"  name="name" id="name" placeholder="name">
            <label for="image">Image:</label>
            <input type="file" class="form-control" id="image" name="Image"/>
            <button type="submit" name="submit">Add Category</button>
     </fieldset>
</form> 

в DB.php у меня такой обьектно ориентированный PDO код

     Class Database {
         private $link;
         public function __construct() {
            $this->connect();
         }
         private function connect(){
            $config = require_once "config.php";//тут подключаем config.php
            $dsn = "mysql:host=".$config["host"].";dbname =".$config["db_name"].";"; //тут используем настройки написанные в config.php
            $this->link = new PDO($dsn, $config["username"], $config["password"]);
            return $this;
         }
         public function execute($sql){
            $sth = $this->link->prepare($sql);
            return $sth->execute();
         }
         public function query($sql){
            $sth = $this->link->prepare($sql);
            $sth->execute();
            $result = $sth->fetchAll(PDO::FETCH_ASSOC);
            if($result === false){
                return [];
            }
            return $result;
         }
     }
$db = new Database();

Также есть config.php для дополнении к DB.php

return [
    "host" => "localhost",
    "db_name" => "razmovar",
    "username" => "root",
    "password" => ""
];

И соответственно часть categories.php где я хочу добавить файлы полученные из формы в БД

 if(isset($_POST["submit"])){ //если кнопка submit нажата
        $name = $_POST["name"]; 

        $image = $_FILES["Image"]["name"];
        $admin = "Макс";
        if(empty($name)){ //если полья name пусто выдать ошибку сессии которые внизу потом перенаправитсья в эту страницу
            $_SESSION["ErrorMessage"] = "all fields must be field up";
            redirect_to("categories.php");
            exit;
        } else if(strlen($name) > 40){ //nесли имя категории содержит символов больше чем 40 вывести ошибку сессии и опять  перенаправитсья в эту страницу
            $_SESSION["ErrorMessage"] = "category name can't be more than 40 symbol's";
            redirect_to("categories.php");
            exit;
        } else {
            global $db; //вызываем глобально переменную $db
            $db->execute("INSERT INTO `category` (name,image) VALUES('{$name}','{$image}')"); //добавляем в таблицу category значение полученные из переменных name и image
                if($db){ //если добавлено то сообшения сессии что все успешно добавлено 
                    $_SESSION["SuccessMessage"] = "Category added succesfully";
                    redirect_to("categories.php");
                }   else {//иначе ошибка
                    $_SESSION["ErrorMessage"] = "Something went wrong";
                    redirect_to("categories.php");
                }
        }
    }

Но проблема в том что каждый раз он пишет что category added succesfully (категория удачно добавилось) то есть доходит то части где if($db) и тут выводитсья true но когда я смотрю в БД там пусто ничего не добавилось ПОЧЕМУ ТАК помогите уже три дня не могу решить ..

Испробовал все

вместо этого $db->execute("INSERT INTOcategory(name,image) VALUES('{$name}','{$image}')");

кода писать ТАК..

$db->execute("INSERT INTO `category` (name,image) VALUES('$name','$image')");

Или так

$db->execute("INSERT INTO category (name,image) VALUES('$name','$image')");

Разные эксперементы делал с этой строкой но ничего не помогло .

Answer 1

if($db){ - А в $db-то у вас класс.

Нужно так:

$db = $db->execute("INSERT INTO `category` (name,image) VALUES('{$name}','{$image}')");
if($db){ ... }

Или так:

if($db->execute("INSERT INTO `category` (name,image) VALUES('{$name}','{$image}')")) { ... }

Или так:

$sql = "INSERT INTO `category` (name,image) VALUES('{$name}','{$image}')";
if($db->execute($sql)) { ... }

Не добавляется из-за этой строки:

dsn = "mysql:host=".$config["host"].";dbname =".$config["db_name"].";"

Должно быть так:

dsn = "mysql:host=".$config["host"].";dbname=".$config["db_name"].";"

Никаких пробелов, ничего лишнего.

Answer 2

А где пишет-то? Вот это

category added succesfully

Это ж вроде в сессию пишется....

Как проверяете БД? Перезайти не пробовали в БД? Мож браузер просто тупит?

И вообще откуда код?? Переменные, мне кажется, не проходят проверку на иньекцию, сырой код-то!!!

Инсертить вот так надо:

$query = $db->prepare("INSERT INTO users(name, email, username, password) VALUES (:name,:email,:username,:password)");
            $query->bindParam("name", $name, PDO::PARAM_STR);
            $query->bindParam("email", $email, PDO::PARAM_STR);
            $query->bindParam("username", $username, PDO::PARAM_STR);
Answer 3

Скажу свое мнение, что инженеры не дураки. По поводу того что на данном этапе городить классы которые будут выполнять работу с БД. Я не заморачиваюсь и пишу на процедурном. Не делаю никаких классов. Для этого есть RedBeanPhp. ЛУчше раз новичек как я, то я для начала изучаю как вообще с этим работать. Для инъекций я использую примерную запись.

$save = $con->prepare("INSERT INTO `name_table` (`id_column`, `name_column`) VALUES (NULL, ?)");
$save->execute(array($_POST['id_column'], $_POST['name_column']));

Далее нужно разобраться с кодировкой если работаете с UTF-8 то и таблицам нужно задавать utf8_general_ci. иначе будут крокозябры если не городить трехэтажный код. Попробуйте для начала создавать и закрывать соединение с бд, а потом уже это дело все запихивать в классы. Я не думаю что у вас проект размером с яндекс.

READ ALSO
Переписать с JS на PHP

Переписать с JS на PHP

Всем привет, пишу скрипт грамматически правильного деления слова на слогиСтолкнулся с проблемой, подскажите пожалуйста, как переписать...

149
Добавление записи в бд через форму. php

Добавление записи в бд через форму. php

Выводит что информация занесена в бдНо ее там нету

161
127.0.0.1/phpmyadmin/ не заходит

127.0.0.1/phpmyadmin/ не заходит

Захожу по адресу 1270

211