Автор Тема: Заява към база данни???  (Прочетена 12282 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Заява към база данни???
« -: 24 Януари 2016, 13:16:19 »
Здравейте! Ще ми трябва малко помощ с една заявка към бд. Правя едно проектче от училище за читателски дневник ,в който когато даден потребител се регистрира да може добави книга ,която е прочел и да каже нещо за нея. Заявката да се отнася за това ,че примерно ако има двама различни потребители ,които са прочели една и съща книга с едно и също име, тя да извежда името на книгата и отстрани примерно имената на двамата потребители. Може ли да се направи. Благодаря предварително  :)

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Заява към база данни???
« Отговор #1 -: 24 Януари 2016, 17:12:01 »
Здравей и добре дошъл във форума,

Може, що да не може - но по това което си описал, май първо трябва да измислиш как да определиш кога една книга е прочетена от даден човек. След това трябва да бъде по-ясно как ще извадиш нужната информация
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #2 -: 24 Януари 2016, 19:09:20 »
Благодаря! Ето това съм го направил. Малко помощ как ще стане??
« Последна редакция: 24 Януари 2016, 20:40:13 от ivcho02 »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Заява към база данни???
« Отговор #3 -: 24 Януари 2016, 22:55:55 »
Ами първата идея, която ми идва на акъл, е да създадеш допълнителна таблица, в която да записваш от кого е прегледана дадена книга. В нея ще записваш ID-то на книгата и ID-то на потребителя. Така като се избере книга, ще пускаш допълнителна заявка по ID-то на книгата да видиш кои потребители са я прочели. Новата таблица би изглеждала като нещо такова:
Код: MySQL
  1. CREATE TABLE IF NOT EXISTS `book_views` (
  2.   `kniga_id` INT(11) UNSIGNED NOT NULL,
  3.   `user_id` INT(11) UNSIGNED NOT NULL,
  4.   INDEX (`kniga_id`),
  5.   INDEX (`user_id`)
  6.  

И после да ги извадиш, може да ползваш subquery за да ги преброиш, или JOIN за да видиш кои точно потребитеки са чели книгата. Нещо от сорта на това:
Код: MySQL
  1. SELECT `books`.`kniga_id`, `books`.`name_book`,
  2.         `view_count`.`user_id`,
  3.         (
  4.             SELECT COUNT(*)
  5.             FROM `book_views`
  6.             WHERE `book_views`.`kniga_id` = `books`.`kniga_id`
  7.         ) AS `view_count`
  8. FROM `books`
  9. LEFT JOIN `book_views`
  10.     ON `books`.`kniga_id` = `book_views`.`kniga_id`
  11.  
  12.  


П.п. Кодът не е тестван, просто ти давам примери
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #4 -: 25 Януари 2016, 17:10:24 »
Ммм наистина много умно. Благодаря сега ще го почвам да го разботя и ще споделя ако има някакви проблеми и ако стане !  :) :) :) :)

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #5 -: 25 Януари 2016, 17:54:39 »
А когато потребителя добавя книгата - как ще стане заявката малко помощ.

mysql_query("INSERT INTO book_views (kniga_id,dete) VALUES ('"ТУК КАКВО ТРЯБВА ДА СЛОЖА"','".$_SESSION['user_info']['name']."')");
« Последна редакция: 25 Януари 2016, 17:56:45 от ivcho02 »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Заява към база данни???
« Отговор #6 -: 25 Януари 2016, 21:17:33 »
Еми kniga_id от таблицата, чиято структура постна в началото. Нали разбра какво исках да ти обесня? В този случай ще трябва да ползваш JOIN-ове и да разбереш наистина силата на релационните бази данни.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #7 -: 25 Януари 2016, 21:47:33 »
Не го разбрах това с join-а .. и това с добавянето на книгата не ми се получи ..  ??? ??? :-\ :-\

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Заява към база данни???
« Отговор #8 -: 25 Януари 2016, 23:09:49 »
Ако имаш следната структура:
Код: MySQL
  1. MariaDB [library]> SHOW TABLES;
  2. +-------------------+
  3. | Tables_in_library |
  4. +-------------------+
  5. | book_views        |
  6. | books             |
  7. | users             |
  8. +-------------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11.  
  12. MariaDB [library]> DESC `books`;
  13. +----------+------------------+------+-----+---------+----------------+
  14. | Field    | Type             | Null | Key | Default | Extra          |
  15. +----------+------------------+------+-----+---------+----------------+
  16. | kniga_id | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
  17. | name     | varchar(255)     | NO   |     | NULL    |                |
  18. +----------+------------------+------+-----+---------+----------------+
  19. 2 rows in set (0.00 sec)
  20.  
  21.  
  22. MariaDB [library]> DESC `users`;
  23. +---------+------------------+------+-----+---------+----------------+
  24. | Field   | Type             | Null | Key | Default | Extra          |
  25. +---------+------------------+------+-----+---------+----------------+
  26. | user_id | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
  27. | name    | varchar(255)     | NO   |     | NULL    |                |
  28. +---------+------------------+------+-----+---------+----------------+
  29. 2 rows in set (0.00 sec)
  30.  
  31.  
  32. MariaDB [library]> DESC `book_views`;
  33. +----------+------------------+------+-----+---------+----------------+
  34. | Field    | Type             | Null | Key | Default | Extra          |
  35. +----------+------------------+------+-----+---------+----------------+
  36. | id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
  37. | kniga_id | int(11) unsigned | NO   | MUL | NULL    |                |
  38. | user_id  | int(11) unsigned | NO   | MUL | NULL    |                |
  39. +----------+------------------+------+-----+---------+----------------+
  40. 3 rows in set (0.00 sec)
  41.  

Щом не може да си представиш как са навързани таблиците, ето ти ги нарисувани:


Да приемем, че имаме следната информация в таблиците:
Код: MySQL
  1. MariaDB [library]> SELECT * FROM `books`;
  2. +----------+--------------------+
  3. | kniga_id | name               |
  4. +----------+--------------------+
  5. |        1 | Gone With The Wind |
  6. +----------+--------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9.  
  10. MariaDB [library]> SELECT * FROM `users`;
  11. +---------+----------+
  12. | user_id | name     |
  13. +---------+----------+
  14. |       1 | Иван     |
  15. |       2 | Пешо     |
  16. +---------+----------+
  17. 2 rows in set (0.00 sec)
  18.  
  19.  
  20. MariaDB [library]> SELECT * FROM `book_views`;
  21. +----+----------+---------+
  22. | id | kniga_id | user_id |
  23. +----+----------+---------+
  24. |  1 |        1 |       1 |
  25. |  2 |        1 |       2 |
  26. +----+----------+---------+
  27. 2 rows in set (0.00 sec)
  28.  

То тогава, за да намериш кой е прочел първата книга, трябва да използваш заявка, подобна на тази:
Код: MySQL
  1. MariaDB [library]> SELECT `books`.`kniga_id`, `books`.`name` AS `book_name`, `users`.`name` AS `user_name`
  2. FROM `book_views`
  3. LEFT JOIN `books`
  4.     ON `book_views`.`kniga_id` = `books`.`kniga_id`
  5. LEFT JOIN `users`
  6.     ON `book_views`.`user_id` = `users`.`user_id`
  7. WHERE `book_views`.`kniga_id` = 1;                      
  8. +----------+--------------------+-----------+
  9. | kniga_id | book_name          | user_name |
  10. +----------+--------------------+-----------+
  11. |        1 | Gone With The Wind | Иван      |
  12. |        1 | Gone With The Wind | Пешо      |
  13. +----------+--------------------+-----------+
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #10 -: 26 Януари 2016, 22:51:45 »
Схванах идеята горе долу .. но не мога да го интегрирам това към моите неща...  :'( :'(

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Заява към база данни???
« Отговор #11 -: 27 Януари 2016, 05:08:34 »
Не може да го интегрираш, защото не са ти ясни нещата.  Тук в сайта има доста добри уроци за sql и за join . Meтни им едно око и ще ти стане по-лесно.

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Заява към база данни???
« Отговор #12 -: 27 Януари 2016, 05:55:20 »
Нека и аз да помогна малко. Първо използването на mysql_query не е препоръчителна защото е deprecated.  Tова е наследство от миналото.  Опциите, които имаш тук са две.  Първата е да използваш mysqli(mysql improved). По-голямата част от api-то се покрива с mysql. Разбира се има свойте разлики, но те са на малко по-високо ниво. Примерно може да използваш транзакции .  Втората опция е да използваш PDO, което поне за мен е най-добрия избор. Ще ти дам пример и с двете. Нека да ти покажа първо с mysqli

Как може да направиш връзка с базата данни?
Код: PHP
  1. $connection = mysqli_connect(MYSQL_HOSTNAME,USERNAME_SELECT,PASSWORD,DATABASE);
  2.  
  3. if ($mysqli->connect_errno) {
  4.     echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
  5. }
  6. echo $mysqli->host_info . "\n";
  7.  
Как се обръщаш към базата данни?
Код: PHP
  1. if (mysqli_query($connection, "CREATE  TABLE Dnevnik") === TRUE) {
  2.     printf("Table Dnevnik successfully created.\n");
  3. }
  4.  

С PDO(PHP Database Object) нещата са малко по-сложни. Принципно е библиотека(която е oop писана), която може да използваш. И може да използваш с различни видове бази данни.
Нека ти дам същите примери
Код: PHP
  1. function db_connect()
  2. {
  3.     $dsn = 'mysql:host='.MYSQL_HOSTNAME.';dbname='.DATABASE.';charset=utf8';
  4.     $opt = array(
  5.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  6.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  7.     );
  8.     return new PDO($dsn,USERNAME_SELECT, PASSWORD, $opt);
  9. }
  10.  

Код: PHP
  1. function select_something()
  2. {
  3.     global $pdo;
  4.  
  5.     $query = 'SELECT * FROM dnevnik ORDER BY name ASC';
  6.     $stm = $pdo->prepare($query);
  7.     $stm->execute();
  8.     return $stm->fetchAll();
  9. }
  10.  

ivcho02

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 8
Re: Заява към база данни???
« Отговор #13 -: 27 Януари 2016, 22:09:15 »
Почнах уроците за mysql .Ще ги изгледам и ще го направя както трябва. Благодаря Ви и ще пиша ако има някакви проблеми! :)

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Заява към база данни???
« Отговор #14 -: 27 Януари 2016, 22:13:34 »
Въпрос е просто да си поиграеш малко с нещата и ще ти се изяснят.