Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL] Formularz - sprzawdzenie
Pride
post
Post #1





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

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


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ł? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Shili
post
Post #2





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


  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.
Go to the top of the page
+Quote Post
Pride
post
Post #3





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

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


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).
Go to the top of the page
+Quote Post
Shili
post
Post #4





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


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?

Ten post edytował Shili 18.07.2008, 23:50:44
Go to the top of the page
+Quote Post
Pride
post
Post #5





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

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


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.
Go to the top of the page
+Quote Post
Shili
post
Post #6





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


W takim razie rozumiem, że kolor hex i kolor name są ze sobą powiązane jakimś id, tak? (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Shili 19.07.2008, 12:56:15
Go to the top of the page
+Quote Post
Pride
post
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

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


Nie do końca to działało, ale pozmieniałem troszkę i... działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Dzięki bardzo (IMG:http://forum.php.pl/style_emoticons/default/yahoo.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 16.09.2025 - 00:06