/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Debricated function
Fra : Erik Ginnerskov


Dato : 09-09-11 16:45

Til håndtering af data fra en mailformular har jeg disse koder:

!eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
"navn"
!eregi("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
"navn"
!eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
"email"
!eregi("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
"email"

Men nu siger serveren, at eregi() er debricated. Jeg er blevet foreslået at
bruge preg_match() i stedet, men det kan jeg ikke få til at fungere.

!preg_match("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
"navn"
!preg_match("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
"navn"
!preg_match("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
"email"
!preg_match("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
"email"

Hvad vil være den korrekte syntax for at tjekke for uønsket forekomst af
linjeskift og vognretur i et input?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


 
 
Birger Sørensen (09-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 09-09-11 17:06

Erik Ginnerskov skrev:
> Til håndtering af data fra en mailformular har jeg disse koder:
>
> !eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
> "navn"
> !eregi("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
> "navn"
> !eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
> "email"
> !eregi("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
> "email"
>
> Men nu siger serveren, at eregi() er debricated. Jeg er blevet foreslået at
> bruge preg_match() i stedet, men det kan jeg ikke få til at fungere.
>
> !preg_match("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
> "navn"
> !preg_match("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
> "navn"
> !preg_match("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
> "email"
> !preg_match("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
> "email"
>
> Hvad vil være den korrekte syntax for at tjekke for uønsket forekomst af
> linjeskift og vognretur i et input?

(strpos($_POST['whatever'], "\r") === false) &&
(strpos($_POST['whatever'], "\n") === false) && ...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Asger-P (09-09-2011)
Kommentar
Fra : Asger-P


Dato : 09-09-11 17:09


Hej Erik

Jeg ved ikke en dyt om php, men hvis det var i C/C++ så
ville jeg tjekke for all kontrol karakterer altså alle
karakterer mindre end ' '

seudo kode:

Streng input;
tæller inputpos, resultatPos;

while( inputpos ikke har nået enden )
{
if( input[inputpos] >= ' ')
{
input[resultatPos] = input[inputpos];
resultatPos += 1;
}
inputpos += 1;
}
if( resultatPos < inputpos )
så sæt længden på input til resultatPos - 1;

SÃ¥ er strengen rippet for alle kontrol karakterer
\r \n \t osv.

Venlig hilsen
Asger-P

Bertel Lund Hansen (09-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-09-11 23:41

Asger-P skrev:

> Jeg ved ikke en dyt om php,

Strukturen i PHP er som i C. Forskellen er at variabelnavne
begynder med $. Du kan se et eksempel her:

http://bertel.lundhansen.dk/webdesign/show_phpcode.php?phpfile=pictureresize.php

Hvis man skal kode effektivt i PHP, skal man dog kende de
indbyggede funktioner (eller vide at de findes og hvor de kan
slås op).

> men hvis det var i C/C++ så ville jeg tjekke for all kontrol
> karakterer altså alle karakterer mindre end ' '

Så får du reaktion på tab som man måske gerne vil acceptere.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Stig Johansen (12-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 12-09-11 08:16

Bertel Lund Hansen wrote:

> Hvis man skal kode effektivt i PHP, skal man dog kende de
> indbyggede funktioner (eller vide at de findes og hvor de kan
> slås op).

Eller lave dem selv, som man gør i andre scriptsprog ;)
http://tuxradar.com/practicalphp/20/0/0

(Forudsætter dog at man har 'kontrol' over serveren).

--
Med venlig hilsen
Stig Johansen

Bertel Lund Hansen (09-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-09-11 18:06

Erik Ginnerskov skrev:

> Til håndtering af data fra en mailformular har jeg disse koder:

Overskuelig løsning:

$unwanted = array ("\n","\r");
$textstring=$_POST['name'].$_POST['email'];
$clean=true;
foreach ($unwanted as $char) {
   if (strpos($textstring,$char))!==false) {
      $clean=false;
      break;
}

> Hvad vil være den korrekte syntax for at tjekke for uønsket forekomst af
> linjeskift og vognretur i et input?

Undgå altid regulære udtryk når de ikke ernødvendige. Og husk at
man skal bruge 3 logiske tegn ved strpos() for ikke at få
problemer - altså her ! = og =.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin Larsen (09-09-2011)
Kommentar
Fra : Martin Larsen


Dato : 09-09-11 21:23

Bertel Lund Hansen wrote:

> Undgå altid regulære udtryk når de ikke ernødvendige.

Kommer lidt an på definitionen af "nødvendig" ! I princippet kan de jo
altid undgås, men alternativet vil ofte være uønsket.

Jeg vil snarere sige: Undgå regex når en simplere løsning er mulig.

Denne definition har den fordel at det afhænger af programmøren: Jeg fx
nærmest drømmer i regex, så for mig vil det ofte være den simpleste løsning.

I de allerfleste tilfælde betyder performance ingenting, det er primært
i tætte løkker etc. at det betyder noget.

Men givet at de fleste har problemer med regex, er dit råd helt fint

Erik Ginnerskov (10-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 10-09-11 22:09

Bertel Lund Hansen wrote:

> Overskuelig løsning:
>
> $unwanted = array ("\n","\r");
> $textstring=$_POST['name'].$_POST['email'];
> $clean=true;
> foreach ($unwanted as $char) {
> if (strpos($textstring,$char))!==false) {
> $clean=false;
> break;
> }

Så (gammel kode):
____

if (isset($_POST['submit']))
{
if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
!empty($_POST['email']) && // tjek, at der er skrevet i e-mail
adressefeltet
strpos($_POST['email'], "@") && //Tjek, at der skrevet et @ et sted i
e-mail adressefeltet
!empty($_POST['emne']) && // tjek, at der er skrevet et emne
!empty($_POST['besked']) && // tjek, at der er skrevet en besked

// her følger sikringen mod spambotter
!strpos($_POST['name'], "http://hjemmesideskolen.dk") && // tjek, at dit
domæne ikke er skrevet i feltet "navn"
!strpos($_POST['email'], "http://hjemmesideskolen.dk") && // tjek, at dit
domæne ikke er skrevet i feltet "email"
!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
!eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
"navn"
!eregi("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
"navn"
!eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
"email"
!eregi("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
"email"

// er alt ok, fortsættes med afsendelse af mailen
____

kan omskrives til (ny kode):
____

if (isset($_POST['submit']))
{
if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
!empty($_POST['email']) && // tjek, at der er skrevet i e-mail
adressefeltet
strpos($_POST['email'], "@") && //Tjek, at der skrevet et @ et sted i
e-mail adressefeltet
!empty($_POST['emne']) && // tjek, at der er skrevet et emne
!empty($_POST['besked']) && // tjek, at der er skrevet en besked

// her følger sikringen mod spambotter
!strpos($_POST['name'], "http://hjemmesideskolen.dk") && // tjek, at dit
domæne ikke er skrevet i feltet "navn"
!strpos($_POST['email'], "http://hjemmesideskolen.dk") && // tjek, at dit
domæne ikke er skrevet i feltet "email"
!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
$unwanted = array ("\n","\r");
$textstring=$_POST['name'].$_POST['email'];
$clean=true;
foreach ($unwanted as $char) {
if (strpos($textstring,$char))!==false) {
$clean=false;
break;
}
____

?? Eller skal jeg have fjernet et par & i tredje spamsikringslinje?

Den fuldstændige gamle kode kan ses her:

http://hjemmesideskolen.dk/usenet/sender.txt

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Bertel Lund Hansen (11-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-11 09:34

Erik Ginnerskov skrev:

> Bertel Lund Hansen wrote:

> Så (gammel kode):
> kan omskrives til (ny kode):

Nej. Det vil ikke virke. Du skal *altid* tjekke strpos() med tre
logiske tegn.

Eksempel:
   $textstring = "http://hjemmesideskolen.dk";
   if (!strpos($textstring,"http://hjemmesideskolen.dk")) echo "Okay!";
   else echo "Problem!";

   Udskrift: Okay!
   
strpos() returnerer positionen af strengen som er 0. Med løst
tjek betyder 0 og false det samme, så man får det forkerte svar
at strengen ikke er fundet. Derimod

   if (strpos($textstring,"http://hjemmesideskolen.dk"===false)) echo "Okay!";
   else echo "Problem!";

   Udskrift: Problem!

Men jeg har omskrevet hele afsnittet til noget mere overskueligt.
Jeg laver en funktion til det egentlige arbejde. Dels får det
noget kode flyttet væk fra hovedrutinen, og dels har en funktion
lige her den fordel at vi kan forladen den så snart en deltest
er fejlet:

function check_email () {
if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return 0;
if (empty($_POST['email'] || strpos($_POST['email'], "@")===false) return 0;
if (empty($_POST['emne']) return 0;
if (empty($_POST['besked']) return 0;
$textstring=$_POST['name'].$_POST['email'];
$unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
foreach ($unwanted as $unit)
if (strpos($textstring,$unit))!==false) return 0
return 1;
}

if (isset($_POST['submit'])) {
   if (check_email()) send roligt mailen afsted...;
}

Læg først og fremmest mærke til at jeg bruger = = = når jeg
tjekker med strpos(),

Læg derefter mærke til at så snart der er fundet et problem,
returnerer funktionen med et 0 (svarer til false).
Hvis alle deltjek passeres fejlfrit, returneres 1.
Læg også mærke til at jeg blot har indføjet hjemmesideadressen
som et uønsket element.

Jeg bruger nu $unit i stedet for $char. Det har ingen som helst
betydning - udover at "char" betyder "(enkelt)tegn", og nu er
der også en streng der tjekkes.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (11-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-11 10:02

Bertel Lund Hansen skrev:

> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return 0;

Tanketorsk. Det skal være:

if (empty($_POST['name'] || strpos($_POST['email'], "@")!==false) return 0;

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Birger Sørensen (11-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 11-09-11 18:32

Bertel Lund Hansen kom med denne ide:
> Erik Ginnerskov skrev:
>
>> Bertel Lund Hansen wrote:
>
>> Så (gammel kode):
>> kan omskrives til (ny kode):
>
> Nej. Det vil ikke virke. Du skal *altid* tjekke strpos() med tre
> logiske tegn.
>
> Eksempel:
>    $textstring = "http://hjemmesideskolen.dk";
>    if (!strpos($textstring,"http://hjemmesideskolen.dk")) echo "Okay!";
>    else echo "Problem!";
>
>    Udskrift: Okay!
>    
> strpos() returnerer positionen af strengen som er 0. Med løst
> tjek betyder 0 og false det samme, så man får det forkerte svar
> at strengen ikke er fundet. Derimod
>
>    if (strpos($textstring,"http://hjemmesideskolen.dk"===false)) echo
> "Okay!";    else echo "Problem!";
>
>    Udskrift: Problem!
>
> Men jeg har omskrevet hele afsnittet til noget mere overskueligt.
> Jeg laver en funktion til det egentlige arbejde. Dels får det
> noget kode flyttet væk fra hovedrutinen, og dels har en funktion
> lige her den fordel at vi kan forladen den så snart en deltest
> er fejlet:
>
> function check_email () {
> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return
> 0; if (empty($_POST['email'] || strpos($_POST['email'], "@")===false)
> return 0; if (empty($_POST['emne']) return 0;
> if (empty($_POST['besked']) return 0;
> $textstring=$_POST['name'].$_POST['email'];
> $unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
> foreach ($unwanted as $unit)
> if (strpos($textstring,$unit))!==false) return 0
> return 1;
> }
>
> if (isset($_POST['submit'])) {
>    if (check_email()) send roligt mailen afsted...;
> }
>
> Læg først og fremmest mærke til at jeg bruger = = = når jeg
> tjekker med strpos(),
>
> Læg derefter mærke til at så snart der er fundet et problem,
> returnerer funktionen med et 0 (svarer til false).
> Hvis alle deltjek passeres fejlfrit, returneres 1.
> Læg også mærke til at jeg blot har indføjet hjemmesideadressen
> som et uønsket element.
>
> Jeg bruger nu $unit i stedet for $char. Det har ingen som helst
> betydning - udover at "char" betyder "(enkelt)tegn", og nu er
> der også en streng der tjekkes.

= er tildeling af værdi.
== (!=) er en sammenligning af værdi
=== (!==) er en sammenligning af værdi *og* type

0 == false returnerer true
'1' == 1 returnerer true
0 === false returnerer false - den ene er et tal, den anden en boolean
'1' === 1 returnerer false - den ene er en streng, den anden et tal.

strpos (og mange andre PHP-funktioner) returnerer enten et tal eller
falsk, hvis der ikke findes et match.
Derfor skal resultatet altid checkes med ===
om man så skal bruge === eller !== afhænger af hvordan man
sammenligner, og hvordan man skal bruge resultatet.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Birger Sørensen (11-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 11-09-11 19:00

Bertel Lund Hansen:
> Erik Ginnerskov skrev:
>
>> Bertel Lund Hansen wrote:
>
>> Så (gammel kode):
>> kan omskrives til (ny kode):
>
> Nej. Det vil ikke virke. Du skal *altid* tjekke strpos() med tre
> logiske tegn.
>
> Eksempel:
>    $textstring = "http://hjemmesideskolen.dk";
>    if (!strpos($textstring,"http://hjemmesideskolen.dk")) echo "Okay!";
>    else echo "Problem!";
>
>    Udskrift: Okay!
>    
> strpos() returnerer positionen af strengen som er 0. Med løst
> tjek betyder 0 og false det samme, så man får det forkerte svar
> at strengen ikke er fundet. Derimod
>
>    if (strpos($textstring,"http://hjemmesideskolen.dk"===false)) echo
> "Okay!";    else echo "Problem!";
>
>    Udskrift: Problem!
>
> Men jeg har omskrevet hele afsnittet til noget mere overskueligt.
> Jeg laver en funktion til det egentlige arbejde. Dels får det
> noget kode flyttet væk fra hovedrutinen, og dels har en funktion
> lige her den fordel at vi kan forladen den så snart en deltest
> er fejlet:
>
> function check_email () {
> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return
> 0; if (empty($_POST['email'] || strpos($_POST['email'], "@")===false)
> return 0; if (empty($_POST['emne']) return 0;
> if (empty($_POST['besked']) return 0;
> $textstring=$_POST['name'].$_POST['email'];
> $unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
> foreach ($unwanted as $unit)
> if (strpos($textstring,$unit))!==false) return 0
> return 1;
> }
>
> if (isset($_POST['submit'])) {
>    if (check_email()) send roligt mailen afsted...;
> }
>
> Læg først og fremmest mærke til at jeg bruger = = = når jeg
> tjekker med strpos(),
>
> Læg derefter mærke til at så snart der er fundet et problem,
> returnerer funktionen med et 0 (svarer til false).
> Hvis alle deltjek passeres fejlfrit, returneres 1.
> Læg også mærke til at jeg blot har indføjet hjemmesideadressen
> som et uønsket element.
>
> Jeg bruger nu $unit i stedet for $char. Det har ingen som helst
> betydning - udover at "char" betyder "(enkelt)tegn", og nu er
> der også en streng der tjekkes.

function check_email () {
$res = true;
if ( !empty($_POST['name'] &&
!empty($_POST['email'] &&
!empty($_POST['emne']) &&
!empty($_POST['besked']) &&
(strpos($_POST['email'], "@") > 0) {
$textstring = $_POST['name'].$_POST['email'];
$unwanted = array("\n", "\r", "http://hjemmesideskolen.dk");
for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {
if (strpos($textstring, $unwated[$idx]) === true) {
$res = false;
}
}
}
else {
$res = false;
}
return $res;
}

- gør vist nogenlunde det samme, og afbryder ikke i utide, med return
hvor de programmeringsmæssigt ikke hører til, og returnerer en boolean,
hvor der skal bruges en boolean (true hvis OK og false hvis der er
tomme, hvis der ikke er et @ efter 1. karakter i email, eller hvis en
af de unwanted findes i navn eller email).
Og så er det IMHO en del lettere både læseligt og forståeligt...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Bertel Lund Hansen (11-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-11 21:42

Birger Sørensen skrev:

> for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {

foreach er hurtigere.

> - gør vist nogenlunde det samme, og afbryder ikke i utide, med return

Det er et religionsspørgsmål. Jeg benytter return flittigt midt i
funktioner.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Birger Sørensen (11-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 11-09-11 23:58

Bertel Lund Hansen formulerede søndag:
> Birger Sørensen skrev:
>
>> for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {
>
> foreach er hurtigere.

Men ikke til at stoppe...
Betyder ikke noget med tre elementer i arrayet, men kan gøre det i
andre tilfælde.

>
>> - gør vist nogenlunde det samme, og afbryder ikke i utide, med return
>
> Det er et religionsspørgsmål. Jeg benytter return flittigt midt i
> funktioner.

Det er også et spørgsmål om at skrive læsbar og forståelig kode.
return er til at returnere en værdi - ikke til at afbryde et forløb.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Bertel Lund Hansen (12-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-09-11 00:51

Birger Sørensen skrev:

>>> for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {

>> foreach er hurtigere.

> Men ikke til at stoppe...

Æh jo ... se mit forslag.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Andreas Andersen (12-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 12-09-11 05:25

Den 12-09-2011 00:58, Birger Sørensen skrev:
> Bertel Lund Hansen formulerede søndag:
>> Birger Sørensen skrev:
>>
>>> for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {
>>
>> foreach er hurtigere.
>
> Men ikke til at stoppe...
> Betyder ikke noget med tre elementer i arrayet, men kan gøre det i andre
> tilfælde.
>
>>
>>> - gør vist nogenlunde det samme, og afbryder ikke i utide, med return
>>
>> Det er et religionsspørgsmål. Jeg benytter return flittigt midt i
>> funktioner.
>
> Det er også et spørgsmål om at skrive læsbar og forståelig kode.
> return er til at returnere en værdi - ikke til at afbryde et forløb.

Den holdning er jeg aldrig tidligere stødt på, men fair nok. Jeg synes
som minimum, at du bør breake ud af for-løkken, så snart du kender
resultatet.

Et sted man altid bør have return til sidst er i en rekursiv funktion i
et sprog, hvor hale-rekursive kald bliver optimeret til at genbruge den
samme stackframe, men jeg kan se på Google, at PHP ikke er sådan et sprog.

--
Andreas

Andreas Andersen (12-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 12-09-11 06:12

Den 12-09-2011 06:24, Andreas Andersen skrev:
> Den holdning er jeg aldrig tidligere stødt på, men fair nok. Jeg synes
> som minimum, at du bør breake ud af for-løkken, så snart du kender
> resultatet.

Det check havde du selvfølgelig oppe i for-løkken. Det synes jeg faktisk
er at gemme logik væk, hvor det ikke hører hjemme. Return-strategien er
mere læsbar for mig.

--
Andreas

Birger Sørensen (12-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 12-09-11 07:55

Følgende er skrevet af Andreas Andersen:
> Den 12-09-2011 06:24, Andreas Andersen skrev:
>> Den holdning er jeg aldrig tidligere stødt på, men fair nok. Jeg synes
>> som minimum, at du bør breake ud af for-løkken, så snart du kender
>> resultatet.
>
> Det check havde du selvfølgelig oppe i for-løkken. Det synes jeg faktisk er
> at gemme logik væk, hvor det ikke hører hjemme. Return-strategien er mere
> læsbar for mig.

Jamen, så kalder vi det religion...
For mig er brug af return - og break - hvor det "ikke hører hjemme" et
resultat af dårlig struktureret kode.
Og at bruge betingelsen i en for-løkke, er netop at have logikken hvor
den hører hjemme - jeg skal gennem for-løkken, indtil en af to
betingelser er opfyldt : jeg har fundet det jeg leder efter, eller der
er ikke flere elementer. Normalt checker man kun for antallet af
elementer - men jeg er ikke bange for at bruge betingelsen til det den
er der for.
Jeg bruger faktisk denne konstuktion tit. Det kan skrives som en while;
$idx = 0;
while( $res && ($idx < ...)) {
...
$idx++;
}
hvor det måske er mere indlysende - men det er et spøgsmål om at læse
hvad der står, frem for at tro man ved hvad der stå i betingelsen, bare
fordi det er en for-løkke.

I øvrigt er det vist ikke alle sprog der tillader afbrydelse med
return, midt i koden. Mindes at f.eks. Pascal ikke gør - eller gjorde.
Der skal funktioner afsluttes med return - og står det andre steder,
bliver resten af koden ikke kompileret (kan hænde det har udviklet sig,
og jeg bare er ved at blive gammel...)

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Johansen (12-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 12-09-11 08:23

Birger Sørensen wrote:

> I øvrigt er det vist ikke alle sprog der tillader afbrydelse med
> return, midt i koden. Mindes at f.eks. Pascal ikke gør - eller gjorde.

Både ja.
Hvis vi definere 'Pascal' som Delphi, som er markedsledende, så har man i
'umindelige tider' kunnet bruge Exit;

Standard Pascal har også GOTO som option.

COBOL har også GOTO, hvorimod det ville være 'pænere' med f.eks. Transact's
RETURN.

PS: *Don't* get me started about GOTO's

--
Med venlig hilsen
Stig Johansen

Andreas Andersen (12-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 12-09-11 08:33

Den 12-09-2011 08:55, Birger Sørensen skrev:
> Jamen, så kalder vi det religion...
> For mig er brug af return - og break - hvor det "ikke hører hjemme" et
> resultat af dårlig struktureret kode.
> Og at bruge betingelsen i en for-løkke, er netop at have logikken hvor
> den hører hjemme - jeg skal gennem for-løkken, indtil en af to
> betingelser er opfyldt : jeg har fundet det jeg leder efter, eller der
> er ikke flere elementer. Normalt checker man kun for antallet af
> elementer - men jeg er ikke bange for at bruge betingelsen til det den
> er der for.
> Jeg bruger faktisk denne konstuktion tit. Det kan skrives som en while;
> $idx = 0;
> while( $res && ($idx < ...)) {
> ...
> $idx++;
> }
> hvor det måske er mere indlysende - men det er et spøgsmål om at læse
> hvad der står, frem for at tro man ved hvad der stå i betingelsen, bare
> fordi det er en for-løkke.

Ja, smag og behag. Jeg bruger stort set aldrig tællevariable, jeg kan
godt lide foreach-konstruktionen, og det er sjældent, jeg har brug for
at tælle.

--
Andreas

Bertel Lund Hansen (12-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-09-11 12:51

Birger Sørensen skrev:

> Jamen, så kalder vi det religion...
> For mig er brug af return - og break - hvor det "ikke hører hjemme" et
> resultat af dårlig struktureret kode.

Min kode er ikke dårligt struktureret. At du oplever det sådan er
kun et resultat af at du altid gør det modsat. Ukendt
kodestruktur føles forkert selv om den er rigtig - og mere
effektiv end din version. Du opererer med en tæller og en
resultatvariabel som begge er overflødige i min version som også
bruger en hurtigere løkke.

Du må have et problem med moderne programmerings brug af
exceptions. Det er netop karakteriseret ved at der afbrydes i
samme øjeblik et problem er opstået uanset om kodedelen er
'færdig'.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin Larsen (12-09-2011)
Kommentar
Fra : Martin Larsen


Dato : 12-09-11 10:36

Andreas Andersen wrote:

> Den holdning er jeg aldrig tidligere stødt på, men fair nok. Jeg synes
> som minimum, at du bør breake ud af for-løkken, så snart du kender
> resultatet.

Heller ikke jeg. Der er intet galt i at returnere så snart man ved at
man er færdig. Det giver *netop* klar og læsbar kode.

Birger Sørensen (13-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 13-09-11 06:54

Martin Larsen formulerede spørgsmålet:
> Andreas Andersen wrote:
> Heller ikke jeg. Der er intet galt i at returnere så snart man ved at man er
> færdig. Det giver *netop* klar og læsbar kode.

Det kan være, at min kode er så fremmed for dig, at du ikke forstår
den.
Min kode returnerer, så snart den er færdig.

For at komme tilbage til emnet, fandt jeg denne artikel om validering
af email adresser:
http://www.linuxjournal.com/article/9585?page=0,0
-færdig kode kan ses på
http://www.linuxjournal.com/article/9585?page=0,3

(og den gør i øvrigt som jeg, så i det mindste er jeg ikke alene om mit
"old-school" approach...)
^^

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Martin Larsen (13-09-2011)
Kommentar
Fra : Martin Larsen


Dato : 13-09-11 09:49

Birger Sørensen wrote:

> Det kan være, at min kode er så fremmed for dig, at du ikke forstår den.
> Min kode returnerer, så snart den er færdig.

Jeg forstår udmærket din kode, og jeg har heller ikke sagt at den ikke
returnerer så snart den er færdig.

Men det var mere en generel kommentar til brugen af return i en løkke,
og et svar til det du skrev tidligere: "... og afbryder ikke i utide ...".

Birger Sørensen (13-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 13-09-11 13:27

Martin Larsen frembragte:
> Birger Sørensen wrote:
>
>> Det kan være, at min kode er så fremmed for dig, at du ikke forstår den.
>> Min kode returnerer, så snart den er færdig.
>
> Jeg forstår udmærket din kode, og jeg har heller ikke sagt at den ikke
> returnerer så snart den er færdig.
>
> Men det var mere en generel kommentar til brugen af return i en løkke, og et
> svar til det du skrev tidligere: "... og afbryder ikke i utide ...".

^^
Ja, *det* misforstod jeg så..

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Erik Ginnerskov (15-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 15-09-11 22:23

Birger Sørensen wrote:

>> function check_email () {
>> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true)
>> return 0; if (empty($_POST['email'] || strpos($_POST['email'],
>> "@")===false) return 0; if (empty($_POST['emne']) return 0;
>> if (empty($_POST['besked']) return 0;
>> $textstring=$_POST['name'].$_POST['email'];
>> $unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
>> foreach ($unwanted as $unit)
>> if (strpos($textstring,$unit))!==false) return 0
>> return 1;
>> }
>>
>> if (isset($_POST['submit'])) {
>> if (check_email()) send roligt mailen afsted...;
>> }

Giver denne fejl:

Parse error: syntax error, unexpected T_BOOLEAN_AND, expecting ')' in
mail2sender.php on line 26

Den samlede kode ser sådan ud:

http://hjemmesideskolen.dk/usenet/mail2sender.txt

og kan testes her

http://hjemmesiddeskolen.dk/mail2.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Birger Sørensen (16-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 16-09-11 11:05

Følgende er skrevet af Erik Ginnerskov:
> Birger Sørensen wrote:
>
>>> function check_email () {
>>> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true)
>>> return 0; if (empty($_POST['email'] || strpos($_POST['email'],
>>> "@")===false) return 0; if (empty($_POST['emne']) return 0;
>>> if (empty($_POST['besked']) return 0;
>>> $textstring=$_POST['name'].$_POST['email'];
>>> $unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
>>> foreach ($unwanted as $unit)
>>> if (strpos($textstring,$unit))!==false) return 0
>>> return 1;
>>> }
>>>
>>> if (isset($_POST['submit'])) {
>>> if (check_email()) send roligt mailen afsted...;
>>> }
>
> Giver denne fejl:
>
> Parse error: syntax error, unexpected T_BOOLEAN_AND, expecting ')' in
> mail2sender.php on line 26
>
> Den samlede kode ser sådan ud:
>
> http://hjemmesideskolen.dk/usenet/mail2sender.txt
>
> og kan testes her
>
> http://hjemmesiddeskolen.dk/mail2.php

Der mangler nogle paranteser. (I hvert fald 3 steder...)

Prøv evt
http://bbsorensen.com/test/php_eks/eg.txt
i stedet.
(husk at rette modtager adresse i linie 14!)

Jeg kan af gode grunde ikke teste...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Erik Ginnerskov (17-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 17-09-11 10:47

Birger Sørensen wrote:

> Der mangler nogle paranteser. (I hvert fald 3 steder...)

Det var dit script.

> Prøv evt
> http://bbsorensen.com/test/php_eks/eg.txt
> i stedet.
> (husk at rette modtager adresse i linie 14!)

Parse error: syntax error, unexpected T_ELSE in mail3sender.php on line 26

det er denne linje:

else {
___

Det er i øvrigt forkert at indsætte et tjek for indtastning i feltet
'Subject' så sent. Der er allerede sendt html på det tidspunkt.

http://hjemmesideskolen.dk/usenet/mail3sender.txt
http://hjemmesideskolen.dk/mail3.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Birger Sørensen (17-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 17-09-11 13:03

Erik Ginnerskov kom med denne ide:
> Birger Sørensen wrote:
>
>> Der mangler nogle paranteser. (I hvert fald 3 steder...)
>
> Det var dit script.

Jow. Gør jeg tit -glemmer parantester ;>)
Det var ikke en anklage, men en forklaring af fejlen.

>
>> Prøv evt
>> http://bbsorensen.com/test/php_eks/eg.txt
>> i stedet.
>> (husk at rette modtager adresse i linie 14!)
>
> Parse error: syntax error, unexpected T_ELSE in mail3sender.php on line 26
>
> det er denne linje:
>
> else {

i mit script er linie 26 midt i noget HTML...

Fejlen skyldes formentlig, at der manger en } mellem linie 3 og 4...
(har indsat og uploaded ny...)

> Det er i øvrigt forkert at indsætte et tjek for indtastning i feltet
> 'Subject' så sent. Der er allerede sendt html på det tidspunkt.
>
> http://hjemmesideskolen.dk/usenet/mail3sender.txt
> http://hjemmesideskolen.dk/mail3.php

???
Check på $_POST['subject'], er det første der gøres i denne fil. Hvis
den includes i noget der skriver HTML, må du enten flytte checket til
før der udskrives, eller skrive HTML før til en variabel, som udskrives
efter checket.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Erik Ginnerskov (18-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 18-09-11 13:03

Birger Sørensen wrote:

> Fejlen skyldes formentlig, at der manger en } mellem linie 3 og 4...
> (har indsat og uploaded ny...)

Har prøvet, hvor jeg undlod at indsætte mit eget øverst. får nu denne fejl:

Fatal error: Call to undefined function chk_email() in mail3sender.php on
line 9

Det er denne kodelinje:

if (chk_email()) {

Den kan åbenbart ikke finde ud af, at funktionen er skrevet efter <\html>

Prøvede så at flytte den funktion op øverst, så brokker den sig over en } i
linje 2. Fjernede den og får så denne fejl:

Parse error: syntax error, unexpected $end in mail3sender.php on line 54

Det er en tom linje efter <\html>

http://hjemmesideskolen.dk/usenet/mail3sender.txt
http://hjemmesideskolen.dk/mail3.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Birger Sørensen (18-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 18-09-11 15:23

Erik Ginnerskov har bragt dette til verden:
> Har prøvet, hvor jeg undlod at indsætte mit eget øverst. får nu denne fejl:
>
> Fatal error: Call to undefined function chk_email() in mail3sender.php on
> line 9
>
> Det er denne kodelinje:
>
> if (chk_email()) {

Klart nok, for det hedder funktionen ikke... :/

Her rettet og uploadet endnu en gang...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Erik Ginnerskov (20-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-09-11 20:33

Birger Sørensen wrote:

>> if (chk_email()) {
>
> Klart nok, for det hedder funktionen ikke... :/
>
> Her rettet og uploadet endnu en gang...

Nu nærmer vi os vist noget, der fungerer:

Notice: Undefined variable: unwated in mail3sender.php on line 46
Notice: Undefined variable: body in mail3sender.php on line 15
E-mailen blev ikke sendt. Der skete en fejl. Prøv igen!

Linje 15:

$body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " .
$_POST['name'] . ":\r\n\r\n" .

Og linje 46:

if (strpos($textstring, $unwated[$idx]) === true) {
is

http://hjemmesideskolen.dk/usenet/mail3sender.txt
http://hjemmesideskolen.dk/mail3.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Birger Sørensen (21-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 21-09-11 09:07

Erik Ginnerskov tastede følgende:
> Nu nærmer vi os vist noget, der fungerer:
>
> Notice: Undefined variable: unwated in mail3sender.php on line 46
> Notice: Undefined variable: body in mail3sender.php on line 15
> E-mailen blev ikke sendt. Der skete en fejl. Prøv igen!
>
> Linje 15:
>
> $body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " .
> $_POST['name'] . ":\r\n\r\n" .
>
> Og linje 46:
>
> if (strpos($textstring, $unwated[$idx]) === true) {
> is
>
> http://hjemmesideskolen.dk/usenet/mail3sender.txt
> http://hjemmesideskolen.dk/mail3.php

Har rettet og uplodet - igen, igen ^^
http://bbsorensen.com/test/php_eks/eg.txt

Linie 15 skal ikke have . i assignmenten (det er concatenation, altså
sammensætning af strenge, og $body findes ikke i forvejen, så er det
lidt svært at føje noget til den.) - det skal stå = ikke .= . Det er
kun en Notice - PHP sætter $body til en tom streng, før den føjer noget
til, men det er stadig forkert, at gøre det på den måde. Det stammer
fra dit eget eksempel.

Linie 46 er lidt værre - det er en stavefejl: der mangler et n i
unwanted. Også kun en Notice, og PHP opretter blot den variable der
ikke findes, men til forskel fra den forrige, bliver resultatet denne
gang forkert.
Kan ikke huske om det blev kopieret fra dit eget, eller det er mig der
har sprunget det n over...

Jeg har indsat og udkommenteret en alternativ dato angivelse, der også
har tidszonen med. Den tid der anvendes er den på serveren, og den
behøver ikke stå i samme zone som modtageren bor, så det kan være rart
at have.
Se evt. http://dk.php.net/manual/en/function.date.php

Til gengæld kan jeg ikke umiddelbart se nogen grund til at emailen ikke
bliver sendt. (hvis du har husket at ændere To adressen).
Det kunne være, at der ikke tillades den From du angiver. Nogle servere
tillader ikke "tilfældige" afsendere. Det er (eller var i ældre
versioner af PHP) heller ikke altid muligt at bruge Bcc - prøv evt. Cc
i stedet..
Der kan desuden være flere andre spidsfindigheder, og opsætningen kan
også være afhængig af OS'et på serveren ( *nix og Windows opfører sig
ikke ens)
http://dk.php.net/manual/en/function.mail.php

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Johansen (22-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 22-09-11 07:35

Birger Sørensen wrote:

> Linie 46 er lidt værre - det er en stavefejl: der mangler et n i
> unwanted. Også kun en Notice, og PHP opretter blot den variable der
> ikke findes, men til forskel fra den forrige, bliver resultatet denne
> gang forkert.

Velkommen til de typesvage sprogs verden;)

Nemt at lave, og ufattelig nemt at begå fejl, og noget lort at fejlfinde i.

Problemet (generelt) er at man fokuserer på _kodningstiden_ for et projekt,
uagtet det kun er ca. 10% af et projekt.

Hvis man sælger et projekt 'as is', er der en ide, men 'os', der skal
vedligeholde ens egen kode, selv efter 5 år, sætter pris på man har lavet
_læsbar_ kode ;)

--
Med venlig hilsen
Stig Johansen

Erik Ginnerskov (15-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 15-09-11 22:07

Bertel Lund Hansen wrote:

> function check_email () {
> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true)
> return 0; if (empty($_POST['email'] || strpos($_POST['email'],
> "@")===false) return 0; if (empty($_POST['emne']) return 0;
> if (empty($_POST['besked']) return 0;
> $textstring=$_POST['name'].$_POST['email'];
> $unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
> foreach ($unwanted as $unit)
> if (strpos($textstring,$unit))!==false) return 0
> return 1;
> }
>
> if (isset($_POST['submit'])) {
> if (check_email()) send roligt mailen afsted...;
> }

Jeg får en fejl:

Parse error: syntax error, unexpected T_BOOLEAN_OR, expecting ')' in
mailsender.php on line 25

.... det er denne linje:

if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return
0;

Det komplette script ser nu sådan ud:

http://hjemmesideskolen.dk/usenet/mailsender.txt

og kan testes på denne midlertidige url:

http://hjemmesideskolen.dk/mail.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Stig Johansen (16-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 16-09-11 07:10

Erik Ginnerskov wrote:

> Parse error: syntax error, unexpected T_BOOLEAN_OR, expecting ')' in
> mailsender.php on line 25
>
> ... det er denne linje:
>
> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true)
> return
> 0;
>
> Det komplette script ser nu sådan ud:
>
> http://hjemmesideskolen.dk/usenet/mailsender.txt

I denne fil er linie 25 (i min editor):
if (strpos($textstring,$unit))!==false) return 0

--
Med venlig hilsen
Stig Johansen

Erik Ginnerskov (17-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 17-09-11 10:25

Stig Johansen wrote:

>> http://hjemmesideskolen.dk/usenet/mailsender.txt
>
> I denne fil er linie 25 (i min editor):
> if (strpos($textstring,$unit))!==false) return 0

Ja, for jeg har fjernet nogle lenjer, som alene undertrykker nogle
fejlmeddelelser, der alligevel ikke har betydning for afvikling af scriptet.
Så min linjetælling er god nok. den fejlgivende linje 25 er:

if (empty($_POST['name'] || strpos($_POST['email'], "@")===true) return
0;

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Stig Johansen (19-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 19-09-11 08:59

Erik Ginnerskov wrote:

> Stig Johansen wrote:
>
>>> http://hjemmesideskolen.dk/usenet/mailsender.txt
>>
>> I denne fil er linie 25 (i min editor):
>> if (strpos($textstring,$unit))!==false) return 0
>
> Ja, for jeg har fjernet nogle lenjer, som alene undertrykker nogle
> fejlmeddelelser, der alligevel ikke har betydning for afvikling af
> scriptet. Så min linjetælling er god nok. den fejlgivende linje 25 er:
>
> if (empty($_POST['name'] || strpos($_POST['email'], "@")===true)
> return
> 0;

Jo, men læg mærke til du i begge linier har mismatch mellem paranteserne.

Alle der det ( og ) kan godt gøre at man mister overblikket (been there done
that).

I den linie jeg refererer til har du 2 ( med 3 ), dvs. enten mangler du en
( eller har en ) for meget.

I din linie er der 3 ( og 2 ) - dvs. omvendt.

Når jeg laver den slags plejer jeg at dele det op i linier for at lette
overblikket, f.eks:
if (
strpos($textstring,$unit)
) <------- mon ikke denne er i overskud?
!==false)
return 0

--
Med venlig hilsen
Stig Johansen

Bertel Lund Hansen (16-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 16-09-11 10:53

Erik Ginnerskov skrev:

>> if (strpos($textstring,$unit))!==false) return 0

> Jeg får en fejl:

Det er et glemt semikolon. Tilføj det til ovenstående linje.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (17-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 17-09-11 10:31

Bertel Lund Hansen wrote:

> Det er et glemt semikolon. Tilføj det til ovenstående linje.

Semikolon tilføjet, men scriptafviklingen når slet ikke ned til den linje.
De bortredigerede linjer er genindsat i mailsender.txt, så du kan tælle
rigtigt.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Bertel Lund Hansen (17-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 17-09-11 12:59

Erik Ginnerskov skrev:

> Semikolon tilføjet, men scriptafviklingen når slet ikke ned til den linje.
> De bortredigerede linjer er genindsat i mailsender.txt, så du kan tælle
> rigtigt.

Her er det reviderede script (utestet). Jeg tilføjede et
semikolon og rettede en test på "true" til "false" i check_email().

Derudover fjernede jeg den danske tskt som jeg kun havde indst
for at vise dig hvor fortsættelsen skulle stå ("send roligt mailen afsted...").

Jeg har krølleparentes begynd på samme linje som den kommando den
hører til. Det bevirker at man kan have flere kodelinjer på
skærmen ad gangen, og det giver bedre overblik. Men du kan jo
bare rette det hvis du vil.

<?php
if (!empty($_POST['subject'])) {
   header ("Location: blokeret.php");
   exit;
}
?>
<?php
ini_set('display_startup_errors', 'off');
ini_set('display_errors', 'off');
ini_set('html_errors', 'false');
ini_set("implicit_flush", false);

$strTitle="Meddelelse er sendt";
include 'header.inc';
?>
</head>
<body>

<div id="indhold">
<h1><?php echo $strTitle?></h1>

<p><!--WebWriter AutoDato-->Siden er opdateret 27.8.2007<!--WW--></p>

<?php
function check_email () {
if (empty($_POST['name'] || strpos($_POST['email'], "@")===false) return 0;
if (empty($_POST['email'] || strpos($_POST['email'], "@")===false) return 0;
if (empty($_POST['emne']) return 0;
if (empty($_POST['besked']) return 0;
$textstring=$_POST['name'].$_POST['email'];
$unwanted = array ("\n","\r","http://hjemmesideskolen.dk");
foreach ($unwanted as $unit)
if (strpos($textstring,$unit))!==false) return 0;
return 1;
}

if (isset($_POST['submit'])) {
// er alt ok, fortsættes med afsendelse af mailen
if (check_email()) {
$headers="From: ".$_POST['name']."<".$_POST['email'].">";
if (@$_POST['customer_copy']) {
$headers .= "\r\nBcc: ".$_POST['email'];
}
$body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
if (@mail("ok@domæne.invalid", strip_tags($_POST['emne']), stripslashes(strip_tags($body)), $headers)) {
echo "<p>Tak for din henvendelse. Jeg svarer så hurtigt som muligt.</p>";
}
else {
echo "<p>E-mailen blev ikke sendt. Der skete en fejl. Prøv igen!</p>";
}
}
else {
echo "<p>Mailen kunne ikke sendes, alle felter skal udfyldes korrekt!</p>";
}
}
?>

<h5><?php include 'copyright.inc'; ?> april 2003</h5>
</div>

<div id="topbar"><?php include 'topbar.inc'; ?></div>

<div id="menu"><?php include 'menu.inc'; ?></div>

</body>
</html>

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (18-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 18-09-11 13:12

Bertel Lund Hansen wrote:

> Her er det reviderede script (utestet). Jeg tilføjede et
> semikolon og rettede en test på "true" til "false" i check_email().

Og glemte så flere steder et ? før >, men dem fangede jeg selv og rettede.

Prøvede scriptet men fik denne fejl:

Parse error: syntax error, unexpected T_BOOLEAN_OR, expecting ')' in
mail2sender.php on line 25

Det er denne kodelinje:

if (empty($_POST['name'] || strpos($_POST['email'], "@")===false) return
0;

I den og næste linje er der en ( og to )

http://hjemmesideskolen.dk/usenet/mail2sender.txt
http://hjemmesideskolen.dk/mail2.php

> Jeg har krølleparentes begynd på samme linje som den kommando den
> hører til. Det bevirker at man kan have flere kodelinjer på
> skærmen ad gangen, og det giver bedre overblik. Men du kan jo
> bare rette det hvis du vil.

Foreløbig har jeg ikke ændret på det.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Bertel Lund Hansen (18-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-09-11 14:20

Erik Ginnerskov skrev:

> Det er denne kodelinje:

if (empty($_POST['name']) || strpos($_POST['email'], "@")===false) return 0;

Manglede parentes før ||. Det er samme fejl i næste linje.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (20-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-09-11 20:40

Bertel Lund Hansen wrote:
> if (empty($_POST['name']) || strpos($_POST['email'], "@")===false)
> return 0;
>
> Manglede parentes før ||. Det er samme fejl i næste linje.

Rettet. Får nu denne fejl:

Parse error: syntax error, unexpected T_RETURN in mail2sender.php on line 27

if (empty($_POST['emne']) return 0;

http://hjemmesideskolen.dk/usenet/mail2sender.txt
http://hjemmesideskolen.dk/mail2.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Bertel Lund Hansen (20-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-09-11 22:35

Erik Ginnerskov skrev:

> Rettet. Får nu denne fejl:

> Parse error: syntax error, unexpected T_RETURN in mail2sender.php on line 27

> if (empty($_POST['emne']) return 0;

Indføj en slutparentes før "return"

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (20-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-09-11 23:43

Bertel Lund Hansen wrote:

>> Parse error: syntax error, unexpected T_RETURN in mail2sender.php on
>> line 27
>
>> if (empty($_POST['emne']) return 0;
>
> Indføj en slutparentes før "return"

Gjorde jeg - og i linje 28 også, kunne se at den ville udløse en tilsvarende
fejl. Nu får jeg så denne fejl:

Parse error: syntax error, unexpected T_IS_NOT_IDENTICAL in mail2sender.php
on line 32

Kodelinjen:

if (strpos($textstring,$unit))!==false) return 0;

Nogle variabler er åbenbart ikke identiske, men hvilke? I øvrigt ser det
også ud til, at der er parentesfejl i den linje - 2 ( og 3 ).

http://hjemmesideskolen.dk/usenet/mail2sender.txt
http://hjemmesideskolen.dk/mail2.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Bertel Lund Hansen (21-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-09-11 00:12

Erik Ginnerskov skrev:

> Gjorde jeg - og i linje 28 også, kunne se at den ville udløse en tilsvarende
> fejl. Nu får jeg så denne fejl:

> Parse error: syntax error, unexpected T_IS_NOT_IDENTICAL in mail2sender.php
> on line 32

> Kodelinjen:

> if (strpos($textstring,$unit))!==false) return 0;

> Nogle variabler er åbenbart ikke identiske, men hvilke? I øvrigt ser det
> også ud til, at der er parentesfejl i den linje - 2 ( og 3 ).

Ret den først. Én fejl kan somme tider udløse en ulogisk besked.

Generelt om parenteser:

1. Betingelsen efter if skal være omkranset af parenteser.
2. Parametre til en funktion skal være omkranset af parenteser.

Prøv på basis af de to regler selv at rette parentesfejlen.

Hvis der så stadig er fejl, så skriv igen.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Leif Neland (11-09-2011)
Kommentar
Fra : Leif Neland


Dato : 11-09-11 20:22

Den 10-09-2011 23:09, Erik Ginnerskov skrev:
> !eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
> "navn"

> // er alt ok, fortsættes med afsendelse af mailen

Det er generelt bedre at kontrollere, at der kun er de tegn, der må
være, end at ville checke for de tegn, man mener kan lave ulykker.

Se f.ex. http://en.wikipedia.org/wiki/Email_address for de tegn, der må
være.

Leif

--
Bevar P2, luk P3, der er nok P3'er i forvejen.

Erik Ginnerskov (21-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-09-11 10:26

On 21 Sep., 10:06, Birger Sørensen <s...@bbsorensen.com> wrote:
> Erik Ginnerskov tastede følgende:

> Har rettet og uplodet - igen, igen ^^http://bbsorensen.com/test/php_eks/eg.txt

Så spiller det, ingen fejlmeddelelser (efter igen at have rettet din
anførselstegnfejl i linje 8.

Mail afsendt både til modtager og til bcc. Nu skal der bare lidt test
for funktionerne, som skal hindre intrusion.

http://hjemmesideskolen.dk/usenet/mail3sender.txt
http://hjemmesideskolen.dk/mail3.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Birger Sørensen (21-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 21-09-11 22:16

Erik Ginnerskov skrev:
> On 21 Sep., 10:06, Birger Sørensen <s...@bbsorensen.com> wrote:
>> Erik Ginnerskov tastede følgende:
>
>> Har rettet og uplodet - igen, igen
>> ^^http://bbsorensen.com/test/php_eks/eg.txt
>
> Så spiller det, ingen fejlmeddelelser (efter igen at have rettet din
> anførselstegnfejl i linje 8.
>
> Mail afsendt både til modtager og til bcc. Nu skal der bare lidt test
> for funktionerne, som skal hindre intrusion.
>
> http://hjemmesideskolen.dk/usenet/mail3sender.txt
> http://hjemmesideskolen.dk/mail3.php

^^
Den havde jeg ikke set - det er også bare kopieret fra dit eget...
:-?

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Erik Ginnerskov (22-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 22-09-11 22:36

Birger Sørensen wrote:

> Den havde jeg ikke set

Nej, det havde du nok ikke.

> - det er også bare kopieret fra dit eget...

Nej, for jeg havde rettet det i txt-filen også.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk


Erik Ginnerskov (21-09-2011)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-09-11 10:40

On 21 Sep., 00:42, "Erik Ginnerskov" <erik.ginners...@live.dk> wrote:
> Bertel Lund Hansen wrote:

>         if (strpos($textstring,$unit))!==false) return 0;
>
> Nogle variabler er åbenbart ikke identiske, men hvilke? I øvrigt ser det
> også ud til, at der er parentesfejl i den linje - 2 ( og 3 ).

Fjernede den ene ) efter $unit, så spiller det. Mail afsendt til både
modtager og bcc

if (strpos($textstring,$unit)!==false) return 0;

http://hjemmesideskolen.dk/usenet/mail2sender.txt
http://hjemmesideskolen.dk/mail2.php

--
Med venlig hilsen
Erik Ginnerskovhttp://hjemmesideskolen.dk-http://ginnerskov.dk


Asger-P (10-09-2011)
Kommentar
Fra : Asger-P


Dato : 10-09-11 01:14


Hej Bertel

On the: 10. of september-2011 At: 00:41 Bertel Lund Hansen wrote:

>> men hvis det var i C/C++ så ville jeg tjekke for all kontrol
>> karakterer altså alle karakterer mindre end ' '
>
> Så får du reaktion på tab som man måske gerne vil acceptere.

Ja det var også planen, tab er da så vidt jeg ved ikke en
accepteret email karakter.

Venlig hilsen
Asger-P

Asger-P (12-09-2011)
Kommentar
Fra : Asger-P


Dato : 12-09-11 00:37


Hi Birger

On the: 12. of september-2011 At: 00:58 Birger Sørensen wrote:


>>> - gør vist nogenlunde det samme, og afbryder ikke i utide, med return
>>
>> Det er et religionsspørgsmål. Jeg benytter return flittigt midt i
>> funktioner.
>
> Det er også et spørgsmål om at skrive læsbar og forståelig kode.
> return er til at returnere en værdi - ikke til at afbryde et forløb.

Er det noget specielt for PHP ?
Det med at afbryde med return er da I andre sprog en velkendt
og meget anvendt metode.

Det gør ofte at det er meget lettere at strukturere koden f.eks.

if( Result == FAILED )
return ErrorCode eller throw Exception(error code)

Så kan success koden fortsætte uden indryk og {
men som Bertel antydede så er det jo et spørgsmål om trosretning.

Venlig hilsen
Asger-P

Bertel Lund Hansen (12-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-09-11 00:50

Asger-P skrev:

>> Det er også et spørgsmål om at skrive læsbar og forståelig kode.
>> return er til at returnere en værdi - ikke til at afbryde et forløb.

> Er det noget specielt for PHP ?

Overhovedet ikke. Det er et rent holdningsspørgsmål.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Asger-P (12-09-2011)
Kommentar
Fra : Asger-P


Dato : 12-09-11 01:02


Hi Bertel

On the: 12. of september-2011 At: 01:50 Bertel Lund Hansen wrote:

> Birger Sørensen skrev:
>
>>>> for ( $idx = 0; $res && ($idx < count($unwanted)-1); $idx++) {
>
>>> foreach er hurtigere.
>
>> Men ikke til at stoppe...
>
> Æh jo ... se mit forslag.

Kan foreach afbrydes med break som while kan ?


Venlig hilsen
Asger-P

Bertel Lund Hansen (12-09-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-09-11 12:46

Asger-P skrev:

> Kan foreach afbrydes med break som while kan ?

Ja, naturligvis.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin (21-09-2011)
Kommentar
Fra : Martin


Dato : 21-09-11 09:56

On 09-09-2011 17:44, Erik Ginnerskov wrote:
> Til håndtering af data fra en mailformular har jeg disse koder:
>
> !eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
> "navn"
> !eregi("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift" i
> "navn"
> !eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i
> "email"
> !eregi("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift" i
> "email"
>
> Men nu siger serveren, at eregi() er debricated. Jeg er blevet foreslået
> at bruge preg_match() i stedet, men det kan jeg ikke få til at fungere.
>
> !preg_match("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur"
> i "navn"
> !preg_match("\n",$_POST['name']) && // tjek, at der ikke er "linjeskift"
> i "navn"
> !preg_match("\r",$_POST['email']) && // tjek, at der ikke er
> "vogn-retur" i "email"
> !preg_match("\n",$_POST['email'])) // tjek, at der ikke er "linjeskift"
> i "email"
>
> Hvad vil være den korrekte syntax for at tjekke for uønsket forekomst af
> linjeskift og vognretur i et input?
>


Hvis du bruger nyere end PHP 5.2 - så er den nemmeste løsning nu
egentlig bare

if ( filter_var($email, FILTER_VALIDATE_EMAIL) ) {
// Send mail
} else {
// Email ikke korrekt
}

og med navn

$name = filter_var($name, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

og så kan du gøre det på alle felter på 1 gang
filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Lidt mere læsning omkring filter
http://www.php.net/manual/en/book.filter.php


Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407841
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste