Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytaniem php do bazy jako wybor opcji formularza
Forum PHP.pl > Forum > Bazy danych > MySQL
Dafidov
Witam Wszystkich.
Od wczoraj się grzebie szukam i szukam i jakoś znaleść nie mogę ani u siebie w kodzie ani na forum odpowiedzi jak rozwiązać mój problem.
Piszę baza w której mam stuudentów pracowników przedmioty itd coś ala elektroniczny indeks, tablica ogłoszeń.
Chce zrobic sobie ładnego selecta który będzie mi z jednej tabeli pobierał dane jako opcje do wyboru i ciągle wyrzuca mi ale pustą liste select otion.
Oto kod:
Kod
tytuł naukowy: <select name="tytul_naukowy">
<?php
$querry = "select skrot from tytul_naukowy where skrot like '%'";
$result = mysql_querry($querry);

while ($row = mysql_fetch_array($result))  {
$tytul = $row['tytul'];
?>
<option value="<?php echo"$tytul"; ?>"><? echo"imie"; ?></option>
<?php } ?>
</select>

Mam w bazie tabele tytul_naukowy z polami id skrot nazwa i chce zeby w liscie select mozna bylo wybrac jedne ze skrotwo typu:
mgr inż dr prof.
Nie wiem czy błąd jest w konstrukcji zapytania w php czy w samym mysql.

Proszę o pomoc i rade jak napisać takiego prawidłowego selecta, który będzie z bazy generował mi listę wyboru.


Drugi problem jest nieco bardziej skomplikowany i też jest bardziej z Mysql niż z php ale też nie wiem jak napisać parwidłowo formułe w php żeby moć wpisując tego naszego pracownika, któremu chcę dodawać tytuł naukowy, dodać pole adres które jest kluczem obcym odwolujadej sie do tabeli adres.
Tabela pracownika ma takie pola:
id, id_grupa, imie, nazwisko, username, haslo, id_adres.
Klucz glowny to id.
Klucze obce to id_grupa i id_adres.
Tabela adres ma takie parametry:
id id_user ulica nr domu miejscowosc itd
Jak napisac formularz zeby dodawac pracownika w taki sposb zeby mozna bylo od razu wpisac jego adres? Czy da sie to zrobic i jesli tak to prosze o podopwoiedz.
Z gory dziekuje.
Mam nadzieje iz moj opis jest dosc scisly...
Pracuje na Mysql 5 i php 5
nospor
mysql_querry - nie ma takiej funkcji smile.gif
jest: mysql_query

prosze uzywac wlasciwego bbcode

ps: przenosze na przedszkole
Dafidov
Lepszp rydz niż nic jak to mówią.
Query działa - dostaje taką listę jaką chciałem.
Nie wiem nadal jak rozwiązać i czy da się to w jakiś prosty sposób napisać:
CZY da się do tworzonego formularza, który ma dodać dane do bazy utworzyć takie pola, które będą dodawać adres w tabeli użytkownika, który jest kluczem obcym.

Dokładniej opisałem o jakie tabele mi chodzi w pierwszym poście.

Zaczynam mieć wątpliwości czy uda mi się otrzymać odpowiedź na to troche bardziej skomplikowane pytanie...

No cóż zawsze trzeba jednak mieć nadzieje smile.gif

LICZE NA WAS

Jeśli ktoś ma jakieś propozycje to będę bardzo wdzięczny za przykładowy kod.
Z góry dziękuje i pozdrawiam.
kanan
Jesli adres jest kluczem obcym, to by bylo mozliwe dodanie go do bazy musi istniec w tabeli adresy. Czyli powinienes zrobic podobny manewr jak w przypadku listy stanowisk czy tytulow. Jesli bowiem nie bedzie danego adresu w tabeli adresy nie uda Ci sie dodac pracownika do tabeli uzytkownicy.
Dafidov
Czyli jak to zrobic?
Najpierw musze utworzyc w formularzu dodajaceym urzytkownika formularz dodajacy jego adres, a pozniej dodawac dopiero pracownika w drugim formularzu?
Sprawa jest o tyle trudna ze ta baza jest troszke skomplikowana bo musialem w niej stworzyc sporo tabel i duza ich ilosc opiera sie na kluczach obcych w zwiazku z czym ilekroc jakas bardziej strategiczna tabele chce ruszyc to przy dodawaniu danych wywala bled ze nie mozna wstawic danych ze wzgledu na klucz obcy:
Kod
Cannot add or update a child row: a foreign key constraint fails (`baza_fe171/pracownik`, CONSTRAINT `pracownik_ibfk_5` FOREIGN KEY (`id_adres`) REFERENCES `adres` (`id`) ON UPDATE CASCADE)1452


Jeszcze jedno pytanie - co jest lepsze przy tworzeniu kluczy obcych i czym sie kierowac tworzac je: ustawilem sobie:

Kod
on update cascade on delete restrict

i zastanawiam sie czy nie bylo by lepsze ustawienie wszystkiego na cascade ale nie wiem za bardzo jaki to bedzie mialo wplyw na baze bo w zasadzie sporo danych z kilku tabel tylko pobieram i nie sa ruszane.


Zakladajac ze dobrze mysle i ide w dobrym kierunku i bede chcial to zrobic tak jak pisze tzn. wstawic wszystkie dane lacznie z adresem za jednym zamachem w jednym formularzu ( bo chyba tak trzeba to bedzie zrobic). Jak powiazac ze soba Id_usera - czyli pracownika i id_adresu do ktorego bede te dane wiazal jako klucze obce.

Jak powinna taka klauzula (kod php) wygladac?
kanan
Nie rozumiem jednego, w jakim aspekcie uzywasz adresu? Czy jest to adres uzywany przez jedna osobe i tylko wylacznie przez nia, bo w takim przypadku rzeczywiscie mija sie z celem w ogole wprowadzanie klucza obcego i tym samym wybieranie z listy. Jesli natomiast adres jest ten sam dla grupy osob, bo np. jest to adres siedziby danego dzialu firmy to jak najbardziej takie cos moze miec miejsce.

Dzialanie prawidlowe byloby nastepujace:

Jesli nowy adres -> formularz dodania firmy, jesli nie wybor z listy.

Oczywiscie moglbys zrobic jeszcze inaczej, w zaleznosci od tego co jest kluczem glownym - jesli jest to nazwa ulicy, lub cos takiego to po prostu najpierw sprawdzic, czy dany adres nie istnieje w tabeli adresy, jesli nie istnieje to go dodac, nastepnie pobrac identyfikator nowo wstawionego adresu i dodac uzytkownika z identyfiaktorem adresu do bazy. To tez jest jakies rozwiazanie, jednak wydaje sie, ze moze tu sie pojawic manipulacja zwiazana z nazwa, wystafczy dodac literke i nazwa moze byc juz inna. W przypadku takich samych wpisow rowniez bylo troche zachodu.

Co do duzej liczby tabel, to warto pomyslec, czy taka liczba rzeczywiscie jest potrzebna pamietajac o dosc kosztownej operacji polaczenia.

Pozdrawiam
Dafidov
Baza ktora tworze posiada tabele adres, do ktorej 3 grupy uzytkownikow bede mialy dostep. Tzn. w tabeli student mam klucz obcy id_adres odwolujacy sie do tabeli adres, w tabeli pracownik tez mam taki sam klucz obcy oraz w tabeli wydzial.

Musze to tak zrobic no chyba ze moja koncepcja jest beledna ale wydaje mi sie iz po to tworzy sie baze aby nie bylo powielania danych w roznych miejscach czyli jesli wielu uzytkownikow ma kilka wspolnych pol tonajlepiej je wyizolowac i dac do jednej tabeli i tak tez zrobilem u mnie.

Na pewno bedzie tam sporo wpisow gdyz bedzie ona miala wielu studentow troche mniej pracwonkiow i jeszcze mniej wydzialow powiedzmy 6.

Raczej dane nie beda sie powielaly tylko za kazdym razem bede dodawala nowego studenta i pracownika.

Adres
  1. CREATE TABLE adres(
  2. id mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. id_user mediumint(10) UNSIGNED NOT NULL,
  4. ulica varchar(60) NOT NULL DEFAULT 'ul. ',
  5. nr_domu varchar(10) NOT NULL,
  6. nr_mieszkania varchar(10),
  7. kod_pocztowy varchar(10) NOT NULL,
  8. miejscowosc varchar(50),
  9. id_woj int(11) NOT NULL,
  10. telefon_stac mediumint(16) UNSIGNED DEFAULT '0',
  11. telefon_kom mediumint(16) UNSIGNED DEFAULT '0',
  12. fax mediumint(16) UNSIGNED DEFAULT '0',
  13. email varchar(30) NOT NULL,
  14. PRIMARY KEY (id),
  15. INDEX (id_student),
  16. FOREIGN KEY (id_student) REFERENCES student(id) ON UPDATE cascade ON DELETE restrict,
  17. INDEX (id_woj),
  18. FOREIGN KEY (id_woj) REFERENCES wojewodztwa(id) ON UPDATE cascade ON DELETE restrict)
  19. type=innodb;


Pracownik
  1. CREATE TABLE pracownik(
  2. id mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. id_wydzial mediumint(10) UNSIGNED NOT NULL,
  4. id_tytul mediumint(10) UNSIGNED NOT NULL,
  5. imie varchar(20) NOT NULL,
  6. nazwisko varchar(40) NOT NULL,
  7. username varchar(20) NOT NULL,
  8. haslo varchar(20) NOT NULL,
  9. rejestracja datetime,
  10. STATUS tinyint(4) NOT NULL DEFAULT 2,
  11. id_adres tinyint(2) UNSIGNED NOT NULL,
  12. id_przedmiot mediumint(10) UNSIGNED NOT NULL,
  13. id_grupa mediumint(10) UNSIGNED NOT NULL,
  14. PRIMARY KEY (id),
  15. INDEX (id_przedmiot),
  16. FOREIGN KEY (id_przedmiot) REFERENCES lista_przedmiotow(id) ON UPDATE cascade ON DELETE restrict,
  17. INDEX (id_wydzial),
  18. FOREIGN KEY (id_wydzial) REFERENCES wydzial(id) ON UPDATE cascade ON DELETE restrict,
  19. INDEX (id_tytul),
  20. FOREIGN KEY (id_tytul) REFERENCES tytul_naukowy(id) ON UPDATE cascade ON DELETE restrict,
  21. INDEX (id_grupa),
  22. FOREIGN KEY (id_grupa) REFERENCES grupa(id) ON UPDATE cascade ON DELETE restrict),
  23. INDEX (id_adres),
  24. foreigen KEY (id_adres) REFERENCES adres(id) ON UPDATE cascade ON DELETE restrict)
  25. type=innodb;


Wydzial
  1. CREATE TABLE wydzial(
  2. id mediumint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. skrot varchar(10) NOT NULL,
  4. nazwa varchar(60) NOT NULL,
  5. id_adres mediumint(10) UNSIGNED NOT NULL,
  6. PRIMARY KEY (id),
  7. INDEX (id_adres),
  8. FOREIGN KEY (id_adres) REFERENCES adres(id) ON UPDATE cascade ON DELETE restrict)
  9. type=innodb;


To przykladowe trzy tabele, ne bede wrzucal studenta bo zabardzo by to jeszcze moglo tylko na mieszac a tak moze bedzie troszke bardziej zrozumiale.

Wszystkie dane podaje w formularzu zeby dodac usera konkretnego i jak juz wspomnialem we wczesniejszm poscie zwrac blad gdu chce dodac pracwonika ktory nie ma jeszcze dodanego adres, stad moje pytanie - jak to zrobic? tzn jednorazowo do tego samego formularza od razu dolaczyc dane adrsowe?

Jesli tak to jak powiazac (stworzyc i napisac w php) kod ktory wstawi to samo id_pracownika w tabeli adres a za razem to samo id_adres w tabeli pracownicy tak zeby te dane byly ze soba powiazane.

Mam nadzieje ze teraz sprawa jest nieco jasniejsza smile.gif
nospor
W formularzu podajesz wszystkie dane: adres i pracownika.
Następnie najpierw wkladasz adres. Potem metodą:
http://pl.php.net/manual/pl/function.mysql-insert-id.php
pobierasz id tego adresu. mając to id, wpisujesz do bazy pracownika.

edit:
czemu w tabeli adres dalej relacje do student? Powinno byc na odwrot. Przeciez tabela adres bedzie sie odnosic do roznych tabel, nie tylko do studenta
Dafidov
Zaczytałem się w manualu php smile.gif
No to jest pewna niekonsekwencja z tym że w adresie odwołuje się spowrotem do studenta, musze to usunąć ponieważ początkowo myślałem o stworzeniu w tabeli adres pola id_user (tak jak jest to w definicji) ale jest to faktycznie niepotrzebne bo później przeanalizowałem to że i tak będę się odwoływał z różnych tabel tylko do id tabeli adres a nie na odwrót czyli z tabeli aders user_id do tabeli różnych użytkwoników smile.gif

z tego co znalazłem w Twojej podopwiedzi wynika że musze użyć klauzli:
  1. <?php
  2. $adres_query="INSERT INTO adres (id, ulica, nr_domu, nr_mieszkania, itd) VALUES (NULL,'Skalna', '10', '20', itd)";
  3. $pracownik_query="INSERT INTO pracownik(id, id_adres, id_wydzial, ...) VALUES (NULL, LAST_INSERT_ID, 'id_wydzial',...)";
  4.  
  5. $a_query=mysql_query($adres_query);
  6. $t_query=mysql_query($pracownik_query);
  7.  
  8. ?>


Zaraz bede to testowal.
Mam nadzieje ze juz pojdzie tak jak trzeba smile.gif

Jeszcze tylko zastanawia mnie jedna rzecz:
Skoro w mojej strukturze tabeli pracownika id_adres jest na którejś tam dalszej pozycji a nie zaraz za id czy jesli bede dokonawyal insertu w tej kolejnosci jak podaje ( no bo musze pierwszego inserta zaraz za typem auto_increment wziac dla id_adres bo inaczej wezmie mi poda inne LAST_INSERT_ID i nic nie zadzialam) to czy nie bedzie wywalallo mi bledu ze jaks jest zla kolejnosc ....

Ostatnia uwaga:

nospor - moze by tak ten temat jednag przeniesc do php albo MYSQLa bo problem nie jest tak trywilany jak by sie na poczatku wydawalo, a podobnych zagadnien nie udalo mi sie znalesc wczesniej na forum - przynajmniej tych które by ta kwestie wstawainia w jendej transakcji id tych samych dotyczyly, w koncu od literowki querry zamist query tu wyladowalem w przedszkolu winksmiley.jpg tongue.gif
nospor
LAST_INSERT_ID zwraca ci ostatnio dodane id do bazy. tak jak masz teraz jest dobrze.

Cytat
nospor - moze by tak ten temat jednag przeniesc do php albo MYSQLa bo problem nie jest tak trywilany jak by sie na poczatku wydawalo, a podobnych zagadnien nie udalo mi sie znalesc wczesniej na forum - przynajmniej tych które by ta kwestie wstawainia w jendej transakcji id tych samych dotyczyly, w koncu od literowki querry zamist query tu wyladowalem w przedszkolu
hehe, lekcja dla Ciebie: nie mieszaj banalow z powaznymi rzeczami. W twoim topicu najpierw doczytalem banal, gdyz byl pierwszy. a ze mialem malo czasu, to zająlem sie najpierw nim, nie wczytując się dalej. z racji ze to byl banal - trafil tam gdzie powinien. Juz sam chcialem to przeniesc wyzej, ale pojawil sie Twoj cross... nie ladnie winksmiley.jpg
Ale niech Ci będzie, przenoszę na MySQL. Twoj problem bardziej leży po stronie bazki, niz php.
Dafidov
Troche mi to czasu zajelo ale niestety wywala mi blad sad.gif

Kod
Nieznana kolumna 'LAST_INSERT_ID' w field list1054


Zapytanie wyglada "okazale" smile.gif

  1. $adres_query = "INSERT
  2. INTO adres
  3. (id, ulica, nr_domu, nr_mieszkania, kod_pocztowy, miejscowosc, id_woj, tel_stac, tel_kom, fax, email) VALUES (NULL,'$aul', '$ad', '$sb', '$akp', '$sc', $woj, '$sd', '$se', '$sf', '$ae')";
  4.  
  5. $pracownik_query = "INSERT
  6. INTO pracownik
  7. (id, id_adres, id_przedmiot, id_wydzial, id_tytul, id_grupa, imie, nazwisko, username, haslo, rejestracja) VALUES (NULL, LAST_INSERT_ID, $pr, $wy, $tn, $gr, '$fn', '$ln', '$u', PASSWORD('$p'), NOW())";
  8.  
  9. $result = mysql_query ($adres_query) OR die (mysql_error().mysql_errno()); // Wykonaj zapytanie.
  10.  
  11. $result = mysql_query ($pracownik_query) OR die (mysql_error().mysql_errno()); // Wykonaj zapytanie.
  12.  
  13. IF ($result) { // Jeżeli zostało ono wykonane bez przeszkód.


Pod te wszystkie dziwne zmienne typu $aul, $ad itd wstawiam wyniki z poszczególnych $_POST formularza żeby przepuścić przez funckję:
  1. <?php
  2.  
  3. function escape_data ($data) {
  4. global $dbc; // Potrzebujemy połączenia.
  5. if (ini_get('magic_quotes_gpc')) {
  6. $data = stripslashes($data);
  7. }
  8. return mysql_real_escape_string($data, $dbc);
  9. } // Koniec funkcji.
  10.  
  11. ?>


Później wszytskie zmienne przefiltrowuje przez coś takiego:

  1. <?php
  2.  
  3. / Sprawdź wydział.
  4. if (empty($_POST['id_wydzial'])) {
  5. $wy = FALSE;
  6. $message .= '<div><p>Zapomniałeś wybrać wydział!</p>';
  7. } else {
  8. $wy = escape_data($_POST['id_wydzial']);
  9. }
  10.  
  11. ?>


może ma ktoś pomysł na jakąś pętle i wogóle jak to obejść żebym nie musiał takiego wypaśnego kodu pisać po kilkaset linii...

No ale najwazniejszy problem to to ze wyswietla ten blad ze nie zna LAST_INSERT_ID

Pomóżcie prosze smile.gif
nospor
nasze smile.gif niedopatrzenie. nie : LAST_INSERT_ID a: LAST_INSERT_ID()
Dafidov
Chyba się sam juz URATOWAŁEM smile.gif
Przyspałem że ma być :

LAST_INSERT_ID()

to przecież funkcja - ale po dwóch dniach ślęczenia nad czymś takim człowiek wymięka sad.gif

Pozostaje nadal aktulane moje pytanie dotyczące tego jak zrobić jakąś przyjemną pętle dla tych wszystkich danych, które zczytuje z bazy danych do formularza jako pola select oraz wszystkie pola tekstowe które mają konkretne swoje nazwy które przesyłam do konkretnych pól (w tym przypadku) dwóch tabel, która będzie mi sprawdzała stripslashes.

Funkcje mam ale czy da się jakoś te dane przeskoczyć żeby zunifikować je a za razem nie stracić możliwości przypisywania ich do konkretnych pól tabel w bazie...
nospor
ja bym ci proponowal stworzyc tablicę mapującą. mowisz jakie pola będziesz zczytywal z formularza i tylko po nich lecisz pętlą. To tak na szybko rozwiązanie.
W przypadku duzych formularzy, osobiscie korzystam z klasy do generowania formularzy. zalatwia ona za mnie wszystko: walidacja, wymagalnośc pol, pobranie bezpiecznych wartosci i wiele innych. Klasy takie dostepne są w sieci, choćby na phpclasses.org bądź też napisz sobie wlasną (jak ja winksmiley.jpg )

Ale to juz temat na inny topic...
chyba nie chcesz abym przeniósł laugh.gif (żartuję winksmiley.jpg )
Dafidov
Myśle że przenosin to już wystarczy jak na jeden topic smile.gif winksmiley.jpg

Musze sie przyznac ze jestem z siebie "zadowolony" bo mimo schodow udalo mi sie jakos przebrnac ten etam no i dzieki waszej pomocy smile.gif

Ale z drugiej strony jak sobie pomysle ze to dopiero poczatek... to jestem pewien ze przy tworzeniu formularzy do robienia updatu danych pewnie jeszcze z nie jeden topic zaloze tongue.gif

A czy moge prosic o jakies blizsze informacje o tych tablicach mapujacych?

Podejzewam ze te clasy to chyba juz trosze wyzsza szkola jazdy i nie wiem czy bym sobie poradzil, choc jak by mi ktos podsunal jakiegos dobrego linka gdzie sie z tematem mozna dobrze zaznajomic... to kto wie smile.gif

Na ten weekend zmagan z php i mysqlem wystarczy winksmiley.jpg trzeba teraz chwilke odetchnac i rano do pracy... sad.gif
nospor
Cytat
Myśle że przenosin to już wystarczy jak na jeden topic
eeee, to ty jeszcze malo topicow w swym życiu widziales winksmiley.jpg

Cytat
A czy moge prosic o jakies blizsze informacje o tych tablicach mapujacych?
W zasadzie to troche naduzylem tego slowa "mapujący". Chodzilo mi o zwyklą tablicę, gdzie trzymasz nazwy pol, jakie masz "przelecieć" (bez skojarzeń proszę) z posta. No bo w poscie masz i takie pola, ktore do bazy nie wejdą. No wiec tworzysz tablice z polami do analizy, moze nawet z tekstem jakims o bledzie i lecisz po tej tablicy
  1. <?php
  2. $postarray=(
  3. 'jakiespole'=>'jakistekstobledzie',
  4. 'jakiespole2'=>'jakistekstobledzie2',
  5. 'jakiespole3'=>'jakistekstobledzie3',
  6. );
  7. ?>

Jak jakies pole bedzie mialo byka (np. nie wypelnione) to smazysz mu komunikat dla tego pola. Ale jak slusznie zauwazyles - czas juz spac. reszty sie domysl jak zrobic. Wierzę w Ciebie winksmiley.jpg

Cytat
Podejzewam ze te clasy to chyba juz trosze wyzsza szkola jazdy i nie wiem czy bym sobie poradzil,
Jaka tam szkola. Klasy są juz gotowe. ty musisz ich tylko uzyc
Dafidov
No to trzeba bedzie poszperac troche smile.gif
No ale jak juz mowilem pora spac moze sie cos znajdzie w tygodniu jak bedzie na to czas ...

Jeszcze mi sie zrodzilo jedno pytanko smile.gif

Jak wykonywalem te zapytanka do bazy to okazlo sie ze dwa razy mimo wywalenia bledu przy zapytaniu w bazie wygenerowaly sie jakies dane.
Czy trzeba jakas klauzule w elsie dac typu rollback ( o czyms takim gdzies tam slyszalem i cos takiego mi swita) zeby cofnelo to nieudane zapytanie tzn niedokonczona transakcje czy jest jakas inna metoda lub inny sposb na to zeby nie dopuscici do tego zeby takie niechciane dane wpadly do tabeli ?

Dobranoc Wszystkim smile.gif sleepysmiley03.gif
nospor
To się nazywa tranzakcje:
http://dev.mysql.com/doc/refman/5.0/en/commit.html

PRzed grupą zapytan rozpoczynasz tranzakcję (BEGIN), a potem gdy sie ktores nie powiedzie, to ROLLBACK. Gdy sie wszystkie powiodą to COMMIT
Dafidov
Poczytałem troszkę w manualu i niestety nasuwa mi się więcej pytań niż znam znalazłem odpowiedzi smile.gif

Po pierwsze:
Jak wstawić w php wspomniany (BEGIN) ? Swoją drogą jak oglądałem manuala php to znalazłem tylko tyle że w zasadzie jest coś takiego w fazie testowej i wygląda to tak:
Dla begin tansaction
  1. <?php
  2. /* Begin a transaction, turning off autocommit */
  3. $dbh->beginTransaction();
  4.  
  5. /* Change the database schema */
  6. $sth = $dbh->exec("DROP TABLE fruit");
  7.  
  8. /* Commit the changes */
  9. $dbh->commit();
  10.  
  11. /* Database connection is now back in autocommit mode */
  12. ?>

Dla Commit
  1. <?php
  2. /* Begin a transaction, turning off autocommit */
  3. $dbh->beginTransaction();
  4.  
  5. /* Change the database schema */
  6. $sth = $dbh->exec("DROP TABLE fruit");
  7.  
  8. /* Commit the changes */
  9. $dbh->commit();
  10.  
  11. /* Database connection is now back in autocommit mode */
  12. ?>

Dla rollback
  1.  
  2. <?php
  3. /* Begin a transaction, turning off autocommit */
  4. $dbh->beginTransaction();
  5.  
  6. /* Change the database schema and data */
  7. $sth = $dbh->exec("DROP TABLE fruit");
  8. $sth = $dbh->exec("UPDATE dessert
  9.  SET name = 'hamburger'");
  10.  
  11. /* Recognize mistake and roll back changes */
  12. $dbh->rollBack();
  13.  
  14. /* Database connection is now back in autocommit mode */
  15. ?>

Co zrobic jesli sie nie stosuje obiektow? I wogole jak to wykorzystac tzn zapetlic zeby wykonywalo sie query i konczylo commitem jak jest ok lub konczylo rollbackiem jak jest blad ?

Druga kwestia to taka ze znalazlem funkcje mysqli ktora niejako klopot rozwiazuje:
  1. <?php
  2. $link = mysqli_connect("localhost", "my_user", "my_password", "world");
  3.  
  4. /* check connection */
  5. if (mysqli_connect_errno()) {
  6.  printf("Connect failed: %s\n", mysqli_connect_error());
  7.  exit();
  8. }
  9.  
  10. /* disable autocommit */
  11. mysqli_autocommit($link, FALSE);
  12.  
  13. mysqli_query($link, "CREATE TABLE myCity LIKE City");
  14. mysqli_query($link, "ALTER TABLE myCity Type=InnoDB");
  15. mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50");
  16.  
  17. /* commit insert */
  18. mysqli_commit($link);
  19.  
  20. /* delete all rows */
  21. mysqli_query($link, "DELETE FROM myCity");
  22.  
  23. if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
  24.  $row = mysqli_fetch_row($result);
  25.  printf("%d rows in table myCity.\n", $row[0]);
  26.  /* Free result */
  27.  mysqli_free_result($result);
  28. }
  29.  
  30. /* Rollback */
  31. mysqli_rollback($link);
  32.  
  33. if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
  34.  $row = mysqli_fetch_row($result);
  35.  printf("%d rows in table myCity (after rollback).\n", $row[0]);
  36.  /* Free result */
  37.  mysqli_free_result($result);
  38. }
  39.  
  40. /* Drop table myCity */
  41. mysqli_query($link, "DROP TABLE myCity");
  42.  
  43. mysqli_close($link);
  44. ?>

Tylko co zrobic gdy nie dysponuje sie nowsza wersja mysqla i php? Lub gdy na serwerze nie ma obslugi biblioteki mysqli ?
Jednym slowy:

Jak w php wstawic rozpoczecie sesji i opcje coomit gdy uda sie zapytanie i roolback gdy sie nie uda ?
nospor
begin, commit i rollback to zwykle zapytania mysql i trzeba tak je wykonywac:
  1. <?php
  2.  
  3. mysql_query('begin');//rozpoczęcie transakcji
  4. //i teraz zapytania w tranzakcji
  5. $res = mysql_query('jakieszapytanie');
  6. if ($res === false){//zapytanie się nie powiodlo
  7. mysql_query('rollback');
  8. die('blad');
  9. }
  10. $res = mysql_query('jakiesinnezapytanie');
  11. if ($res === false){//zapytanie się nie powiodlo
  12. mysql_query('rollback');
  13. die('blad');
  14. }
  15. //i tak wszystkie zapytania
  16. //gdy wszystko sie powiedzie:
  17. mysql_query('commit');//koniec :)
  18.  
  19.  
  20. ?>
Dafidov
Dziekuje za pomoc.
Z tym klopotem juz sobie poradzilem ale pojaily sie nowe "problemy". Jako ze sa one blizsze innemu watkowi na tym forum - moje pytanie w tej kwestii zadalem w temacie systemu ocen szkolnych
Bede wdzieczny za pomoc w tej kwestii

UPDATE 2006.03.30 smile.gif
Pojawił mi się nowy kłopot...
Jak rozwiązań kwestię wyświetlania wyników zapytania do dwóch tabel relacyjnych?
W tabeli kierunki_studiow mam pole id_wydzial odwolujace sie do tabeli wydzial o strukturze id, skrot, nazwa, id_adres.
Chce wyswietlic zarejestrowane kierunki ale w taki sposb aby zamist cyferki id_wydzial wyswietlila mi sie pelna nazwa wydzialu pobrana z drugiej tabeli.

.....
wycialem te zle moje pomysly ktore tu podalem
.....

UPDATE 2006.03.31 00:05:00 tongue.gif

Poradzilem sobie exclamation.gif!
Moze rozwiazanie nie jest piekne ale dziala smile.gif Jesli ktos ma lepszy pomysl to bede wdzieczny za sugestie
  1. <?php
  2. $query = "select kierunki_studiow.id, kierunki_studiow.skrot, kierunki_studiow.nazwa,
     kierunki_studiow.id_wydzial, wydzial.id, wydzial.nazwa from kierunki_studiow, wy
    dzial where kierunki_studiow.id_wydzial like wydzial.id order by kierunki_studiow
    .id"
    ;
  3.  
  4. $result = mysql_query ($query); // Wykonaj zapytanie.
  5. $num = mysql_num_rows ($result);
  6.  
  7. if ($num > 0) { // Utwórz zapytanie.
  8.  
  9. echo "W chwili obecnej mamy $num zarejestrowanych kierunków studiów<br><br>";
  10. echo '<table cellspacing="2" cellpadding="2">
  11. <tr><td>Identyfikator</td><td>Skrót</td><td>Pełna nazwa</td><td>Wydział</td></tr>';
  12.  
  13. // Pobierz i pokaż wszystkie rekordy.
  14.  
  15. while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
  16.  
  17. echo "<tr><td>" . stripslashes($row[0]) . "</td><td>$row[1]</td><td>$row[2]</td><td>$row[5]</td></tr>\n";
  18. }
  19.  
  20. echo '</table>';
  21. echo '<br /> <br /> <br />Powrót do strony głównej <a href="index.php" title="Powrot">home</a>';
  22. echo "<br /> \n <br /> \n <br /> \n <br /> \n";
  23.  
  24. mysql_free_result ($result); // Zwolnij zasoby.
  25. } 
  26. ?>
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.