Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] koszyk pytań i usuwanie z koszyka pytań w cyklu
dentopolis
post 22.11.2019, 20:17:05
Post #1





Grupa: Zarejestrowani
Postów: 252
Pomógł: 0
Dołączył: 14.08.2016

Ostrzeżenie: (0%)
-----


proszę o wskazówkę jaki temat mam zgłębić gdy chcę w php z bazy pytań i przechodzenia przez kolejne pytania w teście usuwać te które zostały uznane przez ucznia jako łatwe (parametr GET) a inne pozostawia w cyklu pytań aż uczeń kliknie że jest łatwe. czy to są tablice?
Go to the top of the page
+Quote Post
Tomplus
post 22.11.2019, 20:54:43
Post #2





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Warto po napisaniu zapytania na forum przeczytać swoją wypowiedź ponownie. Osobiście nie do końca zrozumiałem pytanie.

Jeżeli dobrze rozumiem, chcesz aby uczniowi nie powtarzały się pytania na które odpowiedział. Na to pytanie już odpowiedziałem.
Zapisujesz do bazy danych w tabeli `odpowiedzi_uczniow`informację że dany uczeń odpowiedział, a potem odpytujesz tabelę z pytaniami, tak aby pominąć pytania na które zostały już odpowiedziane.

  1. SELECT id, pytanie, odpowiedz FROM `lista_pytan` lp LEFT JOIN `odpowiedzi_uczniow` ou ON lp.id = ou.idPytania WHERE ou.idPytania IS NULL;

Cos takiego, nie testowałem pytania.
Go to the top of the page
+Quote Post
dentopolis
post 25.11.2019, 09:02:15
Post #3





Grupa: Zarejestrowani
Postów: 252
Pomógł: 0
Dołączył: 14.08.2016

Ostrzeżenie: (0%)
-----


1)doszedłem do tego momentu, nie wyświetla mi jednak $row['pytajnik_pytania'.'id'];, nie wiem gdzie tkwi błąd.
2)generalnie w skrypcie powinno być tak, że po uznaniu pytania za łatwe jest usuwane z array, a każde inne (średnie i trudne) pozostają aż uczeń się ich nauczy i uzna za łatwe, tym samym je usuwając. czyli po przesłaniu formularza powinien to zapamiętać.

  1. $mysqli = new mysqli("######", "("######", ", "("######", ", "("######", ");
  2. $query = "SELECT * FROM `pytajnik_pytania` LEFT JOIN `pytajnik_odpowiedzi` ON pytajnik_pytania.id = pytajnik_odpowiedzi.questionid WHERE pytajnik_odpowiedzi.questionid IS NULL ORDER BY $orderx";
  3. mysqli_set_charset( $mysqli, 'utf8' );
  4. $result = $mysqli->query($query);
  5.  
  6. while($row = mysqli_fetch_array($result)){
  7. echo $row['question']. " - ". $row['pytajnik_pytania'.'id'];
  8. echo $row['pytajnik_pytania.id'];
  9. echo "<br />";
  10. }
  11.  
  12.  
  13. // Find the index of the current item
  14. $current = array_search($currentid, $array);
  15.  
  16. // Find the index of the next/prev items
  17. $next = $current + 1;
  18. $prev = $current - 1;
  19.  
  20. echo $current;
  21. echo $prev;
  22. echo $next;
  23. /* free result set */
  24. $result->close();
  25.  
  26. /* close connection */
  27. $mysqli->close();




Ten post edytował dentopolis 25.11.2019, 09:05:30
Go to the top of the page
+Quote Post
Tomplus
post 25.11.2019, 09:59:15
Post #4





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Po pierwsze, warto używać aliasów w zapytaniach SQL, czym ułatwisz sobie czytanie kodu SQL.
Po drugie, nie używaj * tylko pobieraj te informacje które potrzebujesz.

  1. SELECT `pyt`.`id`, `pyt`.`question`
  2. FROM `pytajnik_pytania` AS `pyt`
  3. LEFT JOIN `pytajnik_odpowiedzi` AS `odp` ON `pyt`.`id` = `odp`.`questionid`
  4. WHERE `odp`.`questionid` IS NULL;


Wtedy nie będziesz potrzebował takich dziwactw jak $row['pytajnik_pytania'.'id'] a wystarczy $row['id']

Po trzecie, nie musimy widzieć linii że się łączysz z bazą.

Po czwarte, pisanie nazw kategorii w bazie, zamiast id kategorii, bo co jak będziesz chciał zmienić nazwę kategorii? Będziesz szukał? UPDATE `pytania` SET kategoria = 'Historia wspołczesna' WHERE kategoria = 'Historia'; ? Co jak będzie błąd i będzie nazwa kategorii 'Historia ' (ze spacją)?



Po piąte:
Gdzie inicjujesz $array i $currentid? w linii?
$current = array_search($currentid, $array);

Go to the top of the page
+Quote Post
nospor
post 25.11.2019, 10:05:39
Post #5





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
Wtedy nie będziesz potrzebował takich dziwactw jak $row['pytajnik_pytania'.'id'] a wystarczy $row['id']

Tak na marginesie: jak uzywa * to $row['pytajnik_pytania'.'id'] jest zle. w tym wypadku $row['id'] jest tak samo dobre, jakby bezposrednio wymienil pola wink.gif

@dentopolis

while($row = mysqli_fetch_array($result)){
echo $row['question']. " - ". $row['pytajnik_pytania'.'id'];
echo $row['pytajnik_pytania.id'];
echo "<br />";
}
Jak nie ogarniasz co ci zwraca baza, to zamiast zgadaywac - SPRAWDZ
while($row = mysqli_fetch_array($result)){
print_r($row);
}


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
dentopolis
post 25.11.2019, 11:14:26
Post #6





Grupa: Zarejestrowani
Postów: 252
Pomógł: 0
Dołączył: 14.08.2016

Ostrzeżenie: (0%)
-----


dziękuję za wytłumaczenie, poprawię sposób odwoływania się do kategorii, w kodzie też sprawdziłem co wyświetla, obecnie wygląda to tak:

  1. Array ( [0] => 53 [id] => 53 [1] => sklep [question] => sklep [2] => shop [answer] => shop )
  2. Array ( [0] => 52 [id] => 52 [1] => ameryka [question] => ameryka [2] => 1492 [answer] => 1492 )


skrypt

  1. while($row = mysqli_fetch_array($result)){
  2. $id = $row['id'];
  3. $question = $row['question'];
  4. $answer = $row['answer'];
  5.  
  6. echo $row['question']. " - ". $row['id'];
  7. echo "<br />";
  8.  
  9. print_r($row);
  10. echo "<br />";
  11.  
  12.  
  13.  
  14. }
  15.  
  16.  
  17. $id = $row['id'];
  18. $current = array_search($id, $array);
  19. $next = $currentid + 1;
  20. $prev = $currentid - 1;
  21.  
  22. echo "<i>";
  23. echo "prev:";
  24. echo $prev;
  25. echo "next:";
  26. echo $next;
  27. echo "</i>";


po naciśnięciu któregoś z przycisków poprzez formularz i answer.php zapisuje czas, udzieloną odpowiedź do bazy i przed header powraca na stronę testu (ponieważ zapisana zostanie wartość 'button', nie pokaże już pytań które mają jakąś wartość), jak natomiast wyświetlić kolejne pytanie?

  1. if ($polaczenie) {
  2. $sqlsave = "INSERT INTO pytajnik_odpowiedzi (`id`, `datetime`, `test`, `questionid`, `button`, `user`) VALUES (NULL, '$datetime', '$test', '$questionid', '$button', '$user')";
  3. $q = $conn->query($sqlsave);
  4. }
  5. else {}
  6. $conn->close();
Go to the top of the page
+Quote Post
Tomplus
post 25.11.2019, 15:19:57
Post #7





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Skoro za każdym razem wyświetlasz jedno pytanie to pętla while jest Ci zbędna, wystarczy samo:
  1. $row = mysqli_fetch_array($result);


Nie wiem jakie masz dane w bazie, ale po dodaniu odpowiedzi, każde zapytanie z SELECT powinno pominąć pytanie na które jest już odpowiedź.

Przeprowadź sobie eksperyment na samej bazie np. w PHPMyAdmin próbując wyświetlić tylko jeden rekord, a następnie dodając odpowiedź w tabeli.

Jeżeli masz dla ID autoincerment to nie musisz w zapytaniu INSERT dodawać kolumn które baza danych za Ciebie sama wypełni np. ID i DATA
  1. INSERT INTO pytajnik_odpowiedzi (`test`, `questionid`, `button`, `user`) VALUES ('$test', '$questionid', '$button', '$user')
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.04.2024 - 21:53