Софтуерно Инженерство
Loading...
VladoGenov avatar VladoGenov 44 Точки

ПРОБЛЕМ с MySQL заявка и имплементиране в PHP -> MVC

Здравейте колеги,
Имам проблем със следната MySQL заявка:

INSERT INTO posts(title, content, user_id) VALUES (?,?,?)

Позвам XAMPP и се опитвам от phpMyAdmin-а директно - дава ми грешка още там, съответно я имплементирам по следния начин във функция create за блога:

public function create (string $title, string $content, int $user_id) : bool
{
    // Create post and put it in DB
    $statement = self::$db->prepare(
        "INSERT INTO posts(title, content, user_id) VALUES (?,?,?)");
    $statement->bind_param("ssi", $title, $content, $user_id);
    $statement->execute();
    return $statement->affected_rows == 1;
}

Съответно отново ми дава грешка, а в материалите ни е така и в лекцията се вижда от видеото, че работи?!
Имам същият тип заявка (INSERT), но във функцията register() - и странното е че там работи в имплементацията, а директно също не иска да се изпълни?!
Тук е линка на проекта: https://github.com/VladoG70/PracticalPRJ_SoftTech2016
Намира се в следния файл: \GitHub\PracticalPRJ_SoftTech2016\blog\models\PostsModel.php
Защо подобния модел във видео-лекцията (от 7 юли) работи коректно - а при мен дава грешки?
Ще съм благодарен ако някой помогне!

RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Хора, дебъгвайте. Ако не през IDE-то, то поне с дебъг символи (var_dump, print_r, echo, ...). Вижте дали някоя стойност не се губи или не е правилна. Дори и да не дава грешки. Трябва винаги да се съмнявате в кода, който сте написали. Да не говорим, че в случая даже показва грешки.

Каква е грешката: "Трети аргумент на функцията "create" трябва да е integer, а си ми дал масив". Веднага бих си задал въпроса "АМА КАК МАСИВ БЕ ?!? КОЙ Е ТОЗИ ТРЕТИ АРГУМЕНТ ?!?!". Отварям го и гледам "user_id". Хм. Как е възможно да е масив user_id-то? От къде го получавам? Ами от сесията:

 $userId = $_SESSION['user_id'];
 if ($this->model->create($title, $content, $userId)){

Възможно ли е $userId да е масив? Как така в Сесията има масив? Кога съм го сложил в сесията? Почвам да обмислям control flow-ът на приложението. Как работи? Пиша си потребителя и паролата, то ме логва, записва ми id-то и от там нататък мога да го ползвам. Значи записва $_SESSION['user_id'] в логина. Нека отида до логина:

https://github.com/VladoG70/PracticalPRJ_SoftTech2016/blob/draft-project/blog/models/UsersModel.php#L14

Връщаш резултатът от асоциативният масив, който е върнал-а базата. Ако погледеш какво връща fetch_assoc() функцията (въпреки че то и името си подсказва), то това е асоциативен масив. Без значение какъв масив е - идеята е, че връщаш масив. После този return statement от логин функцията го слагаш в сесията:

https://github.com/VladoG70/PracticalPRJ_SoftTech2016/blob/draft-project/blog/controllers/UsersController.php#L53

И какво се оказва. Че всъщност ти лъжеш хората (и себе си), че това което вкарваш в сесията е userId, а то е масив. Вероятно с всичко за потребителя (id-то и password hash-а).

Помисли как в сесията да вкараш смо ID-то на потребителя, ако това очакваш да изкарваш от там. Тъй като, както виждам, ти във цялото приложение очакваш че под ключа user_id, има число.

 

Успех :)

2
VladoGenov avatar VladoGenov 44 Точки

Благидаря за подробния анализ, отново помогна.
Да, открих единият проблем, точно според насоката: в UsersModel-а - функцията login()
Бях писал следното:

$result = $statement->get_result()->fetch_assoc();
if (password_verify($password,$result['password_hash'])){
    return $result;

което връща наистина масив в $result, респективно функцията връща също масив.
Коригирах да връща само елемента с индекс ['id']:

if (password_verify($password,$result['password_hash'])){
    return $result['id'];

Единият проблем се оправи, но дори след тази корекция, функцията delete() и edit(), продължават да не работят.
Дебъгвах с var_dump() - получавам коректни стойности за "id", но ...
Например при delete(), продължава единият браузър (Chrome) да дава грешка (Mozilla не дава : ) ):

( ! ) Notice: A non well formed numeric value encountered in C:\xampp\htdocs\blog\controllers\PostsController.php on line 81
Call Stack
# Time Memory Function Location
1 0.0010 358352 {main}( ) ...\index.php:0
2 0.0040 373464 processRequest( ) ...\index.php:7
3 0.0140 434464 PostsController->delete( ) ...\functions.php:64


А всичко работи уж коректно.
И още един допълнителен въпрос, защо var_dump() не се визуализира в браузъра, единствено само ако спра след него с например die("Test ....")?!
Може би идващото след него view го "зачиства" веднага?!

0
VladoGenov avatar VladoGenov 44 Точки

Между другото си намерих и отстраних всички грешки.
Останалите бяха във view-тата - не бях задал метод на формата (в случая POST).
Работещ вариант - http://vg.cloudvps.bg/blog/
Оства ми въпроса с визуализацията на var_dump()-a ...

0