Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zmienne i fwrite
Forum PHP.pl > Forum > Przedszkole
kshyh
Witam Was,
borykam się już dluższą chwilę nad zapisaniem zmiennych do pliku. Chodzi o to, ze w formularzu definiuję liczbę osób które chcemy zaprosić. Następnie pętlą "for" generuję tyle "input type=text" imie i nazwisko, ile wpisaliśmy we wcześniejszym formularzu. Wszystko gra, zmienne mają po kolei imie1=...&nazwisko1=...&imie2=...&nazwisko2=...& itd itd.
W skrypcie zapisu zrobiłem rownież pętle ale coś mi nie działa. Kombinowalem na wszelkie sposoby i nie moge.

Poniżej skrypt zapisu.
  1. <?php
  2. $file=fopen("baza.txt", "w");
  3. for( $m = 1; $m < $_SESSION['ilosc']+1; $m++)
  4. {
  5. $imie[$m] = $_GET['imie'][$m];
  6. fwrite($file, $imie[$m] );
  7. fwrite($file, ";" );
  8. $nazwisko[$m] = $_GET['nazwisko'][$m];
  9. fwrite($file, $nazwisko[$m] );
  10. fwrite($file, ";" );
  11. fwrite($file, "#" );
  12.  };
  13. ?>


Co robię źle?
strife
A co chcesz osiągnać?

Nie lepiej przesyłać takie dane metodą $_POST. A dodawać kolejne wpisy poprzez użycie tablicy, formularz wyglądał by w ten sposób ( oczywiście jak tam chcesz, generowany dynamicznie ).

  1. <form method="post" action="index.php">
  2. <input type="text" name="imie[]" value="Romek" />
  3. <input type="text" name="imie[]" value="Stefan" />
  4. <input type="text" name="imie[]" value="Zbyszek" />
  5. <input type="text" name="nazwisko[]" value="Kowalski" />
  6. <input type="text" name="nazwisko[]" value="Nowak" />
  7. <input type="text" name="nazwisko[]" value="Uszatek" />
  8. <input type="submit" value="Dodaj" />
  9. </form>


Od strony php, dodajesz te zmienne poprzez użycie pętli:

  1. <?php
  2. if ( isset( $_POST['imie'] ) ) {
  3. $string = NULL;
  4. foreach( $_POST['imie'] as $key => $value ) {
  5. $string .= $value . ';' . $_POST['nazwisko'][$key] . '#';
  6. }
  7. file_put_contents('baza.txt', $string );
  8. }
  9. ?>


Pisane z palca. Kilka uwag:
  • Sprawdzaj czy dane zostały wysłane
  • Lepiej zapisywać tylko raz na końcu skryptu ( patrz przykład )
  • Jeśli chcemy wysłać jakieś większe dane używamy metody $_POST

Pozdrawiam.
Grzyw
A jaki efekt przynosi Ci w działaniu ten skrypt?

*************************************

Zdecydowane tak do 2. uwagi końcowej Strife'a.
Wielokrotne wywołanie funkcji fwrite() zmusza do wielokrotnego zapisu do pliku. W przypadku, gdy wyślesz wszystko raz przez jedną zmienną, plik zostanie nadpisany tylko raz. To zwiększy prędkość wykonania skryptu i zmniejszy prawdopodobieństwo błędu (to przy jednym zapisie w pliku jest mniejszy, niż np. przy kilkuset zapisach).
kshyh
Robię GET'em, bo chcę widzieć zmienne, później przerobię to na POST.

O to chodzi, że nie wiem jak duża ma być tablica. Definiowanie na sztywno ilości input'ów w tablicy nie jest w tym przypadku odpowiednim rozwiązaniem. Za każdym razem będzie to różna ilość.


W $_SESSION['ilosc'] zapisana jest jakaś liczba np. 4, która to we wcześniejszym formularzu "ilegosci.html" jest podawana.


  1. <?
  2. printf('<form action=zapisz.php method=get>');
  3.  
  4. for( $j = 1; $j < $_SESSION['ilosc']+1; $j++ )
  5. {
  6. echo "<table>";
  7. echo "<tr>";
  8. echo "<td width=100%>";
  9. printf("<p>   ");
  10. printf("</p>");
  11. echo "Imie: <input type=text name='imie$j' size='40' maxlength='40'> ";
  12. printf("</p>");
  13. echo "Nazwisko: <input type=text name='nazwisko$j' size='40' maxlength='40'> ";
  14. printf("</p>");
  15. echo "</td>";
  16. echo "</tr>";
  17. echo "</table>";
  18. printf("<p>   ");
  19. printf("</p>");
  20. };
  21. printf('<p align="right"><input name="dalej" type="submit" value="Dalej"></p>');
  22. printf('</form>');
  23. ?>



Skrypt ten wygeneruje 4 pola imie i 4 pola nazwisko. Powstaną zmienne $imie1, $imie2, ..., $imie4 oraz $nazwisko1, ..., $nazwisko4. Zmienne są przesyłane bo widzę je w pasku adresu.

Skrypt zapisz.php ma te zmienne zapisać do pliku, i tutaj tkwi problem. Stąd wzięła się pętla którą chciałem odpowiednie zmienne przechwycić i zapisać.

*Grzyw
efekt zapisu jest następujący

;;#;;#;;#;;#
strife
Ja bym to rozwiązał inaczej, pierwsza strona na której wybierasz ilość gości, może być trzymana w sesji. Następnie przechodząc do następnej strony, na podstawie wartości zapisanej w sesji, generowane są formularze, i tutaj nie rozumiem, czemu nie chcesz użyć tablic, po to one zostały przecież stworzone. Przykład poglądowy:

  1. <?php
  2. $intQuests = 12; // moze byc wartosc sesji
  3.  
  4. $form = NULL;
  5. for ( $i = 0; $i < $intQuests; $i++ ) {
  6. $form .= '<tr><td>';
  7. $form .= '<input type="text" name="imie[]" />';
  8. $form .= '</td>';
  9. $form .= '<td>';
  10. $form .= '<input type="text" name="nazwisko[]" />';
  11. $form .= '</td></tr>';
  12. }
  13.  
  14. // wyswietlanie dynamicznie generowanego formularza
  15.  
  16. echo '<form method="post">';
  17. echo '<table><tr><th>Imie</th><th>Nazwisko</th></tr>' . $form . '</table>';
  18. echo '<input type="submit" />';
  19. echo '</form>';
  20. echo '<pre>';
  21. var_export( $_POST );
  22. echo '</pre>';
  23. ?>



PS. Spróbuj zamiast
  1. <?php
  2. $_GET['imie'][$m]
  3. ?>

dać:
  1. <?php
  2. $_GET['imie' . $m]
  3. ?>
kshyh
dzięki strife,

  1. <?php
  2. $_GET['imie' . $m]
  3. ?>

zadziałał.

ps.To nie jest tak, że nie chcę używać tablic. Tylko wpadłem na takie rozwiązanie i dla mnie, dla beginner'a jest ono łatwiejsze. Zaraz przetestuje rozwiązanie z tablicami. Dzieki jeszcze raz.
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.