Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zmienna z kropką w nazwie
Forum PHP.pl > Forum > Przedszkole
bobo1
Witam,

mam taki problem. W bazie danych mam dane o następującej strukturze:

Klucz | Wartość
k.k1 | wartość 1
k.kk | wartość k
.....

Generalnie chodzi o to, że klucz ma w nazwie kropkę. Teraz chcę stworzyć formularz przy pomocy, którego będę mógł edytować pole wartość.

  1. <?php
  2. echo'<form method="post">';
  3. $zapytanie = "SELECT * FROM tabela LIMIT 0, 10";
  4. $wykonaj = mysql_query($zapytanie) or die ('Nie można wykonać zapytania.');
  5. echo'<table>';
  6. while ($lista = mysql_fetch_array($wykonaj)) {
  7. echo'<tr><td width="300">'.$lista['wartosc'].'</td>
  8.  <td> <input type="text" name="'.$lista['klucz'].'" size="40" maxlength="" value="'.$lista['wartosc'].'"></td>
  9. </tr>';
  10. }
  11. echo'</table> <input type="hidden" name="sended" value="true" />
  12. <input type="submit" value="Zapisz zmiany">
  13. </form>';
  14. }
  15. ?>


Następnie chcę zapisać nowe wartości do bazy. Tylko, że pojawiają się schody ponieważ pole klucz składa się z nazw, które zawierają kropki w związku z czym

Kod
"UPDATE tabela SET en='".$_POST['klucz']."' WHERE key='".$lista['wartosc']."'";


nic nie daje ponieważ wartość $_POST['klucz'] jest pusta.

Wie ktoś co z tym zrobić ?
strife
Kropki automatycznie zamienia w podkreślenie "_" z tego względu, że jest zarezerwowana przez php. Wystarczy ponownie w drugą stronę to zamienić, np. przez str_replace" title="Zobacz w manualu PHP" target="_manual. Jeśli dobrze zrozumiałem oczywiście smile.gif

PS. Zobacz jakie dane dostajesz:

  1. <?php
  2. echo '<pre>';
  3. var_export($_POST);
  4. echo '</pre>';
  5. ?>
;

PS2. Albo tak hm ..

  1. <form method="post" action="?">
  2. <input type="text" name="<?php echo base64_encode('km.2') ?>" />
  3. </form>
  4.  
  5. <pre>
  6. <?php
  7. foreach ($_POST as $key => $value) {
  8. echo base64_decode($key) . ' => ' . $value;
  9. }
  10. ?>
rybik
  1. <?php
  2. mysql_connect("localhost", "db_user", "db_password")or die("Nie można nawiązać połączenia z bazą"); //połączenie z bazą danych
  3. mysql_select_db("db_name") or die("Wystąpił błąd podczas wybierania bazy danych");
  4.  
  5. // rozdzielamy logike od wygladu, najpierw zapytanie, przy okazji przechodzimy na 
    ang
  6.  
  7. // zastanów się czy potrzebujesz wszystkich wartości, wyciagne 2, w razie czego wr
    ócisz do *
  8. $query = "SELECT my_keys,my_values FROM db_table LIMIT 0, 10";
  9. // zastanów się, czy warto informować usera o błędnym zapytaniu, to pomoże włamywa
    czom a Ty możesz obsługiwać błędy inaczej
  10. // poza tym błąd formularza nie musi nam kłaść całej strony
  11. if ($result = mysql_query($query)) {
  12. $fields = array();
  13. while (list($name, $value) = mysql_fetch_row($result)) {
  14. // przepiszemy wynik do tablicy
  15. $fields[$name]=$value;
  16. }
  17. // poniższą linie można usunąć jeżeli to mały formularz
  18.  
  19. // zaczynamy generować wynikowy html
  20. $output = "<form method=\"POST\">";
  21. $output .= "<table cellpadding=\"3\" cellspacing=\"0\">";
  22. foreach ($fields as $name => $value) {
  23.  // podświetlanie co drugiego rzędu
  24.  $even_odd = ( '-odd' != $even_odd ) ? '-odd' : '-even';
  25.  $output .= "<tr class=\"hilite".$even_odd."\">";
  26.  $output .= "<td>";
  27.  $output .= "<label for=\"$name\">$value</label><input type=\"text\" name=\"$name\" size=\"40\" maxlength=\"\" value=\"$value\"/>";
  28.  $output .= "</td>";
  29.  $output .= "</tr>";
  30. }
  31. $output .= "<tr class=\"footer\"><td><input type=\"submit\" value=\"Zapisz zmiany\"></td></tr>";
  32. $output .= "</table>";
  33. $output .= "</form>";
  34. echo $output;
  35. } else {
  36. echo "Formularz niedostępny";
  37. }
  38.  
  39. // zapis danych, korzystamy z używanej wcześniej tablicy $fields
  40.  
  41. foreach ($fields as $key => $value) {
  42. // uwzględniamy nieszczęsne kropki
  43. $key_posted = str_replace ('.','_',$key);
  44. // leniwy update - nie ruszamy nie zmienionych pól
  45. if (isset($_POST[$key_posted]) && $_POST[$key_posted]!=$value) {
  46. // tutaj KONIECZNIE filtrujemy dane od usera, poza htmlspecialchars możesz użyć wł
    asnych dodatkowych filtrów
  47. $value_new = htmlspecialchars($_POST[$key_posted]);
  48. $query = "UPDATE db_table SET my_values='$value_new' WHERE my_keys='$key'";
  49. if (mysql_query($query)) {
  50. echo "Zmieniłeś $value na $value_new <br/>";
  51. } else {
  52. echo "Nie dokonano zmian w bazie";
  53. }
  54. } else {
  55. echo "Nie dokonano zmian w formularzu";
  56. } // if
  57. } // foreach
  58.  
  59. ?>


zamiast dwóch komórek tablei stosuje labelki i koloruje co drugi rządek, poniżej style css

  1. <style type="text/css">
  2. label {width: 300px;}
  3. tr.hilite-even {background-color: #f0f0f0;}
  4. tr.hilite-odd {background: #fafafa;}
bobo1
Strife dobrze zrozumiałeś.

Zaproponowane przez was rozwiązania działają poprawnie. Wielkie dzięki smile.gif.

Korzystając z okazji czy jest jakiś limit na ilość danych przesyłanych przy pomocy POST. Chodzi o to, że mam w tabeli około 300 rekordów. Jak daje wszystkie rekordy do jednego formularza i klikam wyślij to się nie przetwarza, jak zmniejszę liczbę do powiedzmy 150 rekordów to wszystko działa OK. Czym to może być spowodowane ?
rybik
php.ini:

post_max_size
bobo1
Obawiam się, że nie sad.gif

post_max_size = 8 MB

dane w bazie mają zaledwie 50 kb.
rybik
zacznij debugować smile.gif
a) sprawdz czy samo postowanie bez bazy dziala dla tej liczby pol
cool.gif wyświetlaj w każdym przejściu przez pętle błędy mysql (mój kod po linii 54 wyswietl mysql_error())
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.