[PHP] zle skonstruowana funkcja?

0

Witam mam maly problem ;/ jestem co nieco poczatkujacy i zrobilem sobie funkcje ktora sprawdza w kazdym wierszy czy NIE MA okreslonego ciagu znakow (funkcja szukajaca). Wiec:

function heh(){
$liczba_l=count(file('dane.txt'));
$lin=file('dane.txt');

for ($y = 0; $y < $liczba_l; $y++)
	{

		if(strpos($lin[y], $_POST['s']) === 0)
                {
                        echo 'jest<br>';
				
                }
                else
                {
                        echo 'niema<br>';
				
                }       

	}
}

niestety w pliku ZNAJDUJE sie wartosc ktora szukam ale strona wyswietla w kazdej linii "NIE MA" ;/ cos jest zle z === ? prosze o pomoc ;/bo niewiem gdzie jest blad ;/

0

=== sprawdza czy jest zachowana toższamość typu i wartości
== porównuje wartości tylko
poza tym w manualu php odnośnie funkcji strpos masz taki o to wpis:

If needle is not found, strpos() will return boolean FALSE.

Z czego wynika że wystarcz zmienić sam warunek:

if(strpos($lin[$y], $_POST['s'])!==false) //rzeczywiście, egh tak to jest jak cos chce się szybko zrobić
              {
                        echo 'jest<br>';
                                
                }
                else
                {
                        echo 'niema<br>';
                                
                }       

A propos po polsku na czerwonym polu pisze:

Ta funkcja może zwrócić logiczne FALSE, ale także zwykłą wartość rozpoznawaną jako FALSE, na przykład 0 lub "".

0

niestety nic niepasuje ;/ podana funkcja zwraca jednakowe wartosci dla wszystkich wierszy w pliku ;/ moze podam wszystkie dane jakie mam. Plik (przykladowy na ktorym sprawdzam dzialanie):

The Italian
Wielkie
Sorry
Sal
Szt
Dla
heh
muminki

kodu uzylem podanego ale sprawdzalem tez w razie czego wszystkie warunki podane w komentarzach manuala takie jak

(strpos("aaa", "aaa") >= 0)      returns true  expected true
(strpos("aaa", "aaa") == true)   returns false EXPECTED TRUE
(strpos("aaa", "aaa") == false)  returns true  EXPECTED FALSE
(strpos("aaa", "aaa") === true)  returns false EXPECTED TRUE
(strpos("aaa", "aaa") !== false) returns true  expected true
(strpos("aaa", "aaa") === false) returns false expected false
(strpos("aaa", "aaa") !== true)  returns true  EXPECTED FALSE

niestety kazde wywolanie zwraca takie same wartosci w adresie w miejscu post wpisuje muminki ;] niestety niedziala ale jak wpisze:

if(strpos('muminki', 'muminki'))

funkcja dziala ;/ wlasnie dlatego niewiem czemu to jest zle ;/ cokolwiek nierobie albo jest w KAZDEJ linijce wartosc true albo false ;/ zadnych roznicy ;/ otwieram plik za pomoca
fopen('dane.txt', 'r') ale to chyba NIE MA znaczenia ;/ prosze o pomoc ;/

0

Bo ty to w ogóle moim zdaniem paskudnie robisz i nie chciałe się w to wtrącać, czemy nie wykorzystasz preg_match ? Ja ostatni raz z strpos korzystałem pod koniec podstawówki jak się c uczyłem.
Ja bym to zrobił tak:

function heh($nazwa_pliku, $szukane){
   $pl=file($nazwa_pliku);
   foreach($pl as $linia) {
      if(preg_match('#.*('.$szukane.').*#Ui',$linia)){
         echo 'jest';
      } else {
         echo 'nie ma';
      }
   }
}
heh('plik.txt','muminki');

ewentualnie W $szukane pilnowałbym aby nie pojawiła się czyste znaki z regexpów, jak kropka, plus itd... trza by je poprzedzić slashem.

0
mephir napisał(a)

Bo ty to w ogóle moim zdaniem paskudnie robisz i nie chciałe się w to wtrącać, czemy nie wykorzystasz preg_match ?

Bo najlepiej się do tego celu nadaje?

Ja ostatni raz z strpos korzystałem pod koniec podstawówki jak się c uczyłem.

Kiepsko Ci poszło jak widać :(

Do przedpiścy:
Sprawdzaj czy wartość jest różna od false, czyli: strpos () !== false. Poza tym wewnątrz funkcji nie pobieraj parametru z superglobali ($_POST['s']), tylko przekazuj sobie tą wartość jako parametr funkcji. A, i nie wywołuj dwa razy file () tam w środku, najlepiej wcale tego nie wykorzystuj ;) Ale to już szczegół. Tylko nie daj się namówić na używanie preg_match do tego celu, zostaw armatę na lepszą okazję ;)

0
mysz napisał(a)

Kiepsko Ci poszło jak widać :(

No tak a programownaiem zawodowo zajmuje sie od paru lat, więc chyba jednak nie poszło tak źle [diabel]

A tak w ogóle cfaniaku to porównywanie ciągów znaków dokonuje się funkcja strcmp lub do tego bardziej by się nadawał strstr(), wracając do tamtych czasów.

0

tak zdecydowanie zgadzam się z @mephir

kilka hashy, kropek i gwiazdek w kodzie zawsze bardziej upiększa kod, sprawia że kod jest taki ładny i znikają wszystkie paskudne FALSE z kodu

a w ogóle genialnie jest jak w $szukane jest coś co trzeba escape-ować przed wyrażeniem regularnym, żeby się nie wykrzaczyło... jak dodam kolejnych 20 linijek wtedy czuję że mój program tętni życiem... przed nadchodzącym zawałem

nasz programista z kilkuletnim doświadczeniem pokazał wszystko co pozwala unikać skomplikowanego kodu i nadchodzących problemów

A cytaty jak ten to czysta propaganda, siana przez wszystkich którzy nie lubią znaków przystankowych i ładnego kodu:

manual PHP napisał(a)

Podpowiedź: Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.

a tak przy okazji pierwszego wystąpienia jakiegoś ciągu w kodzie to szukaj tak:

<?
preg_match('#(.*?)('.preg_quote($szukane).').*#Ui',$linia, $match);
$pos = strlen($match[0]);
?>

Namawiam do tego bo też strpos ostatni raz używałem w podstawówce, powiedziałem sobie że w takie banały rodem ze średniowiecza to ja się bawić nie będę, wtedy to wziąłem zabawki i poszedłem do gimnazjum

stwierdziłem też że wertowanie między oznaczeniami regexp-ów, a modyfikatorami musi być łatwiejsze niż paskudne strpos, a tym bardziej wskazane POCZĄTKUJĄCYM

1 użytkowników online, w tym zalogowanych: 0, gości: 1