Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] dodwanie filmu z bazy, klika kategorii
Forum PHP.pl > Forum > PHP
Lejto
Mam skrypt który dodaje dany film do bazy. Jednemu filmowi można przypisać maksymalnie trzy kategorie. Jak to zapisać do bazy w jednym rekordzie aby można było to łatwo odczytać?
Kategoria podawana jest w ID.
Tabela z filmami:
  1.  
  2. CREATE TABLE IF NOT EXISTS `videos` (
  3. `video` text collate utf8_unicode_ci NOT NULL,
  4. `description` text collate utf8_unicode_ci NOT NULL,
  5. `title` text collate utf8_unicode_ci NOT NULL,
  6. `cover` varchar(50) collate utf8_unicode_ci NOT NULL DEFAULT 'okladki/',
  7. `data` datetime NOT NULL,
  8. `category` int(11) NOT NULL,
  9. `last_viev` datetime NOT NULL,
  10. `views` int(11) NOT NULL,
  11. `videos_id` int(11) NOT NULL AUTO_INCREMENT,
  12. PRIMARY KEY (`videos_id`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
  14.  
speenatch
Może zamień INT na tekst i zapisuj po pionowej kresce (|), a poźniej choćby explode.
Inna metoda, to zrobić takie numery kategorii, żeby suma każdych trzech była inna (mam nadzieję, że rozumiesz).
tehaha
możesz zrobić taj jak w drzewko IP, połączyć kropkami: 23.455.12 , a potem wyciągasz filmy dla kategorii przy pomocy LIKE, chociaż ja bym zrobił oddzielną tabelę film-kategoria, z przypisanymi id kategorii do id filmu
Lejto
też właśnie chciałem zrobić oddzielną tabele ale nie zrobiłem już ze względu na mój kod który mam, myślałem też o 2|4|6 ale będzie kolizja tu:
  1. <?
  2. $sql = $this->sql->query('SELECT id_categories, c.category, COUNT(*) AS "COUNT"
  3. FROM categories c
  4. JOIN videos v ON c.id_categories = v.category
  5. GROUP BY id_categories ');
  6. $rows = $sql->num_rows;
  7. global $page;
  8.  
  9. ?>
  10. <div class="categories">
  11. <?
  12. while($row = $sql->fetch_array())
  13. {
  14.  
  15.  
  16. ?>
  17. <span class="hrefk">
  18. <a href="categories/<?=$this->toPermalink(trim($row[category]))?>,<?=$row[id_categories];?>" tltle="Filmy z napisami">
  19. <div class="column span-4"><?=$row[category];?> (<?=$row['COUNT'];?>)</div></a>
  20. </span>
  21. <?
  22. }
  23. ?>
  24. </div>
  25. <?

chyba że da się to rozwiązać
ten kod wypisuje kategorie i liczbę filmów w danej kategorii za jednym razem

zrobiłem nową tabele na kategorie
  1. CREATE TABLE IF NOT EXISTS `videos_category` (
  2. `id_video` int(11) NOT NULL,
  3. `id_category` int(11) NOT NULL,
  4. `id_videos_category` int(11) NOT NULL AUTO_INCREMENT,
  5. PRIMARY KEY (`id_videos_category`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

powyższe zapytanie zmieniłem i działa
teraz tylko mam problem z wyświetlaniem filmów z danej kategorii, jak to zrobić?
tehaha
no ale w tym zapytaniu zamiast robić JOIN videos v , możesz zrobić JOIN videos_cats_assoc v i wyjdzie na to samo, i te powiązania będziesz trzymał w oddzielnej tabeli

żeby wyciągnąć dla danej kategorii to wyciągając z videos robisz join videos_category on id_cat = id_cat AND id_cat = 5
Lejto
ok poradziłem sobie z tym
teraz jak dodaje kategorie to tabeli to skąd wziąć ID filmu? dodać najpierw film a potem pobrać ostatni id i go wpisać?
tehaha
tak, możesz tutaj użyć funkcję mysql_insert_id()
Lejto
nie działa mi coś ;/
dane do tabeli dodaje ale nie zwraca ID
  1. <?
  2. $zapytanie = '
  3. insert into videos(video,description,title,cover) values ("'.$kod.'", "'.$opis_z.'", "'.$tytul.'", "'.$nazwa_zmieniona.'")
  4. ';
  5. $wynik = $db->query($zapytanie);
  6. $id = $db->insert_id;
  7. var_dump( $id );
tehaha
a czy nie powinno być ?
  1. $id = $db->insert_id();
Lejto
też nic ;/

jakieś pomysły?

klasa łącząca wygląda tak:
  1. class DB{
  2.  
  3. public $_lacz;
  4.  
  5. public function __construct()
  6. {
  7. $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  8. if(mysqli_connect_errno() != 0)
  9. {
  10. echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error(). ', przepraszamy.';
  11. }
  12. }
  13. public function __destruct()
  14. {
  15. $this->_lacz->close();
  16. }
  17.  

potem w następnej klasie gdzie chce mieć połączenie to
  1. public function __construct($sql)
  2. {
  3. $this->sql = $sql;
  4. }

include wygląda tak:
  1. include("config.php");
  2. include("libs/db.class.php");
  3. $db = new DB();
  4. include("libs/core.class.php");
  5. $c = new core($db);
  6. include("function.inc.php");
  7. $f = new functions($db);
  8. include('libs/videos.class.php');
  9. $v = new videos($db);



a co do tych kategorii
to lepiej zapisywać je w nowej tabeli czy od razu w rekordzie filmu, jakie rozwiązanie jest wydajniejsze?

jaki sposób jest bardziej wydajny, optymalny?
celbarowicz
Co to znaczy optymalny kod? Jak zrobisz potrójny selekt to baza zajmuje więcej pamięci niż przy Twoim pomyśle. Przy potrójnym selekcie wyszukiwanie jest znacznie szybsze.
Lejto
chodzi mi o to czy wykorzystać:
dodawanie ID kategorii do oddzielnej tabeli (i tak wyciąągam wszystko jednym zapytaniem)
czy od razu przypisywać przy rekordzie filmu
co do optymalności to chodzi o rozmiar danych i czas wykonania skryptu
celbarowicz
ja robię tak
  1. <?php
  2. $link=mysql_connect('localhost','root','');
  3. $charset = mysql_client_encoding($link);
  4. if ( $charset != 'utf8' ) {
  5. mysql_set_charset('utf8',$link);
  6. }
  7.  
  8. $sql="CREATE DATABASE IF NOT EXISTS selduze3 ";
  9. mysql_query($sql) or die(mysql_error());
  10.  
  11.  
  12. mysql_select_db('selduze3',$link);
  13.  
  14. $sql="CREATE TABLE IF NOT EXISTS tabela_1(
  15. id_t1 int(3) NOT NULL auto_increment,
  16. nazwa_t1 varchar(20) NOT NULL ,
  17.  
  18. PRIMARY KEY klucz1 (id_t1)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";
  19.  
  20. mysql_query($sql) or die(mysql_error());
  21. //-----------------------------------------------------------
  22. $sql="CREATE TABLE IF NOT EXISTS tabela_2(
  23. id_t2 int(3) NOT NULL auto_increment,
  24. id_t1_w_t2 int(3) NOT NULL,
  25. nazwa_t2 varchar(20) NOT NULL,
  26. PRIMARY KEY klucz2 (id_t2 ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";
  27.  
  28. //-----------------------------------------------------------
  29. $sql="CREATE TABLE IF NOT EXISTS tabela_3(
  30. id_t3 int(3) NOT NULL auto_increment,
  31. id_t2_w_t3 int(3) NOT NULL,
  32. nazwa_t3 varchar(20) NOT NULL,
  33. PRIMARY KEY klucz3 (id_t3 ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. ?>
Lejto
chyba mnie nie zrozumiałeś

chodzi mi to o to czy bedzie lepiej jeżeli kategorie będę przechowywał razem z rekordem filmu i potem przy wyświetlaniu kategorii otwierał baze
czy lepiej jak kategorie będę trzymał w oddzielnej tabeli (same id) i potem wyświetlał zapytaniem łączącym 2 tabele (ilość rekordów dla danej kategorii)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.