Error
Loading...
+ Нов въпрос
VladoGenov avatar VladoGenov 45 Точки

ПРОБЛЕМ с 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 юли) работи коректно - а при мен дава грешки?
Ще съм благодарен ако някой помогне!

naskodaskalov avatar naskodaskalov 32 Точки

Колега, каква точно грешка ти дава? При мен си работи без проблем.

0
VladoGenov avatar VladoGenov 45 Точки

От phpMyAdmin:

Error

Static analysis:

3 errors were found during analysis.

 

  1. Unexpected character. (near "?" at position 51)
  2. Unexpected character. (near "?" at position 53)
  3. Unexpected character. (near "?" at position 55)

 

SQL query:

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

MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?,?,?)' at line 1

0
VladoGenov avatar VladoGenov 45 Точки

 

( ! ) Fatal error: Uncaught TypeError: Argument 3 passed to PostsModel::create() must be of the type integer, array given, called in C:\xampp\htdocs\blog\controllers\PostsController.php on line 29 and defined in C:\xampp\htdocs\blog\models\PostsModel.php on line 22
( ! ) TypeError: Argument 3 passed to PostsModel::create() must be of the type integer, array given, called in C:\xampp\htdocs\blog\controllers\PostsController.php on line 29 in C:\xampp\htdocs\blog\models\PostsModel.php on line 22
Call Stack
# Time Memory Function Location
1 0.0020 359752 {main}( ) ...\index.php:0
2 0.0060 375136 processRequest( ) ...\index.php:7
3 0.0140 431816 PostsController->create( ) ...\functions.php:64
4 0.0140 431816 PostsModel->create( ) ...\PostsController.php:29
0
naskodaskalov avatar naskodaskalov 32 Точки

Колега, тази заявка няма как да я изпълняваш директно в phpmyadmin-а.

Тя би била коректна за там ако е в следния вид:

INSERT INTO posts(title, content, user_id) VALUES ("някакъв тайтъл","някакъв контент","ID-то на автора")

Иначе казано така написана заявката с въпросителните на стойностите е за да се изпълне, когато правиш нов пост и въпросителните се заместват със съответните стойности.

1
RoYaL avatar RoYaL SoftUni Team Trainer 6845 Точки

Хора, дебъгвайте. Ако не през 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 45 Точки

Благидаря за подробния анализ, отново помогна.
Да, открих единият проблем, точно според насоката: в 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 45 Точки

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

0