Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Zła kolejnosc rekordów w bazie
Forum PHP.pl > Forum > Przedszkole
blackdog
Witam wszystkich serdecznie.

Mam mały problem smile.gif bawie sie z PHP piszac kilka prostych klas (nie smiejscie sie jak zobaczycie)
Mam 1 tabelę w bazie danych - users:
  1. CREATE TABLE `users` (
  2. `usr_id` int(8) NOT NULL DEFAULT '0',
  3. `usr_imie` varchar(50) NOT NULL DEFAULT '',
  4. `usr_nazwisko` varchar(50) NOT NULL DEFAULT '',
  5. `usr_poziom` int(3) NOT NULL DEFAULT '0',
  6. `usr_login` varchar(50) NOT NULL DEFAULT '',
  7. `usr_haslo` varchar(50) NOT NULL DEFAULT '',
  8. `usr_email` varchar(50) NOT NULL DEFAULT ''
  9. ) TYPE=MyISAM;


oraz pliki php:

z klasa do obslugi bazy danych - database.inc.php
  1. <?php
  2.  
  3. /**
  4.  * @author 5513458585
  5.  * @copyright 2008
  6.  */
  7.  
  8. /*
  9. * klasa obslugi bazy mysql
  10. *
  11. */
  12. error_reporting(E_ALL|E_STRICT);
  13. ini_set('display_errors', 1);
  14.  
  15.  
  16. class Sql
  17. {
  18.    
  19.    public $cid ;  //connect id - odentyfikator połaczenia z baza danych
  20.    public $queryResult=array(); //tablica asocjacyjna przechowująca wyniki z zapytań do bazy
  21.    public $queries=0; // liczba wykonanych zapytan
  22.      public $rows=array(0=>array()); //tablica wielowymiarowa przechowywująca wyniki zapytan
  23.    
  24.    public $host="localhost";
  25.    public $user="stws";
  26.    public $pass="123qwe";
  27.    public $db_name="stws";
  28.    
  29.  
  30.       function __construct()
  31.       {
  32.           //łaczenie sie z baza danych o padanych parametrach
  33.        $this->cid=mysql_connect($this->host, $this->user, $this->pass)or die($this->error("Problem z nawiazaniem polaczenia"));
  34.        //wybor bazy danych
  35.        mysql_select_db($this->db_name, $this->cid)or die($this->error("Problem z wybraniem bazy"));
  36.       }
  37.  
  38.       //destrukto - zamyka polączenie
  39.     function __destruct()
  40.    {
  41.        $this->sqlClose();
  42.    }      
  43.  
  44.    //funkcjia obslugi bledow obslugi bazy danych
  45.       function error($what="Main System Error With Data Base")
  46.    {
  47.        return "<p style=\"color: red; font-weight: bold\">Driver SQL Problem <br>".$what." </p> ".mysql_error();
  48.    }
  49.    
  50.    //obsluga zapytania
  51.    //$to_query - zapytanie mysql
  52.    //$query_name -  nazwa zapytania
  53.    function query($to_query, $query_name)
  54.    {
  55.        //dodajemy do tablicy queryResult wynik zapytania (wartosc) zindeksowany nazwa zapytania
  56.        $this->queryResult[$query_name]=mysql_query($to_query, $this->cid);
  57.        echo $to_query.'<br/>';
  58.        echo mysql_error();
  59.        $this->queries++; //zwiekszamy liczbe wykonanych zapytan
  60.    }
  61.    //funkcjia zwracajaca liczbe wierszy na ktorych zostalo wykonane zapytanie o danej nazwie
  62.    function numRows($query_name)
  63.    {
  64.        return mysql_numrows($this->queryResult[$query_name]);
  65.    }
  66.    
  67.    //ilosc kolumn
  68.    function numFields($query_name)
  69.    {
  70.        return mysql_numfields($this->queryResult[$query_name]);
  71.    }
  72.    
  73.    //przedstawienie wyniku jako tablicy indeksowanej liczbami
  74.    function fetchRow($query_name)
  75.    {
  76.        $this->rows[$query_name]=mysql_fetch_row($this->queryResult[$query_name]);
  77.    }
  78.    
  79.    //przedstawienie wyniku zapytania jako tablicy indeksowanej nazwami pol
  80.    function fetchAssoc($query_name)
  81.    {
  82.        $this->rows[$query_name]=mysql_fetch_assoc($this->queryResult[$query_name]);
  83.    }
  84.    //zamykanie polaczenia
  85.    function sqlClose()
  86.    {
  87.        mysql_close($this->cid);
  88.    }
  89.    //inne pomocne funkcjie
  90.    
  91.    //zwraca ID ostatnio dodanego rekordu
  92.    function insertId()
  93.    {
  94.        return mysql_insert_id($this->cid);
  95.    }
  96.    //zwraca liczbę wierszy przetworzonych w ostatnim zapytaniu
  97.    function affectedRows()
  98.    {
  99.        return mysql_affected_rows($this->cid);
  100.    }
  101.    //funkcjia wykonuje zapytanie i tworzy z wyniku tablice asocjacyjna
  102.    function fetchQuery($to_query, $query_name)
  103.    {
  104.        $this->queryResult[$query_name]=mysql_query($to_query, $this->cid);
  105.        $this->rows[$query_name]=mysql_fetch_assoc($this->queryResult[$query_name]);
  106.        $this->queries++;
  107.    }
  108.    //funkcjia zwraca wynik bezposrednio do zmiennej ktora ja wywoluje
  109.    //przydatna przy wyswietlaniu wynikow z uzyciem while
  110.    function fetchAssocWhile($query_name)
  111.    {
  112.        return mysql_fetch_assoc($this->queryResult[$query_name]);
  113.    }
  114.    function fetchRowWhile($query_name)
  115.    {
  116.        return mysql_fetch_row($this->queryResult[$query_name]);
  117.    }
  118.    //wyswietlenie wyniku zapytania w postaci tabelarycznej
  119.    function tableQuery($query_name)
  120.    {
  121.        while($result = $this->fetchRowWhile($query_name))
  122.        {
  123.    
  124.            $i=0;
  125.            while($i<$this->numFields($query_name))
  126.            {
  127.        
  128.                echo $result[$i];
  129.                echo " ";
  130.                $i=$i+1;
  131.            }
  132.            echo"</br>";
  133.        }
  134.    }
  135.    function tableQueryTags($query_name)
  136.    {    
  137.        echo"<table border='3px'>";
  138.        while($result = $this->fetchRowWhile($query_name))
  139.        {
  140.            echo'<tr>';
  141.            $i=0;
  142.            while($i<$this->numFields($query_name))
  143.            {
  144.                echo"<td>";
  145.                echo $result[$i];
  146.                //echo " ";
  147.                echo"</td>";
  148.                $i=$i+1;
  149.            }
  150.            echo'</tr>';
  151.        }
  152.        echo"</table>";
  153.    }
  154.  
  155.  
  156.  
  157. }
  158.  
  159. ?>


oraz z klasą do obslugi uzytkownika - users.inc.php (na razie taki cwiczebny zalazek bo tu utknalem)

  1. <?php
  2.  
  3.  /**
  4.    * @author 5513458585
  5.    * @copyright 2008
  6.    */
  7.  include_once('database.inc.php') ;
  8.  
  9.  class cUsers{
  10.      
  11.      
  12.      public $id;
  13.      public $name;
  14.      public $surname;
  15.      public $level;
  16.      public $login;
  17.      public $pass;
  18.      public $email;
  19.      
  20.      public function __construct()
  21.      {
  22.          $this->id=0;
  23.          $this->name="";
  24.          $this->surname="";
  25.          $this->level=0;
  26.          $this->login="";
  27.          $this->pass="";
  28.          $this->email="";
  29.      }
  30.      function ustawdane($i,$nam,$sur,$lev,$log,$pas,$em)
  31.      {
  32.          $this->id=$i;
  33.          $this->name=$nam;
  34.          $this->surname=$sur;
  35.          $this->level=$lev;
  36.          $this->login=$log;
  37.          $this->pass=$pas;
  38.          $this->email=$em;        
  39.      }
  40.      function wyswietldane()
  41.      {
  42.          echo '</br>Dane obiektu cuser</br>';
  43.          echo $this->id;
  44.          echo '</br>';
  45.          echo $this->name;
  46.          echo '</br>';
  47.          echo $this->surname;
  48.          echo '</br>';
  49.          echo $this->level;
  50.          echo '</br>';
  51.          echo $this->login;
  52.          echo '</br>';
  53.          echo $this->pass;
  54.          echo '</br>';
  55.          echo $this->email;
  56.          echo '</br>';    
  57.      }
  58.      function dodajdobazy()
  59.      {
  60.          $dane=new Sql;
  61.          $zapytanie = "INSERT INTO users  (usr_id,usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email  ) VALUES  ('$this->id','$this->name','$this->surname','$this->level','$this->login','$this->pass','$this->email')";
  62.          $dane->query($zapytanie, "dodana_osoba");
  63.          echo"</br></br>przetworzono  ".$dane->affectedRows()."wierszy </br>Wykonano  ".$dane->queries." zapytan";
  64.      }
  65.      
  66.      
  67.  }
  68.  
  69.  ?>


dzialanie moich wypocin testuje sobie wyswietlajac w pliku index.php wyniki zapytan:

  1. <?php
  2.    
  3.    //include_once('database.inc.php') ;
  4.    include_once('users.inc.php') ;
  5.    
  6.    
  7.    $a = new Sql();
  8.    
  9.    $a->query("SELECT usr_id, usr_imie, usr_email FROM users ", "moje_zapytanie");
  10.    
  11.    echo '</br>ilosc wierszy to '.$a->numRows("moje_zapytanie");
  12.    echo '</br>ilosc kolumn to '.$a->numFields("moje_zapytanie");
  13.    echo '</br>';
  14.    
  15.    echo"</br>Wyswietlenie wyniku zapytania w postaci tabelki</br></br>";
  16.    $a->tableQueryTags("moje_zapytanie");
  17.    ?>


oraz w pliku dodaj.php gdzie dodaje kilku testowych użytkowników korzystając ze zdefiniowanych wczesniej klas do obslugi zapytan do bazy oraz do obslugi userów

dodaj.php

  1. <?php
  2.    
  3.    /**
  4.      * @author 5513458585
  5.      * @copyright 2008
  6.      */
  7.    include_once('database.inc.php') ;
  8.    include_once('users.inc.php') ;
  9.    
  10.    $osoba = new cUsers();
  11.    $osoba2 = new cUsers();
  12.    $osoba3 = new cUsers();
  13.    $osoba4 = new cUsers();
  14.    
  15.    $osoba->ustawdane(88,"Peslaw","Podraza",3,"mario","qqqaaa","marian@o2.pl");
  16.    $osoba2->ustawdane(99,"Bolek","Polak",2,"miro","aaa","miro@o2.pl");
  17.    $osoba3->ustawdane(67,"Bolek","Polak",2,"miro","aaa","miro@o2.pl");
  18.    $osoba4->ustawdane(14,"Bolek","Polak",2,"miro","aaa","miro@o2.pl");
  19.    
  20.    $osoba->dodajdobazy();
  21.    $osoba2->dodajdobazy();
  22.    $osoba3->dodajdobazy();
  23.    $osoba4->dodajdobazy();
  24.    
  25.    
  26.    echo '</br></br><a href="index.php">powrot do indexss</a>';
  27.    
  28.    
  29.    ?>


I tu własnie pojawia sie przedziwny problem nad ktorym siedze juz kilka ladnych godzin - przy wykonaniu skryptu dodawania userow wszystko niby idzie po koleji, ale kolejne rekordy w tabeli pojawiaja sie losowej kolejnosci zamiast po koleji na koncu tabeli - jest to zupelnie nieprzewidywalne - i tu moje pytanie -o co kaman questionmark.gif

przykład (czecia kolumna na potrzeby testu posłuzyła jako oznaczenie kolejnych wywolan skryptu - widzicie jak przedziwnie wstawia rekordy questionmark.gif pierwsze wywolanie skryptu z pusta tablica, potem kolejne i potem trzecie)


67Bolek2miro@o2.pl99Bolek2miro@o2.pl88Peslaw2marian@o2.pl14Bolek1miro@o2.pl67Bol
k1miro@o2.pl99Bolek1miro@o2.pl88Peslaw1marian@o2.pl14Bolek2miro@o2.pl88Peslaw3ma
ian@o2.pl99Bolek3miro@o2.pl67Bolek3miro@o2.pl14Bolek3miro@o2.pl

(przeszkadza troszke to ograniczenie długosci postu smile.gif nie mogę edytowac tematu bo za długi smile.gif )


67Bolek2miro@o2.pl99Bolek2miro@o2.pl88Peslaw2marian@o2.pl14Bolek1miro@o2.pl67Bol
k1miro@o2.pl99Bolek1miro@o2.pl88Peslaw1marian@o2.pl14Bolek2miro@o2.pl88Peslaw3ma
ian@o2.pl99Bolek3miro@o2.pl67Bolek3miro@o2.pl14Bolek3miro@o2.

(no nic, widze, ze to chyba automat łaczy te posty i tym bardziej nie moge edytowac mojego wczesniejszego postu sad.gif )

kolejnosc w ktorej wpisy w bazie to (trzecia kolumna oznacza w ktorym wywolaniu skryptu dodaj.php byl dodawany dany rekord, czyli powinny byc po koleji cztery jedynki, dwójki i trójki , a jest jak jest)

67 Bolek 2 miro@o2.pl
99 Bolek 2 miro@o2.pl
88 Peslaw 2 marian@o2.pl
14 Bolek 1 miro@o2.pl
67 Bolek 1 miro@o2.pl
99 Bolek 1 miro@o2.pl
88 Peslaw 1 marian@o2.pl
14 Bolek 2 miro@o2.pl
88 Peslaw 3 marian@o2.pl
99 Bolek 3 miro@o2.pl
67 Bolek 3 miro@o2.pl
14 Bolek 3 miro@o2.
michalg
Witam,

Nie znam się na mysql, ale domyślam się, że są tam klucze podstawowe oraz typy sekwencyjne (z automatycznym nadawaniem wartości). Do czego jest kolumna usr_id? Dlaczego ją ustawiasz ręcznie? Przy tworzeniu nowego użytkownika. Jeżeli nie musisz nadawać im określonych idów, to zrób z tej kolumny klucz podstawowy, którego wartości same się będą zwiększać. Albo utwórz inną kolumnę do tego. Wtedy będziesz mógł po niej sortować, jeżeli będziesz potrzebował kolejności dodawania użytkowników.
marcio
Dokladnie zgadzam sie z przedmowca masz takie cos przy tworzeniu tabeli:
Kod
`usr_id` int(8) NOT NULL default '0',

Usun ten defualt bo jest on niepotrzebny i potem daj auto_increment i primary key na ta kolumne potem zmien zapytanie na te wyzej i powinno hulac.

  1. <?php
  2. $a->query("SELECT usr_id, usr_imie, usr_email FROM users ", "moje_zapytanie");
  3. ?>


Zamien na:
  1. <?php
  2. $a->query("SELECT usr_id, usr_imie, usr_email FROM users order by usr_id desc ", "moje_zapytanie");
  3. ?>
blackdog
w tej tabeli nie ma na razie żadnych danych - bo to taki tylko pojemnik na dane, pomocny przy napisaniu kilku klas własnie obslugujacyh dodawanie danych do tabel w bazie -

nie ma wiec w tej tabeli zadnych kluczy - po prostu taki zestaw kilku pol do ktorych wrzucam dane uzytkownika - i problemem jest to, ze zamiast kazdy rekord dodawac pod ostatnim wpisem to zachowuje sie conajmniej dziwnie :

np dodajac pojedyncze rekordy - doadaje je na pierwszym miejscu, na poczatku tabeli, zamiast na koncu pod ostatnimi rekordami

jak dodaje po kilka rekordow na raz (tak jak w przykladzie) to tez zasadniczo dodaje tez tak samo czyli :

3c
3b
3a
2c
2b
2a
1c
1b
1a


grupami ale zawsze rekordy są na poczatku tabeli zamiast na koncu i w dodatku w odwrotnej kolejności niz ich dodawanie było wywoływane w skrypcie (liczba - kolejne wywolanie skryptu w ktorym są dodawane nowe rekordy, cyfry - kolejnosc dodania rekordow w skrypcie - powinno byc abc smile.gif a jak widac w bazie zapisuje sie tez na odwrot)

oraz czasami potrafi pozamieniać kolejność losowo (tak jak w przykładzie) a czasem po dodaniu kilkunastu rekordów zaczyna dodawać prawidłowo - i nie mam pojęcia czym to może być spowodowane, bo to najprostsze możliwe dodawanie za pomocą inserta, bez żadnych kluczy i niczego smile.gif tak samo zachowuje sie u mnie na localu jak i na koncie www w necie, czyli wina tkwi gdzieś w skryptach sad.gif


wiadomo, ze najprosciej mozna posegregowac wyswietlanie, ale problem polega na tym, ze kolejnosc zapisanych danych w bazie rozni sie od tej w jakiej powinny byc zapisane .... i stad moje zdziwko , bo nie spotkalem sie nigdy zeby dane w bazie zapisywaly sie w innej kolejnosci niz to jest wywolywane w skrypcie, w dodatku były dopisywane zamiast na koncu tabeli to na poczatku sad.gif
michalg
Ale skąd wniosek, że to kolejność zapisywania a nie wydobywania jest zła?

A klucz podstawowy w tabeli powinien być zawsze. Bo jak inaczej chcesz identyfikować wiersze?
marcio
Sluchaj nie mam teraz zabardzo czasu zeby ogladac caly twoj kod ale to jest podejrzane:
  1. <?php
  2. function numRows($query_name)
  3.    {
  4.        return mysql_numrows($this->queryResult[$query_name]);
  5.    }
  6.    
  7.    //ilosc kolumn
  8.    function numFields($query_name)
  9.    {
  10.        return mysql_numfields($this->queryResult[$query_name]);
  11.    }
  12. ?>


Hmmm return mysql_numrows($this->queryResult[$query_name]); raczej mysql_num_rows() moze i jest mysql_numrows() ale w starszych wersjach Mysql i to tez moze byc przyczyna ze w nowszej wersji zle sie to zachowuje to raz a dwa to to ze jesli nie ma klucz(id) ani auto_increment to dane moga byc wsadzane wedlug sortowania w mysql skoro nie ma zadnych kluczy wedlug ktorych sortowac/dodawac dane moze i sie myle.

Sproboj zrobic to ci ci napisalem w poscie wyzej i powiedz czy dziala tak samo.

P.S mysql_numfields() chyba tez powinno byc mysql_num_fields();
blackdog
hmm, moze faktycznie jezeli niema zadnego klucza zdefinowanego, to MySql sobioe jakos przedziwnie sam sortuje i wsadza dane w klejnosci przez siebie ustalonej, bo dla testów sprobowalem dodac pare rekordow w sposob calkowicie klasyczny :

  1. <?php
  2.  
  3. /**
  4.  * @author 5513458585
  5.  * @copyright 2008
  6.  */
  7.    $host="localhost";
  8.    $user="stws";
  9.    $pass="123qwe";
  10.    $db_name="stws";
  11.    
  12.  
  13.  
  14. $polaczenie = mysql_connect($host,$user,$pass);
  15. mysql_select_db($db_name,$polaczenie);
  16.  
  17. $zapytanie1 = "INSERT INTO users (usr_id,usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES (77,'Peslaw','Podraza',3,'mario','qqqaaa','marian@o2.pl')";
  18.  
  19. $zapytanie2 = "INSERT INTO users (usr_id,usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES (88,'Peslaw','Podraza',3,'mario','qqqaaa','marian@o2.pl')";
  20.  
  21. $zapytanie3 = "INSERT INTO users (usr_id,usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES (99,'Peslaw','Podraza',3,'mario','qqqaaa','marian@o2.pl')";
  22.  
  23. echo 'wykonano zapytanie 1 '.$result1=mysql_query($zapytanie1);
  24. echo 'wykonano zapytanie 2 '.$result2=mysql_query($zapytanie2);
  25. echo 'wykonano zapytanie 3 '.$result3=mysql_query($zapytanie3);
  26. ?>


i zachowuje sie identiko przy kolejnych kilku wywolaniach skryptu tez kolejnosc wpisow w bazie odwrotna niz to okreslono w skrypcie (no i oczywiscie fantazyjnie pomieszana) smile.gif
marcio
No to chyba moja teoria jest prawdziwa biggrin.gif zreszta to bylo chyba logiczne sproboj dac klucze i auto_increment a przy pobieraniu daj warunek order by i zobacz jak sie zacjowa baza
blackdog
wyglada na to, że Twoja teoria sie sprawdza - po ustawieniu w bazie pola usr_id jako klucz główny dla tabeli i włączeniu autoincrement zaczełodziałac poprawnie smile.gif

ciekawi mnie jeszcze czy jest jakis łatwy sposób, żeby zerowac wartosc tego liczniczka smile.gif żeby po usunieciu wszystkiego z bazy id szło znowu od 1 ...
marcio
Usunac tabele i utworzyc ja na nowo biggrin.gif
blackdog
hehe, a jednak guzik smile.gif po usunieciu rekordów zaczeło działac tak samo jak wczesniej smile.gif czyli kolejnosc faktycznych wpisów w tabeli w bazie losowa mimio ze usr_id to klucz główny i ma ustawion autoincrement a dane dodawane są w sposób klasyczny :
  1. <?php
  2.  
  3. /**
  4.  * @author 5513458585
  5.  * @copyright 2008
  6.  */
  7.    $host="localhost";
  8.    $user="stws";
  9.    $pass="123qwe";
  10.    $db_name="stws";
  11.    
  12.  
  13.  
  14. $polaczenie = mysql_connect($host,$user,$pass);
  15. mysql_select_db($db_name,$polaczenie);
  16.  
  17. $zapytanie1 = "INSERT INTO users (usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES ('Marcin','Podraza',1,'mario','qqqaaa','marian@o2.pl')";
  18.  
  19. $zapytanie2 = "INSERT INTO users (usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES ('Krzysztof','Podraza',2,'mario','qqqaaa','marian@o2.pl')";
  20.  
  21. $zapytanie3 = "INSERT INTO users (usr_imie,usr_nazwisko,usr_poziom,usr_login,usr_haslo,usr_email ) VALUES ('Zbigniew','Podraza',3,'mario','qqqaaa','marian@o2.pl')";
  22.  
  23. echo 'wykonano zapytanie 1 '.$result1=mysql_query($zapytanie1);
  24. echo 'wykonano zapytanie 2 '.$result2=mysql_query($zapytanie2);
  25. echo 'wykonano zapytanie 3 '.$result3=mysql_query($zapytanie3);
  26. ?>


hmm, czy nie ma mozliwosci zeby dane były zapisane w tabeli w bazie w takiej kolejnosci jak chce user, czyli powiedzmy po koleji tak jak to następowało, żęby na koncu tabeli były najswiezsze wpisy i zeby na id szło pokoleji a nie całkiem losowo questionmark.gif
michalg
Ale masz order by usr_id?

A dlaczego chciałeś zerować id?
Nie powinieneś się przejmować, że tam są dziury - tak naprawdę to powinno służyć do identyfikacji wiersza, nie do wyświetlania.
marcio
Hmmm teraz juz dokonca nie rozumiem biggrin.gif

Jesli dodasz jakies rekordy to w bazie zawsze ostatni rekord powinien byc pierwszy jesli kazdy wpis ma id(z auto_increment i primary keys) w przeciwnm wypadku moze pokazywac jak chce lub za pomoca kryterium ktore jest w SORTUJ WEDLUG KLUCZA i wybierasz wedlug jakie kolumny ma sortowac

Hmm wynik wyjasnienia tabeli user_n

Kod
table                           type                           possible_keys                           key                           key_len                           ref                           rows                           Extra                                          user_n     ALL     [i]NULL[/i]     [i]NULL[/i]     [i]NULL[/i]     [i]NULL[/i]     4     Using filesort


Moze to cos znaczy? Nie znam sie az tak na Mysql

jednak gdy pobierasz rekordy ktore maja auto_increment i primary key za pomoca sortowania w sql order by jest ok?

@michalg mu chyba chodzi ze przegladajac zawartosc tabeli w phpmyadmin wpisy sa zle sortowane

P.S2 doczytalem sie jednej rzeczy nie wiem czy dziala bo nie sprawdzalem zeby wyzerowac id gdy nie ma juz rekordow w danej tabeli sproboj uzyc zapytania:
Kod
ALTER TABLE `table` AUTO_INCREMENT = 0
blackdog
hmm, ja sprawdzam sobie co jest w bazie takze zpod phpmyadmina smile.gif więc to order_by_id przy wyswietlaniu akurat mi nie jest konieczne - bo oczywiscie przy wyswietlaniu mozna segregowac

mnie po prostu denerwuje, ze w bazie rekordy są pomieszane i zamist powiedzmy kolejnych id:

44
45
46
47

mam kolejnosc ustaloną w jakis kosmiczny sposób przez baze danych czyli np:


45
48
47
46

wczesnie juz troszke działałem na bazach danych i z php i z jsp - tylko miałem delikatną przerwę smile.gif i nie spotkałem sie nigdy z czyms takim, zeby tak wpisywało rekordy do bazy - zawsze rekordy były zapisywane jeden pod drugim w takiej kolejnosci jak były dodawane - a tu taki zonk i nie wiem o co kaman i tu jest problem czy inne osoby też tak mają czy to tylko ja .....bo po prostu mocno mnie to irytuje, ze nie mogę w żaden sposób wymusic na tej cholernej bazie zeby zapisywała dane jak należy smile.gif

PS.
ten autoinkrementujacy sie liczniczek nie sksowal mi sie po usunieciu tabeli a nawet po restrcie bazy smile.gif
marcio
Cytat
PS.
ten autoinkrementujacy sie liczniczek nie sksowal mi sie po usunieciu tabeli a nawet po restrcie bazy smile.gif


Sproboj zrobic tak jak napisalem w P.S2

Tylko dana tabela nie moze miec rekordow bo jak nie moze w ogole nic nie dzialac
blackdog
PS.2 dział smile.gif ładnie zeruje ten liczniczek smile.gif

po dodaniu do zapytania sortowania po id skrypt zaczął wyswietlac dane posegregowane smile.gif czyli w poprawnej kolejnosci, co ciekawe w phpmyadmi też podglad zawartosci wyswietla sie tak posortowany czyli w teori tak jak wpisy były dodawane smile.gif co ciekawe moim kolejnym eksperymentem było ponowne wyciachanie tego sortowania po id z zapytania smile.gif żeby zobaczyc co sie stanie - i o dziwo dalej wszystko jest posortowane tak jak ma byc smile.gif w phpmyadmin też smile.gif zobaczymy co bedzie dalej - robie jeszcze jeden eksperyment - wywalam tabele z bazy , łąduje ją od nowa na czysto z pliczku sql i odpalam skrypty smile.gif
marcio
Moze poprostu cos sie przestawilo w bazie i po dodaniu order by wszystko wrocilo do normy no coz przynajmniej wiem znamy nastepne segrety bazy Mysql
blackdog
a jeszcze mam pytanie takie smile.gif

używając tej klasy Sql tworze sobie obiekty gdzie w konstruktorze inicjowane jest połączenie z bazą danych.

mam też destruktor, gdzie połączenie jest zamykane

i teraz jest taki zonk, że przy tworzeniu połaczenia, niezaleznie od tego, ile obiektow sql utworzę i gdzie, to we wszystkich tych obiektach identyfikator połaczenia z bazą (czyli $cid) ma wartosc #5 (tak to przynajmniej wyswietla smile.gif

i tu jest własnie zonk - pokaze przyklad:
  1. <?php
  2.  
  3. include_once('database.inc.php') ;
  4. include_once('users.inc.php') ;
  5.  
  6.  
  7. $a = new Sql();
  8.  
  9.  
  10. $a->query("SELECT usr_id, usr_imie, usr_nazwisko,usr_poziom FROM users ", "moje_zapytanie");
  11.  
  12. echo'</br></br>Sprawdzenie działania użytkownika</br>';
  13.  
  14. $osoba=new cUsers();
  15. $osoba->wyswietldane();
  16. echo'</br>teraz przypiszemy tej osobie dane z bazy danych</br>';
  17. $osoba->ustaw_zbazy_id(1);
  18. echo'</br>Dane z bazy przypisane</br>';
  19. $osoba->wyswietldane();
  20. ?>


bo w klasie cUsers jest funkcyjka gdzie podkaladm z bazy danych do obiektu dane przykladowej osoby o podanym id

i wewnatrz tej funkji tez jest oczywiscie wykonywane zapytanie z uzyciem klasy sql - i ono tez tworzy połaczenie z baza o identyfikatorze połączenia $cid = #5


Co z tego wynika - przy wyjsciu z tej funkcji destruktor ubija to polaczenie (o indentyfikatorze #5) i po wykonaniu pliku index.php gdy destruktor chce zniszczyc polaczenie tworzone przy obiekcie $s (jedna z pierwszych linijek) to wywala warninga, bo juz nie ma takiego polaczenia - zamkniete wewnatrz funkcji...

i dla eksperymentów zrobilem kilka obiektow klasy sql i sprawdzilem, jakie maja identyfikatory polaczenia - i wyglada na to, ze wszystkie maja zawsze ten sam - czy to jest normalne i tak powinno byc ? bo przy czyms takim wywala mi sie destruktor majacy zamykac polaczenia smile.gif

Czy olac to i po prostu wywalic destruktor i zdac sie na automatyczne zamykanie polaczen przez php ?
marcio
Cytat
Czy olac to i po prostu wywalic destruktor i zdac sie na automatyczne zamykanie polaczen przez php ?

Mysle ze bym nie kombinowal i bym tak zrobil lub zamykal polaczenie recznie za pomoca sqlClose();
blackdog
znalazłem rozwiązanie w innym świeżo założonym wątku smile.gif
kostruktor klasy odpowiadajacej za obsluge bazypowinien wygladac tak
  1. <?php
  2. function __construct()
  3.       {
  4.           //łaczenie sie z baza danych o padanych parametrach
  5.        $this->cid=mysql_connect($this->host, $this->user, $this->pass,true)or die($this->error("Problem z nawiazaniem polaczenia"));
  6.        //wybor bazy danych
  7.        mysql_select_db($this->db_name, $this->cid)or die($this->error("Problem z wybraniem bazy"));
  8.       }
  9. ?>


w konstruktorze w wywołaniu funkcji mysql_connect($host,$user,$pass,TRUE) brakowało włąsnie tego 4tego parametru TRUE który decyduje czy nawiazac nowe połączenie do bazy (jeżeli jest) czy zwrócic identyfikator aktualnego połaczenia (jeżeli nie ma parametru lub jest FALSE)

smile.gif

fajne to forum smile.gif
marcio
No widzisz jesli masz jeszcze jakies pytanie pytaj chetnie pomysle i pomoge sam sie czegos wiecej nauczylem z tego watku biggrin.gif
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.