Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] koszyk pytań i usuwanie z koszyka pytań w cyklu
Forum PHP.pl > Forum > Przedszkole
dentopolis
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?
Tomplus
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.
dentopolis
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();


Tomplus
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);

nospor
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);
}
dentopolis
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();
Tomplus
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')
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.