Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: IF spełniony za każdym razem w pętli FOR
Forum PHP.pl > Forum > Przedszkole
tomilipin
Cześć!
Natrafiłem na bardzo dziwny problem z pętlą FOR... Może ktoś z Was będzie w stanie mi pomóc. Działanie tej pętli mam już opanowane, widzę że nie zrobiłem w niej błędu (lub błędu nie widzę). Poniższy kod to wycinek skryptu do prostej listy sybskrypcyjnej .

Chodzi o to, że za każdym razem, nie ważne który adres e-mail wpiszę- zostaje usunięty ostatni adres! Poszczególne wpisy mam oddzielone poprzez \n . To dziwne zachowanie pętli FOR i IF polega na tym, że warunek zostaje spełniony za każdym razem, w wyniku czego $usunnumer ma wartość taką, ile razy została wykonana pętla- bo za każdym razem warunek w IFie jest spełniony, i za każdym wykonaniem pętli wykonywana jest także zawartość IFa mad.gif Próbowałem już przestawiać zmienne $adresy i $adres na różne sposoby, efekt ciągle ten sam lub jeszcze gorszy (warunek nie był spełniony).

Czy ktoś mógłby wskazać, gdzie jest błąd? Zapewne chodzi o malutki błąd logiczny bo składniowych nie mam. Bardzo proszę o pomoc...
Jeśli brakuje jakichś danych- proszę pisać, od razu podeślę na forum brakujący kod.
  1. <?
  2. //sprawdzam co wciśnięto i czy coś wpisano
  3. if ($_POST['usu'] and $_POST['adres']) {
  4. $adres=$_POST['adres']; //dla późniejszego uproszczenia
  5. $adresy = file('lista.adr'); //traktuję plik jako tablicę
  6.  
  7. if (!eregi(&#092;"^.+@.+..+$\", $_POST['adres'])) {
  8. exit(&#092;"Niepoprawny adres e-mail...\");
  9. }
  10. for ($index=&#092;"0\"; $index < count($adresy); $index++) {
  11. if($adresy[$index]=$adres) {
  12. echo &#092;"linijka $index \".$adresy[$index].\"<br>\"; //tylko dla testów
  13. $usunnumer=$index;
  14. }
  15.  
  16. }
  17.  
  18. $plik = file('lista.adr');
  19. unset($plik[$usunnumer]);
  20. $f = fopen('lista.adr', 'w');
  21.  foreach($plik as $linia){
  22.  fputs($f, $linia);
  23.  }
  24. fclose($f);
  25. echo &#092;"Podany adres e-mail został usunięty z listy.\";
  26. ?>
bendi
musi byc podwoje rowna sie na porownanie zamiasat pojedynczego (przypisanie)
  1. <?php
  2. if($adresy[$index]==$adres) {
  3. ?>
tomilipin
Niestety to nie to...
Po zmianie, o której piszesz, warunek nie jest spełniony i żadna linijka z pliku nie jest usuwana. Informacja "Podany adres e-mail został usunięty z listy." pojawia się, ale wynika to ze złego kodu, po prostu zawsze pojawi się ten napis jeśli ktoś wciśnie przycisk Usuń, poda jakiś adres i ten adres będzie poprawny.

Czy może gdzieś indziej jest błąd?

--EDIT--
gdy mam taki kod (z jednym znakiem równości):
  1. <?
  2. if($adresy[$index]=$adres) {
  3. echo &#092;"linijka $index \".$adresy[$index].\"<br>\";
  4. $usunnumer=$index;
  5. }
  6.  ?>

i podam "adres3@serwer3.pl" do usunięcia to wyświetla mi:
Kod
linijka 0 adres3@serwer3.pl
linijka 1 adres3@serwer3.pl
linijka 2 adres3@serwer3.pl
linijka 3 adres3@serwer3.pl
linijka 4 adres3@serwer3.pl

...podczas gdy powninny być kolejne adresy zaczynając od 1 do 5. Potem usuwa ostatni wpis- adres 5. Dobrze że wogóle coś wyświetla, ale ciągle usuwa ostatni wpis! A w moim pliku wpis "adres3@serwer3.pl" znajduje się w linijce 3 (licząc od 1, dla php to będzie linijka 2) bo liczy od 0). Jestem normalnie zdesperowany i zdezorientowany, bardzo proszę o pomoc... blink.gif
rogrog
ale Ty chcesz sprawdzić czy ten adres odpowiada adresowi w tablicy a nie przypisać.

Nie możesz tak myśleć "dobrze że coś się wyświetla" tylko pomyśl co Ty chcesz zrobić.

Najlepiej do przejścia po tablicy użyj foreach" title="Zobacz w manualu PHP" target="_manual. Nie wiem co jest źle tutaj (brzydki kod nie zachęca do czytania dry.gif ) ale może przy foreach będzie działało.

A jeśli chcesz używać for to pamiętaj żeby nie używać count() i w ogóle funkcji w warunku (o ile to mozliwe). Najlepiej przypisać długość tablicy do zmiennej i sprawdzać czy index jest mniejszy od tej zmiennej, bo funkcja jest wtedy wywoływana tylko raz. A jeśli umieścisz ją w warunku pętli to jest wykonywana za kazdym jej przebiegiem.

Dodatkowo $index jest liczbą a nie stringiem więc przypisuj $index=0 a nie $index="0"
tomilipin
Rozumiem. Zmieniłem = na ==.
Teraz moja pętla ma postać:
  1. <?
  2. $adres=$_POST['adres'];
  3. $adresy = file('lista.adr');
  4. $asdf=count($adresy);
  5.  
  6. for ($index=0; $index < $asdf; $index++) {
  7.  if($adresy[$index]== $adres) {
  8.  echo &#092;"linijka $index \".$adresy[$index].\"<br>\";
  9.  $usunnumer=$index;
  10.  }
  11.  
  12. }
  13.  
  14. $plik = file('lista.adr');
  15. unset($plik[$usunnumer]);
  16. $f = fopen('lista.adr', 'w');
  17.  foreach($plik as $linia){
  18.  fputs($f, $linia);
  19.  }
  20. fclose($f);
  21. echo &#092;"Podany adres e-mail został usunięty z listy.\";
  22. ?>

Przepraszam za brzydki kod... jeśli taki faktycznie jest...
Nie zmienia to jednak faktu że nie działa sad.gif Żadna linia z pliku nie zostaje usunięta...
silent
A nie łatwiej zrobić to tak:
  1. <?php
  2. $adres = $_POST['adres']; // to wiesz
  3. $adresy = file( 'lista.adr' ); // to też wiesz
  4.  
  5. // obcina białe znaki we wszystkich wartościach w tablicy $adresy
  6. $adresy = array_map( 'trim', $adresy );
  7.  
  8. // zwraca do zmiennej $index indeks pod którym w tablicy $adresy znajduje się ciąg
  9. $adres
  10. $index = array_search( $adres, $adresy );
  11.  
  12. // usuwa z tablicy $adresy wartość pod indeksem $index (czyli adres który chcieliśmy usunąć)
  13. unset( $adresy[$index] );
  14.  
  15. // zapisuje do pliku zawartość tablicy $adresy (już bez adresu który chcieliśmy usunąć)
  16. $f = fopen( 'lista.adr', 'w' );
  17. foreach( $adresy as $linia )
  18. {
  19.  fputs( $f, $linia );
  20. }
  21. fclose( $f );
  22.  
  23. echo &#092;"Podany adres e-mail został usunięty z listy.\";
  24. ?>
kszychu
Funkcja file() rzeczywiście zwraca plik do tablicy, jednak każdy element tablicy zawoiera na końcu znak nowej linii. Podejrzewam, że tu właśnie tkwi problem. Polecam porównywać to tak:
  1. <?php
  2. if(rtrim($adresy[$index]) == $adres)
  3. ?>
tomilipin
Dzięki Kszychu! Działa biggrin.gif
Niech Ci Bozia w dzieciach wynagrodzi winksmiley.jpg

Silent- nie rozumiem kodu, który podaleś. Jeszcze jestem w tym za słaby, ale dzięki za pomoc! Napewno to sobie przyswoję

Jeszcze raz: dzięki Wam za pomoc!

--EDIT--
dodam, że efekt końcowy można zobaczyć na mojej stronie domowej, do której link znajduje się poniżej- w podpisie.
silent
Dodałem komentarze i poprawkę kszycha, może teraz Ci się rozjaśni smile.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.