Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Formularz - sprzawdzenie
Forum PHP.pl > Forum > Przedszkole
Pride
Siemka.
Czy moglibyście mi poradzić jak można wykonać taki skrypt sprawdzający. Na początku pobieram z bazy losowe rekordy i tworze z nich obraz - kolor (teraz aby bylo szybciej tylko kolor - w przyszłości będzie to zmienione na tworzenie obrazków itp ale to nie ważne):

1. Pobieram color_hex i color_name z bazy,
2. Wstawiam color_hex jako tło komórki,
3. Wstawiam color_hex i color_name do ukrytego input'a (jako daną do sprawdzenia)
4. Całość generuje się 3x - 3 różne kolory z 3 input'ami (co wywołanie zmienia się name o +1).

  1. <?php
  2. if($_GET['num'] == '3')
  3. {
  4. settype($_GET['num'], 'integer');
  5.  
  6. $num = '0';
  7. $i = '1';
  8. $result_num = mysql_query('SELECT `id` FROM `rgb_colors`;');
  9. $date_num = mysql_num_rows($result_num);
  10. if(!$date_num == '0')
  11. {
  12. if($date_num<$_GET['num']) $num = $date_num;
  13. else $num = $_GET['num']; 
  14.  
  15. echo '<form action="rgb.php?go=check" method="post">
  16. <table width="500" border="1">';
  17.  
  18. $result = mysql_query('SELECT `color_hex`, `color_name` FROM `rgb_colors`
  19. ORDER BY RAND() LIMIT '.$num.';');
  20. while ($row = mysql_fetch_array($result))
  21. {
  22. echo '<tr height="40">
  23. <td width="40" align="center">#'.$i.'</td> 
  24. <td width="80" style="background: '.$row['color_hex'].';"> </td>
  25. <td style="background: #FF0000;">
  26. <b>R:</b> <input type="radio" name="color'.$i.'" value="red" />
  27. <input type="hidden" name="color_check'.$i.'" value="'.$row['color_name'].'" />
  28. <input type="hidden" name="color_hex'.$i.'" value="'.$row['color_hex'].'" />
  29. </td>
  30. <td style="background: #00FF00;">
  31. <b>G:</b> <input type="radio" name="color'.$i.'" value="green" />
  32. </td>
  33. <td style="background: #0000FF;">
  34. <b>B:</b> <input type="radio" name="color'.$i.'" value="blue" />
  35. </td>
  36. </tr>';
  37. $i++;
  38. }
  39. echo '</table>
  40. <input type="submit" value="Submit" />
  41. </form>';
  42. }
  43. ?>


Teraz właśnie jest problem ponieważ chce sprawdzić czy użytkownich na wzór obrazu wybrał odpowiedni kolor.
W bazie do każdego hex'a przypisana jest nazwa np: 1 | #FF0000 | red - czyli id=1, hex=#FF0000 i jest to kolor=red.
Właśnie teraz nie wiem jak to sprawdzić - wiem, że musze pobrać z bazy wszystkie kolory i porównać je z hex'ami z formularza. Następnie zobaczyć czy $_POST['color1/2/3'] == kolorowi z bazy (tego na podstawie hex'a). Jeżeli np. _POST['color1'] == jakiś $row['color_name'] (ten color_name jest z tego zamego wiersza co hex) to no $zmienna = 'ok' a jak ~= to $zmienna2 = 'wrong'; i przechodzi dalej do następnych 2. Po sprawdzeniu 3 wyświetla które są dobrze które źle.

Myślałem, żeby zrobić 3 różne zapytania dla każdego z kolorów - było by łatwiej bo podałbym WHERE `color_hex` = $_POST['color_hex'] ale znowu gdy będzie ich 20 to... :| Jestem wręcz pewien, że idzie to zrobić o wiele łatwiej ale właśnie jak? Ma ktoś jakis dobry pomysł? snitch.gif
Shili
  1. WHERE atrybut IN(value1, value2, ..., value20)

Samo zapytanie (czy też treść in) możesz spokojnie wygenerować pętlą, albo połączyć odpowiednie pola w jeden string.
Pride
No ok działa, ale jak teraz porównać rekordy z postem? Chodzi mi o to, że one nie są tak samo poukładane - posty lecą po swojemu a row'ki po swojemu.
  1. <?php
  2. $posts = '''.$_POST['color_hex1'].'', '.
  3. '''.$_POST['color_hex2'].'', '.
  4. '''.$_POST['color_hex3'].'', '.
  5. '''.$_POST['color_hex4'].'', '.
  6. '''.$_POST['color_hex5'].''';
  7.  
  8. $result = mysql_query('SELECT * FROM `rgb_colors` WHERE `color_hex` IN('.$posts.');');
  9. ?>


P.S. #1 wiem, że nie filtrowane - ale to potem
#2 wiem, że tak to sobie wygląda - ale działa (do tego momentu).
Shili
Primo zamiast name="color_hex2" lepiej dać name="color_hex[]" - wytworzy Ci to tablicę kolorów wybranych przez użytkownika, nie będzie to miało znaczenia czy wybrał 1 czy 5tysięcy, bo odwołujesz się przez jedną tablicę.

Secundo chyba źle zrozumiałam założenia. Musisz sprawdzić, czy każdy z tych wybranych kolorów znajduje się w bazie danych, tak?
Pride
Cytat(Shili @ 19.07.2008, 00:50:16 ) *
Primo zamiast name="color_hex2" lepiej dać name="color_hex[]" - wytworzy Ci to tablicę kolorów wybranych przez użytkownika, nie będzie to miało znaczenia czy wybrał 1 czy 5tysięcy, bo odwołujesz się przez jedną tablicę.

Secundo chyba źle zrozumiałam założenia. Musisz sprawdzić, czy każdy z tych wybranych kolorów znajduje się w bazie danych, tak?

Nie. Każdy z tych kolorów znajduje się w bazie danych.

Jak jak mówiłem w formularzu wyświetla się użytkownikowi:

color_hex (pobrany z bazy) i 3 input'y typu radio z name=color i value=red, green, blue.
Użytkownik na podstawie color_hex (który wstawiany jest do tła komórki) ma wybrać jaki to jest kolor (zaznaczyć odpowiednią "kropke"). Więc:
Jeżeli color_hex (tło komórki) jest: color_hex="FF0000" i użytkownik wybierze radio name=red to w momecie gdy formularz będzie to sprawdzał ma on wyświetlić np " echo 'Dobry wybór'; "

Więc, formularz musi wyciągnąc color_hex i color_name z bazy i najpierw porównać czy $row['color_hex'] == $_POST['color_hex'] - to jest i musi być TRUE, teraz sprawdzić czy $row['color_name'] == $_POST['color'] jeżeli tak to wyświetka jakieś echo czy coś i przechodzi do następnego.
Shili
W takim razie rozumiem, że kolor hex i kolor name są ze sobą powiązane jakimś id, tak? winksmiley.jpg

  1. <?php
  2. include('functions/main.php');
  3. /* Najprościej będzie obsługiwać taką tabelę w bazie
  4.  * ale równie dobrze można przerobić do własnych potrzeb
  5.  * Jako że nie znam budowy Twojej tabeli, czy tam Twoich tabel musiałam sobie coś wybrać
  6.  * i to wydaje się być dobrym odzwierciedleniem
  7.  *
  8.  * CREATE TABLE `colors` (
  9.  * `id` INT NOT NULL AUTO_INCREMENT ,
  10.  * `color_hex` VARCHAR( 7 ) NOT NULL ,
  11.  * `color_name` VARCHAR( 255 ) NOT NULL ,
  12.  * PRIMARY KEY ( `id` )
  13.  * ) ENGINE = MYISAM 
  14.  */
  15.  
  16.  
  17. if(isset($_POST['send'])) {
  18. $number = count($_SESSION['colors'], 0); // obliczenie ile kolorow zostalo wygenerowanych
  19. $error = 0; // zmienna sprawdzająca, czy na jakimś etapie się nie pomylono
  20. foreach($_POST['color'] as $key => $value) {
  21. if(strcmp($value, $_SESSION['colors'][$key]['color_name'])) { // sprawdzenie czy ciagi sa sobie rowne
  22. $error++; // jesli nie, to zwieksz zmienna error
  23. } 
  24. }
  25. echo 'Popelniles/as '.$error.' bledow'; // sprawdzenie czy dobrze liczy
  26. unset($_SESSION['colors']); // niszczymy zmienną, żeby przy następnym wywołaniu nie zostały dopisane kolejne wartości
  27. }
  28.  
  29. $query = 'SELECT `color_hex`, `color_name` FROM `colors` ORDER BY RAND() LIMIT 3';
  30. $result = mysql_query($query);
  31. ?>
  32.  
  33. <form action="" method="post" />
  34.  
  35. <?php
  36. $i = 0;
  37. while($row = mysql_fetch_array($result)) {
  38. $_SESSION['colors'][] = $row; // kolory zapisujemy w sesji, żeby były nie do podjerzenia w kodzie
  39. /* Formularz jako pola name przyjmuje kolejne pola tablicy - bez względu na ilość pól i zapytanie
  40.  * i cały algorytm zawsze będą wyglądać tak samo */
  41.  
  42. ?>
  43.  
  44. <input type="text" style="background: <?=$row['color_hex']?>" />
  45. <input type="radio" name="color[<?=$i?>]" value="green" /><label>green</label>
  46. <input type="radio" name="color[<?=$i?>]" value="blue" /><label>blue</label>
  47. <input type="radio" name="color[<?=$i?>]" value="red" /><label>red</label><br/>
  48.  
  49. <?php
  50. $i++;
  51. }
  52. ?>
  53.  
  54. <input type="submit" value="sprawdz" name="send" /> 
  55. </form>
Ze swojej strony mogę zaproponować taki sposób rozwiązania. Na ukryte pola formularza zawsze można sobie przerobić mniej więcej w ten sam sposób. To tylko zarys, ale z tego względu, że session i post mają dokładnie takie same wartości dość prosto będzie przypisać błędnym session jakąś wartość określającą że jest błąd i zaznaczyć to w formularzu.
I nie potrzebne jest więcej zapytań do bazy niż jedno.

ten include na początku łączy mi się z bazą danych winksmiley.jpg
Pride
Nie do końca to działało, ale pozmieniałem troszkę i... działa smile.gif Dzięki bardzo yahoo.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.