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 Trainer 6849 Точки

Хора, дебъгвайте. Ако не през 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.