Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]jak przejść z pliku tekstowego do bazy danych?
Forum PHP.pl > Forum > Przedszkole
gregov0
Witam. Mam problem i nie wiem od czego zacząć. Mam skrypt do prowadzenia testu-quizu oparty na pliku tekstowym, a chciałbym aby takowy działał przy pomocy bazy MySql.

  1. <?php
  2. $pytania = file("test.txt");
  3.  
  4. $k5 = "Ocena bardzo dobra";
  5. $k4 = "Ocena dobra";
  6. $k3 = "Ocena dostateczna";
  7. $k2 = "Ocena dopuszczajaca!";
  8. $k1 = "Ocena niedostateczna";
  9.  
  10. $f = $_POST["f"];
  11. $wyniki = $_POST["wyniki"];
  12. srand((double)microtime()*1000000);
  13.  
  14. if ($wyniki>0) {
  15. $ile = count($pytania); $dobre=0;
  16. for ($o=0; $o<$ile ;$o++) if ($f[$o]==1) $dobre++;
  17. $srednia = sprintf("%2d",($dobre/$ile)*100);
  18. echo "<center>Poprawne odpowiedzi: $dobre z $ile. ";
  19. echo "Zaliczone $srednia procent testu.<p>";
  20. if ($srednia<25) echo $k1;
  21. if ($srednia>=25 && $srednia<50) echo $k2;
  22. if ($srednia>=50 && $srednia<75) echo $k3;
  23. if ($srednia>=75 && $srednia<99) echo $k4;
  24. if ($srednia==100) echo $k5;
  25. echo "</center>";
  26. echo "<center><input type=submit value=\" zakoncz \"script language=\"javascript\"onClick=\"zamknijOkno()\"></script></center>";
  27.  
  28.  
  29. } else {
  30. echo "<form action=\"index.php\" method=\"post\">";
  31. echo "<input type=\"hidden\" name=\"wyniki\" value=\"1\" />";
  32. $ile = count($pytania);
  33. for($i=0;$i<$ile;$i++) {
  34. $nr = array_rand($pytania);
  35. $tmp = $pytania[$nr];
  36. $pytania[$nr] = $pytania[count($pytania)-1];
  37. $pytania[count($pytania)-1] = $tmp;
  38. $pyt = explode("`", array_pop($pytania));
  39. echo "<p><b>"; echo $i+1; echo ". $pyt[0] </b><br>";
  40. for ($b=1;$b<=count($pyt)-1;$b++)
  41. $odp[]="<input type=radio name=\"f[$i]\"
  42. value=\"$b\" />$pyt[$b]<br />";
  43. $ileodp=count($odp);
  44. for($io=0;$io<$ileodp;$io++) {
  45. $nr=array_rand($odp);
  46. $tmp=$odp[$nr];
  47. $odp[$nr]=$odp[count($odp)-1];
  48. $odp[count($odp)-1]=$tmp;
  49. echo array_pop($odp);
  50. }
  51. }
  52. echo "<center><br><input type=submit value=\" sprawdz \" /></br></center></form>";
  53.  
  54. }
  55. ?>

pytania i odpowiedzi sa w pliku tekstowym

  1. Stolica polski jest?`warszawa`krakow`gniezno`kalisz
  2. 2+2=?`4`2`3`5
  3. 4+8=?`12`10`23`3

gdzie poprawna odpowiedź jest zaraz za pytaniem, pytania i odpowiedzi są oddzielane znacznikiem " ' " .

Moze mi ktos podpowiedziec jak ma wyglądać kod php który się połączy z bazą i wyciagnie pytania i odpowiedzi tak aby się zintegrował z pozostałym kodem w skrypcie. Dodam jeszce ze test bedzie umieszczony na mojej stronie na ktorej mam juz zastosowane logowanie i rejestracje . Mam tez do tego logowania baze danch z jedna tabela, i teraz niewiem czy utworzyc nowa tabele osobno do testu czy opierac sie na tej samej poniewaz głownym zal witryny jest to ze przykladowa osoba wchodzi na strone loguje sie rozwiazuje test i po rozwiazaniu wynik zapisuje sie do bazy .
Prosze o podpowiedz i pomoc jak to zrealizowac?

Pozdrawiam.
Daiquiri
Wypadałoby zbudować strukturę tabel w bazie, która odpowiadałaby temu, co masz w plikach tekstowych. Możesz zrobić to na wiele sposobów, np.
zbudować tabelę test a w niej pola pytanie, odp1, odp2, odp3, odp4. Oczywiście będziesz zobligowany do dokonania pewnych zmian w skrypcie, który uwzględniłby wczytywanie pytań z bazy, a nie z pliku itd.
gregov0
Cytat(Daiquiri @ 26.01.2011, 20:00:42 ) *
Wypadałoby zbudować strukturę tabel w bazie, która odpowiadałaby temu, co masz w plikach tekstowych. Możesz zrobić to na wiele sposobów, np.
zbudować tabelę test a w niej pola pytanie, odp1, odp2, odp3, odp4. Oczywiście będziesz zobligowany do dokonania pewnych zmian w skrypcie, który uwzględniłby wczytywanie pytań z bazy, a nie z pliku itd.

tak wiem jak zbudowac tabele ale czy moglbys mi wlasnie powiadziec lub nakierowac mnie jak dokonac tych zmian w skrypcie?
Daiquiri
Mogę, jeżeli pokażesz, że znasz chociaż podstawy zapytań do bazy. Spróbuj sam, wrzuć poprawiony kod - zobaczymy co Ci nie działa smile.gif.
gregov0
Cytat(Daiquiri @ 27.01.2011, 10:13:03 ) *
Mogę, jeżeli pokażesz, że znasz chociaż podstawy zapytań do bazy. Spróbuj sam, wrzuć poprawiony kod - zobaczymy co Ci nie działa smile.gif.

ok nie znam sie zabardzo na php ale zrobilem tak tworze tabele
  1. CREATE TABLE ` test (
  2. `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `pytanie` VARCHAR(100) NOT NULL,
  4. `odp1` VARCHAR(100) NOT NULL,
  5. `odp2` VARCHAR(100) NOT NULL,
  6. `odp3` VARCHAR(100) NOT NULL,
  7. `odp4` VARCHAR(100) NOT NULL,
  8. 'wyniki' INT(10) NOT NULL,
  9. `DATA` DATETIME NOT NULL,
  10. PRIMARY KEY (`id`)
  11. )
  12. ENGINE=MyISAM DEFAULT CHARACTER SET latin1
  13. COLLATE latin1_general_cs AUTO_INCREMENT=0;

i tak zaczolem modifikowac kod wiem ze to jest zle sad.gif niewiem jek to ugrysc
  1. <?php
  2. if (!isset($_SESSION['login'])) {
  3.  
  4.  
  5.  
  6. include 'db.php';
  7. $tabela = 'test';
  8.  
  9. $pytania = $_POST["pytanie"];
  10. $odpowiedzi = $_POST["odp1"] $_POST["odp2"] $_POST["odp3"] $_POST["odp4"] ;
  11. }
  12.  
  13. $k5 = "Ocena bardzo dobra";
  14. $k4 = "Ocena dobra";
  15. $k3 = "Ocena dostateczna";
  16. $k2 = "Ocena dopuszczajaca!";
  17. $k1 = "Ocena niedostateczna";
  18.  
  19. $f = $_POST["pytania"];
  20. $wyniki = $_POST["wyniki"];
  21. srand((double)microtime()*1000000);
  22.  
  23. if ($wyniki>0) {
  24. $ile = count($pytania); $dobre=0;
  25. for ($o=0; $o<$ile ;$o++) if ($f[$o]==1) $dobre++;
  26. $srednia = sprintf("%2d",($dobre/$ile)*100);
  27. echo "<center>Poprawne odpowiedzi: $dobre z $ile. ";
  28. echo "Zaliczone $srednia procent testu.<p>";
  29. if ($srednia<25) echo $k1;
  30. if ($srednia>=25 && $srednia<50) echo $k2;
  31. if ($srednia>=50 && $srednia<75) echo $k3;
  32. if ($srednia>=75 && $srednia<99) echo $k4;
  33. if ($srednia==100) echo $k5;
  34. echo "</center>";
  35. echo "<center><input type=submit value=\" zakoncz \"script language=\"javascript\"onClick=\"zamknijOkno()\"></script></center>";
  36.  
  37.  
  38. } else {
  39. echo "<form action=\"index.php\" method=\"post\">";
  40. echo "<input type=\"hidden\" name=\"wyniki\" value=\"1\" />";
  41. $ile = count($pytania);
  42. for($i=0;$i<$ile;$i++) {
  43. $nr = array_rand($pytania);
  44. $tmp = $pytania[$nr];
  45. $pytania[$nr] = $pytania[count($pytania)-1];
  46. $pytania[count($pytania)-1] = $tmp;
  47. $pyt = explode("`", array_pop($pytania));
  48. echo "<p><b>"; echo $i+1; echo ". $pyt[0] </b><br>";
  49. for ($b=1;$b<=count($pyt)-1;$b++)
  50. $odp[]="<input type=radio name=\"f[$i]\"
  51. value=\"$b\" />$pyt[$b]<br />";
  52. $ileodp=count($odp);
  53. for($io=0;$io<$ileodp;$io++) {
  54. $nr=array_rand($odp);
  55. $tmp=$odp[$nr];
  56. $odp[$nr]=$odp[count($odp)-1];
  57. $odp[count($odp)-1]=$tmp;
  58. echo array_pop($odp);
  59. }
  60. }
  61. echo "<center><br><input type=submit value=\" sprawdz \" /></br></center></form>";
  62.  
  63. }
  64. ?>
Daiquiri
OK, zróbmy inaczej smile.gif. Napisz co chcesz konkretnie zrobić i będziemy walczyć krok po kroku. Masz już te pytania w bazie? Bo rozumiem, że chcesz je wczytywać/losować w bazie?
gregov0
ok jesli ma byc od poczatku to mysle ze lepsza opcja bedzie pisanie na priv bo troszke pisania bedzie a niechce wklejak ton htmla na forum
utworzylem baze urzytkownicy
w niej tabele
test
  1. CREATE TABLE `test`(
  2. `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `pytanie` VARCHAR(1000) NOT NULL,
  4. `odpa` VARCHAR(1000) NOT NULL,
  5. `odpb` VARCHAR(1000) NOT NULL,
  6. `odpc` VARCHAR(1000) NOT NULL,
  7. `odpd` VARCHAR(1000) NOT NULL,
  8. `wyniki` INT(10) NOT NULL,
  9. `data` DATETIME NOT NULL,
  10. PRIMARY KEY (`id`)
  11. )
  12. ENGINE=MyISAM DEFAULT CHARACTER SET latin1
  13. COLLATE latin1_general_cs AUTO_INCREMENT=0;

i dalej tak napisalem skrypt dodajacy pytania do bazy / tabeli
insert.php
  1. <?php
  2. include 'db.php';
  3.  
  4. $sql="INSERT INTO test (pytanie, odpa, odpb, odpc, odpd)
  5. VALUES
  6. ('$_POST[pytanie]','$_POST[odpa]','$_POST[odpb]','$_POST[odpc]','$_POST[odpd]')";
  7.  
  8. if (!mysql_query($sql,$polaczenie))
  9. {
  10. die('Error: ' . mysql_error());
  11. }
  12. echo "Dodano nowe pytanie";
  13.  
  14. mysql_close($polaczenie)
  15. ?>

i form dodajpytanie.php
  1. <html>
  2. <body>
  3. Wprowadz nowe pytanie:<br/><br/>
  4. <form action="insert.php" method="post">
  5. pytanie: <input type="text" name="pytanie" /></br>
  6. odpowiedz poprawna(a): <input type="text" name="odpa" /></br>
  7. odp b: <input type="text" name="odpb" /></br>
  8. odp c: <input type="text" name="odpc" /></br>
  9. odp d: <input type="text" name="odpd" /></br>
  10. <input type="submit" /></br>
  11. </form>
  12. </body>
  13. </html>

z baza sie lacze tak
db.php
  1. <?php
  2.  
  3. $mysql_host = 'localhost';
  4. $mysql_login = 'root';
  5. $mysql_haslo = '';
  6. $mysql_baza = 'urzytkownicy';
  7.  
  8. $polaczenie = mysql_connect($mysql_host, $mysql_login, $mysql_haslo) or die('Bł?d: nie udało się nawi?zać poł?czenia z baz? danych.');
  9.  
  10. mysql_select_db($mysql_baza) or die('Bł?d: nie udało się wybrać schematu bazy danych.');
  11.  
  12. ?>


dodawanie dziala bardzo dobrze teraz chce aby skrypt pobieral losowe pytanie z bazy zmienial kolejnosc odp , sprawdzal ipo rozwiazaniu testu wpisywal wynik i date w bazie gdzie juz mam takie pola . Tylko musi tez laczyc sie z moja druga tabela w ktorej mam nazwiska urzytkownikow chyba ze moge rozwiazac to w ten sposob ze dodam kolejna tabele np wyniki i przed wyswietleniem pytan wyswietli sie komunikat z prosba o podanie nazwiska a po zakonczeniu testu nazwisko i wynik zapisza sie w tej tabeli . kurcze niewiem czy dobrze kombinuje . Jestem poczatkujacy nieznam wszystkich funkcji ktore moge zastosowac wiec prosze o pomoc
/edit sory za bl ort
emajl22
Pobieranie losowego rekordu z bazy to bardzo prosta sprawa. Poczytaj o RAND() i LIMIT w mysql.
gregov0
Cytat(emajl22 @ 27.01.2011, 14:22:31 ) *
Pobieranie losowego rekordu z bazy to bardzo prosta sprawa. Poczytaj o RAND() i LIMIT w mysql.

no ok o to chodzi?
  1. SELECT * FROM test ORDER BY RAND(), ID LIMIT 10

ale co dalej jak to zastosowac co tego skryptu?
PanGuzol
Wyniki najlepiej zapisuj w tabeli z użytkownikami. Skoro masz działające logowanie to zakładam, że masz zapisane w sesji id/login/nazwisko więc nie musisz o nie pytać.

Jak zastosować do skryptu?
mysql_query
korzystasz z tej funkcji oraz potem mysql_fetch_assoc w miejscu gdzie wcześniej pobierałeś pytania z pliku.
gregov0
nierozumiem jak ja mam to zastosowac zrobilem tak ale nie dziala bo jest zle
  1. <?php
  2. include 'db.php';
  3. $tabela = 'test';
  4.  
  5. $pytania = mysql_query("SELECT * FROM $tabela ORDER BY RAND(), ID LIMIT 10");
  6.  
  7. if ($row = mysql_fetch_assoc($pytania)) {
  8. echo $row["pytanie"];
  9. echo $row["odpa"];
  10. echo $row["odpb"];
  11. echo $row["odpc"];
  12. echo $row["odpd"];
  13. }
  14.  
  15. mysql_free_result($pytania);
  16.  
  17.  
  18. $k5 = "Ocena bardzo dobra";
  19. $k4 = "Ocena dobra";
  20. $k3 = "Ocena dostateczna";
  21. $k2 = "Ocena dopuszczajaca!";
  22. $k1 = "Ocena niedostateczna";
  23.  
  24. $f = $_POST["f"];
  25. $wyniki = $_POST["wyniki"];
  26. srand((double)microtime()*1000000);
  27.  
  28. if ($wyniki>0) {
  29. $ile = count($pytania); $dobre=0;
  30. for ($o=0; $o<$ile ;$o++) if ($f[$o]==1) $dobre++;
  31. $srednia = sprintf("%2d",($dobre/$ile)*100);
  32. echo "<center>Poprawne odpowiedzi: $dobre z $ile. ";
  33. echo "Zaliczone $srednia procent testu.<p>";
  34. if ($srednia<25) echo $k1;
  35. if ($srednia>=25 && $srednia<50) echo $k2;
  36. if ($srednia>=50 && $srednia<75) echo $k3;
  37. if ($srednia>=75 && $srednia<99) echo $k4;
  38. if ($srednia==100) echo $k5;
  39. echo "</center>";
  40. echo "<center><input type=submit value=\" zakoncz \"script language=\"javascript\"onClick=\"zamknijOkno()\"></script></center>";
  41.  
  42.  
  43. } else {
  44. echo "<form action=\"index.php\" method=\"post\">";
  45. echo "<input type=\"hidden\" name=\"wyniki\" value=\"1\" />";
  46. $ile = count($pytania);
  47. for($i=0;$i<$ile;$i++) {
  48. $nr = array_rand($pytania);
  49. $tmp = $pytania[$nr];
  50. $pytania[$nr] = $pytania[count($pytania)-1];
  51. $pytania[count($pytania)-1] = $tmp;
  52. $pyt = explode("`", array_pop($pytania));
  53. echo "<p><b>"; echo $i+1; echo ". $pyt[0] </b><br>";
  54. for ($b=1;$b<=count($pyt)-1;$b++)
  55. $odp[]="<input type=radio name=\"f[$i]\"
  56. value=\"$b\" />$pyt[$b]<br />";
  57. $ileodp=count($odp);
  58. for($io=0;$io<$ileodp;$io++) {
  59. $nr=array_rand($odp);
  60. $tmp=$odp[$nr];
  61. $odp[$nr]=$odp[count($odp)-1];
  62. $odp[count($odp)-1]=$tmp;
  63. echo array_pop($odp);
  64. }
  65. }
  66. echo "<center><br><input type=submit value=\" sprawdz \" /></br></center></form>";
  67.  
  68. }
  69. ?>


Przepraszam za spam ale nadal niemoge sobie z tym poradzic

Cytat(PanGuzol @ 27.01.2011, 17:42:32 ) *
Wyniki najlepiej zapisuj w tabeli z użytkownikami. Skoro masz działające logowanie to zakładam, że masz zapisane w sesji id/login/nazwisko więc nie musisz o nie pytać.

Jak zastosować do skryptu?
mysql_query
korzystasz z tej funkcji oraz potem mysql_fetch_assoc w miejscu gdzie wcześniej pobierałeś pytania z pliku.

w esji mam zapisane login i haslo
dalej nie rozumiem jak to mam rozwiazac
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.