Всем привет.
У меня есть форма который в принципе должен добавить информацию через админку в БД.
Я только только использую 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 INTO
category(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')");
Разные эксперементы делал с этой строкой но ничего не помогло .
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"].";"
Никаких пробелов, ничего лишнего.
А где пишет-то? Вот это
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);
Скажу свое мнение, что инженеры не дураки. По поводу того что на данном этапе городить классы которые будут выполнять работу с БД. Я не заморачиваюсь и пишу на процедурном. Не делаю никаких классов. Для этого есть 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. иначе будут крокозябры если не городить трехэтажный код. Попробуйте для начала создавать и закрывать соединение с бд, а потом уже это дело все запихивать в классы. Я не думаю что у вас проект размером с яндекс.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем привет, пишу скрипт грамматически правильного деления слова на слогиСтолкнулся с проблемой, подскажите пожалуйста, как переписать...