Wybieranie tabel po fragmencie nazwy

0

Witam!
Mam pewien problem. Otóż przez formularz w php oraz html tworzę nową bazę danych MySQL, struktura:


CREATE TABLE idsesji_nazwa (
`id`  int NOT NULL AUTO_INCREMENT,
`wartosc1`  varchar(200) NULL,
PRIMARY KEY (`id`) );';

ID jest pobierane z sesji logowania użytkownika, a nazwę wpisuje w formularzu. Jak za pomocą MySQL wybrać wszystkie tabele, w których to pobrane ID będzie równe z tym, na którym jest się zalogowanym, czyli jeśli podczas tworzenia ID było 35, to teraz wybrać wszystkie, których nazwa brzmi:
35_ a dalej jakikolwiek ciąg znaków?

0

Zapytanie, które Cię interesuje, to:

SHOW FULL TABLES WHERE Table_type="BASE TABLE" AND Tables_in_dbname LIKE 'idsesji_%';

Gdzie słowo dbname w Tables_in_dbname należy zamienić na nazwę bazy danych.

Pytanie tylko, po co tworzyć osobną tabelę (lub więcej tabel) dla każdego użytkownika? Przy większej ilości równoczesnych sesji baza może tego nie wytrzymać.
Zdecydowanie lepiej byłoby utworzyć tabele, które Cię interesują (tzn. bez tego id_sesji na początku) i dodać do każdej z nich pole id_sesji...

0

a więc zrobiłem to w taki sposób, mój kod wygląda następująco:


$id = $_SESSION['id'].'_%';
    $wynik = mysql_query("SHOW FULL TABLES WHERE Table_type='BASE TABLE' AND Tables_in_base LIKE '$id';");
    if(mysql_num_rows($wynik) > 0) {
    while($r = mysql_fetch_object($wynik)) {
    echo $r->topic;
    echo $r->id;
    }
    }

Jednak w takiej wersji strona zwraca następujące błędy:

Notice: Undefined property: stdClass::$topic in F:\XAMPP\htdocs\includes\data_bases.php on line 70
Notice: Undefined property: stdClass::$id in F:\XAMPP\htdocs\includes\data_bases.php on line 71

Próbuję sobie z tym poradzić jakiś czas, jednak nie potrafię. Może w zły sposób zrobiłem wyświetlanie? Prosiłbym o pomoc.

Trochę sobie poradziłem, zmieniłem trochę, na taki kod:


$id = $_SESSION['id'].'_%';
    $wynik = mysql_query("SHOW FULL TABLES WHERE Table_type='BASE TABLE' AND Tables_in_'$db' LIKE '$id';");
    if(mysql_num_rows($wynik) > 0) {
    while($r = mysql_fetch_object($wynik)) {
    echo $r->topic;
    echo $r->id;
    }
    }

zmienna $db znajduje się w pliku connection.php, w którym jest łączenie z bazą danych i zawiera ona nazwy bazy danych.
Jednak teraz otrzymuję następujący błąd:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in F:\XAMPP\htdocs\includes\data_bases.php on line 68
czyli w tej linijce:


while($r = mysql_fetch_object($wynik)) {

A taki błąd zwraca mysqlerror():
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near `baza' LIKE '6
%` at line 1

0

Masz błąd w zapytaniu SQL. Wyświetl je sobie przed wykonaniem i zobaczysz, że różni się od tego, które Ci podałem. Podpowiem Ci, że mniej więcej w tych okolicach: AND Tablesin'$db'
Niemniej nadal proponuję przemyślenie sensu takiej struktury bazy danych. Jak już pisałem - trzymanie jednej lub kilku tabel w bazie danych dla każdego użytkownika to poroniony pomysł...

Ponadto - dobrze, żebyś w miejsce wycofywanego rozszerzenia mysql zaczął korzystać z mysqli (przynajmniej) lub PDO.

0

    $id = "'".$_SESSION['id']."_%'";
    $wynik = mysql_query("SHOW FULL TABLES WHERE Table_type='BASE TABLE' AND Tables_in_$db LIKE $id ;") or die (mysql_error());
    if(mysql_num_rows($wynik) > 0) {
    while($r = mysql_fetch_object($wynik)) {
    echo $r->tablename;
    echo $r->id;
    }
    }

Najnowszy kod, zapytanie do MySQL już raczej działa, jednak nadal nie wyświetla nic, tylko zwraca takie błędy:

Notice: Undefined property: stdClass::$tablename in F:\XAMPP\htdocs\includes\data_bases.php on line 69

Notice: Undefined property: stdClass::$id in F:\XAMPP\htdocs\includes\data_bases.php on line 70


$zapytanie = 'CREATE TABLE '.$database_name.' (
`id`  int NOT NULL AUTO_INCREMENT,
`key`  varchar(200) NULL,
`tablename` varchar(200) NOT NULL, 
PRIMARY KEY (`id`) );';

tak wygląda struktura tej tabeli.

0

To nie zapytanie generuje błędy, tylko echo, które jest w pętli.
Przed próbą wyświetlenia czegokolwiek sprawdź co zwraca Ci to zapytanie i zacznij prawidłowo nazywać pola, których wartości chcesz wyświetlić...

0

zapytanie zwraca taką wartość:
Resource id #7
która domyślam się, że znaczy ile wartości zwróciło. Wartości, które chcę wyświetlić to id oraz tablename, które są w bazie.

0

Źle się domyślasz. Po pierwsze zasób (Resource id#7) jest zwracany przez funkcję mysql_query(), a nie przez samo zapytanie. Po drugie id#7 to identyfikator tegoż zasobu, a nie ilość zwróconych wierszy - to zwraca funkcja mysql_num_rows().

Widzę, że ta konwersacja zmierza donikąd. Zacznij jeszcze raz od odpowiedzi na poniższe pytania:

  1. Jakie dane użytkowników chcesz przechowywać w bazie danych?
  2. Dlaczego chcesz tworzyć w tym celu osobne tabele dla każdego użytkownika?

W między czasie (choć w zasadzie powinieneś to zrobić na samym początku) sugeruję przeczytanie przynajmniej jednej książki o PHP i MySQL, bo widzę, że - bez urazy - nie masz zielonego pojęcia o tym co próbujesz robić.
Dla przykładu: http://helion.pl/ksiazki/php-[...]iv-w-jason-gilmore,phmso4.htm, choć może znajdziesz jakieś lepsze pozycje tutaj: http://4programmers.net/Forum/Webmastering/156855-Jakie_książki_z_dziedziny_webmastering_warto_przeczytać.

0

no więc funkcja mysql_num_rows() zwraca tyle wartości, ile aktualnie znajduje się w bazie. po dodaniu nowej, wartość zwiększa się o tą nową tabelę, a więc o 1. W bazie chcę przechowywać dane użytkowników, które zostaną wysłane do odbiorców w odpowiednik czasie. Nie wiem tylko jak wyświetlić te tabele, które zwróciło zapytanie:
SHOW FULL TABLES WHERE Table_type='BASE TABLE' AND Tablesin$db LIKE $id ;

0

Dlaczego tworzysz dynamicznie masę nowych tabel o identycznej strukturze? Nie wiem, co tam w nich chcesz przechowywać, ale nie jest to dobry pomysł. Zamiast dodawać za każdym razem tabelę o nazwie 'idsesji_nazwa', trzymaj wszystko w jednej tabeli, a wartość 'idsesji_nazwa' zapisuj w jednej z kolumn tej tabeli. To co robisz wygląda mi trochę tak, jakbyś w sklepie internetowym przy składaniu nowego zamówienia tworzył za każdym razem nową tabelę. Nie tak się pracuje na relacyjnej bazie danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0