Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP-version päivitys, ereg-funktio ei enää toimi

Sivun loppuun

jarimi [28.10.2020 22:38:07]

#

Moro,

PHP:stä en mittään ymmärrä. Olen aikoinaan ottanut valmiista esimerkistä palautelomakkeen sivuilleni. Nyt menin ja päivitin webbihotellissa olevan php-version vitosesta 7.3:ksi sillä seurauksella, että tuo lomake lakkasi toimimasta. Jos ymmärsin error_log -tiedostoa oikein, ongelma liittyy EREG -funktioon, joka ei ilmeisesti enää seiskassa toimi. Ja edelleen, jos ymmärsin oikein, sen voisi korvata PREG_MATCH -funktiolla. Ongelma vaan on, etten osaa tehdä tuota korvausta. Niin helppoa se ei tietenkään ollut, että olisi vaan korvannut koodissa tuon EREG-pätkän PREG_MATCH -pätkällä. Mites lomakkeen saisi taas toimivaksi ilman, että php:n downgreidaa takaisin vitoseen?

walkout_ [29.10.2020 04:24:18]

#

Juu ereg-functiot ovat poistettu uusimmasta PHP:sta, mutta on vaikea antaa mitään neuvoa mitä preg_match-function pitäisi tarkistaa, että mätsääkö jokin lomakkeen syöte. Esim. sillä voi tarkistaa, että onko syötetty sähköpostiosoite sitä mitä sen pitää olla.

Tässä kuitenkin jotain vastausta: https://stackoverflow.com/questions/4759063/replace-ereg-match-with-preg-match

Kannattaa Stack Overflowsta Googlettaa aina vastauksia kysymyksiin.

Teuro [29.10.2020 07:30:39]

#

PHP 7-versiossa on myös filter_var funktio, jolla voit tarkistaa useiden syötteiden muodollisen oikeellisuuden. Esimerkista lainattu snippetti emailiin menee näin kätevästi:

<?php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
?>

Metabolix [29.10.2020 07:39:16]

#

Kun eregin tilalle vaihdetaan preg_match, yksinkertaisissa tapauksissa riittää, että säännöllisen lausekkeen alkuun ja loppuun laittaa saman merkin, eli lauseke A muutetaan esimerkiksi muotoon /A/ tai #A#. Toisaalta usein filtteröintiin on parempiakin vaihtoehtoja. Nykyään lomakkeen tarkastukset kannattaa laittaa myös suoraan lomakkeeseen input-elementtien pattern-attribuutteihin, niin selain tarkastaa ne jo ennen lähetystä. (PHP:llä tarkastus on tietysti tarpeen hakkereita varten.)

Funktio ereg on merkitty vanhentuneeksi PHP 5.3:ssa vuonna 2009, joten ihan yllätyksenä funktion poistuminen ei pitäisi tulla. On syytä laittaa lokitiedostoon kaikki virheet, varoitukset, huomautukset ja deprekaatiot näkyviin ja seurata niitä, jotta saa virheet koodista korjattua – sekä vanhentumiseen liittyvät että muut.

Viimeinenkin ereg-funktiota tukenut versio PHP 5.6 on vuoden 2018 lopussa jäänyt kaikkien päivitysten (myös tietoturvapäivitysten) ulkopuolelle, joten version vaihto on aika pahasti myöhässä.

jarimi [29.10.2020 21:53:33]

#

Metabolix kirjoitti:

(29.10.2020 07:39:16): Kun eregin tilalle vaihdetaan preg_match...

Suurin ongelmahan tässä lienee se, että kun osaamaton ottaa valmiin esimerkin netistä, ei sille mitään osaa tehdä niin kauan kuin kaikki toimii. Sama juttu php:n ja sen versiopäivitysten kanssa. Valitettavasti en myöskään osannut vieläkään pelehtiä asianmukaisesti tuon preg_match -funktion kanssa. Laitan tähän sen pätkän fileestä, jossa tuo ereg esiintyi - nyt sen paikalle siis laitoin tuon preg_matchin, mutta ei tämä näin toimi. Eli saisiko ihan teräsbetonirautalankamallin, mitä muutan, jotta maailma taas pelastuisi - tai ainakin lomake alkaisi toimia:

	// Jos valittiin, että halutaan palautteeseen vastaus, pitää antaa myös sähköpostiosoite
		if (strlen($email) <5)
			exit ("Valitsit, että haluat palautteeseesi vastattavan, mutta et antanut sähköpostiosoitettasi tai se on virheellinen!");
		if (!preg_match("@", $email))
			exit ("Valitsit, että haluat palautteeseesi vastattavan, mutta et antanut sähköpostiosoitettasi tai se on virheellinen!");
	}
	if (strlen($vastaus) >30) {
		exit ("Vastaus-kentän pituus rajoitettu 30 merkkiin.");
	}

Kiitos ja anteeks.

VNabokov [29.10.2020 23:04:39]

#

Turha käyttää regexiä noin simppeliin tarkistukseen, se menee ihan strposillakin :)

Näin:

if (strpos($email, "@") === false)
   exit("Valitsit, että haluat...")

jarimi [29.10.2020 23:21:17]

#

VNabokov kirjoitti:

Turha käyttää regexiä noin simppeliin tarkistukseen, se menee ihan strposillakin :)

Näin:

if (strpos($email, "@") === false)
   exit("Valitsit, että haluat...")

Noniin se käy, kun sen osaa. Lomake käy ja kukkuu taas. Kiitoksia!

Metabolix [30.10.2020 08:25:23]

#

Tosiaan tässä strpos on parempi kuin preg_match. Kuitenkin ohjeeni mukaisesti muutos olisi onnistunut lisäämällä esimerkiksi /-merkki lausekkeen alkuun ja loppuun:

ereg("@", $email)
preg_match("/@/", $email)

Pelkän @-merkin tarkastusta parempi olisi silti tuo alussa mainittu filter_var:

if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
   exit("Valitsit, että haluat...")
}

Lisäksi kannattaa laittaa jo siihen lomakkeen kenttään text-tyypin sijaan email-tyyppi, jolloin selain ei anna lähettää väärin täytettyä lomaketta.

<input name="email" type="email">

Oikeastaan tapauksessasi voisi tuolloin jättää PHP-tarkastukset pois, koska jos joku kiertää selaimen tarkastukset ja lähettää tahallaan väärän osoitteen, hän ei varmaan ole oikeasti kiinnostunut, tuleeko palautteeseen vastaus.

Grez [30.10.2020 10:09:44]

#

Metabolix kirjoitti:

Oikeastaan tapauksessasi voisi tuolloin jättää PHP-tarkastukset pois, koska jos joku kiertää selaimen tarkastukset ja lähettää tahallaan väärän osoitteen, hän ei varmaan ole oikeasti kiinnostunut, tuleeko palautteeseen vastaus.

Tosin esim. IOS Safari ei CanIUse sivuston mukaan validoi tuota syötettä. Muilta osinhan tuki alle 10 vuotta vanhoissa selaimissa on hyvä.

The Alchemist [01.11.2020 06:51:04]

#

Teuro kirjoitti:

(29.10.2020 07:30:39): PHP 7-versiossa on myös filter_var funktio...

Funktio filter_var on sekava ja epäonnistunut viritelmä, sitä ei kannata käyttää.

Esimerkiksi FILTER_VALIDATE_EMAIL tulkitsee kommenttien perusteella kyseenalaisia sähköpostiosoitteita valideiksi.

Samoin FILTER_VALIDATE_BOOLEAN tulkisee laajan joukon eri avainsanoja "booleaneiksi". Oikeastaan jokainen filtterivaihtoehto tuntuu tekevän kyseenalaisia asioita.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta