WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Kolla om någon $_POST isset (https://www.wn.se/forum/showthread.php?t=1047931)

robincox 2011-04-29 19:18

Kolla om någon $_POST isset
 
Går det på något sätt att kolla om någon $_POST isset med php?

Då menar jag inte att kolla en specifik $_POST som t.ex. if (isset($_POST['submit'])) utan kolla om det finns någon $_POST över huvudtaget som är isset.

robincox 2011-04-29 20:33

Hittade svaret på ett annat forum, så tänkte dela med mig.

if ($_POST) kollar ifall någon $_POST över huvudtaget har skickats med sidan. Detta är skitbra då jag har samlat alla mina händelser som ska triggas i fall något formulär har postats till sidan i en inlänkad php fil.

Oh happy day!

Jonas 2011-05-03 02:37

Annars är det mer korrekt med:

PHP-kod:

<?php
function post($value) {
   if(isset(
$_POST[$value])) {
      return 
$_POST[$value];
   } else {
      return 
false;
   }
}
?>

Man bör göra liknande funktioner med $_GET, $_COOKIE, $_SERVER & $_SESSION.

fördelen är om man får bort repetetiv kod från sidorna.
Tex.
PHP-kod:

<?php
if( ($value post('namn')) === false) {
echo 
'Hej ' $value;
} else {
echo 
'Inget namn satt';
}
?>


pelmered 2011-05-03 03:20

Citat:

Ursprungligen postat av Jonas (Inlägg 20403980)
Annars är det mer korrekt med:

PHP-kod:

<?php
function post($value) {
   if(isset(
$_POST[$value])) {
      return 
$_POST[$value];
   } else {
      return 
false;
   }
}
?>

Man bör göra liknande funktioner med $_GET, $_COOKIE, $_SERVER & $_SESSION.

fördelen är om man får bort repetetiv kod från sidorna.
Tex.
PHP-kod:

<?php
if( ($value post('namn')) === false) {
echo 
'Hej ' $value;
} else {
echo 
'Inget namn satt';
}
?>


Förstår inte riktigt poängen med det där exemplet om jag ska vara ärlig.
Du gör ju samma kontroll i funktionen som du lika gärna skulle kunna göra direkt i koden. Det hade ju till och med blivit kortare om du skrev den direkt i koden såhär:
PHP-kod:

<?php
if(isset($_POST['namn'])) {
$value $_POST['namn'];
} else {
echo 
'Inget namn satt';
}

Det där ger exakt samma resultat som din lösning.
Massa specialfunktioner i onödan gör bara koden onödigt komplex.

emilv 2011-05-03 06:22

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20403981)
Massa specialfunktioner i onödan gör bara koden onödigt komplex.

Jonas själv har ett logiskt fel i exemplet.

RLM_JP 2011-05-03 08:57

Tack för tipset robincox! Brukar ganska ofta göra något när formulär postats, så nu slipper jag hålla koll på variabelnamn.

robincox 2011-05-03 10:54

Anledningen till att jag vill ha if ($_POST) och inte if ($_POST['something']) är att jag har en php sida som jag includar om någon $_POST finns över huvud taget. Finns det någon $_POST så kommer massor av if (isset($_POST['differentValues'])) att kollas. Jag sparar en massa laddningstid genom att hoppa över alla $_POST kollningar om det inte finns någon $_POST över huvud taget.

Althalos 2011-05-03 13:40

Citat:

Ursprungligen postat av robincox (Inlägg 20404004)
Anledningen till att jag vill ha if ($_POST) och inte if ($_POST['something']) är att jag har en php sida som jag includar om någon $_POST finns över huvud taget. Finns det någon $_POST så kommer massor av if (isset($_POST['differentValues'])) att kollas. Jag sparar en massa laddningstid genom att hoppa över alla $_POST kollningar om det inte finns någon $_POST över huvud taget.

Det verkligt rätta sättet är att enkapsulera $_POST i ett objekt och sedan ha en metod, så skriver man typ som såhär:
if($obj->isset()) include('file.php');

Och om man vill hämta ett värde så skriver man
$obj->post('key');

Motsvarande metoder ska också finnas för $_GET etc. Kolla hur ramverk såsom Codeigniter har implementerat detta.

Men vill man inte programmera objektorienterat så skulle jag föredra Jonas lösning under alla omständigheter. Jag vet inte hur din kod ser ut men jag antar att du ändå kollar vilka specifika värden som är tillagda, innan du försöker göra något med dessa. Så du borde väl egentligen göra det typ såhär:
if($obj->validate()) include('file.php');

validate antas här vara en funktion som validerar din formdata och laddar in filen bara om formulärdatan går att använda till någonting. Det vore en bra lösning. Kör man inte objektorienterat så skulle jag ha gjort likadant d.v.s. validerat först och sedan baserat på valideringen inkluderat filen. Inte kollat om någon data finns, ladda in filen och sedan låta den göra valideringen. Men jag hade inte programmerat på det här sättet överhuvudtaget så vad vet jag...

En sista sak bara. Det är inte den här typen av optimeringar som sparar "massa med laddningstid" så Don't Repeat Yourself-principen och god struktur trumfar att minska antalet operationer, i det här sammanhanget, varje gång. Enligt min åsikt.

Jake.Nu 2011-05-03 19:18

Varför inte bara kolla om _POST är tom?

PHP-kod:

if (!empty($_POST)) {
    echo 
"Något finns i _POST";



Althalos 2011-05-03 21:38

Citat:

Ursprungligen postat av Jake.Nu (Inlägg 20404088)
Varför inte bara kolla om _POST är tom?

PHP-kod:

if (!empty($_POST)) {
    echo 
"Något finns i _POST";



Eller if(!count($_POST)) eller if(!sizeof($_POST)) eller if(!end($_POST)) eller if(!next($_POST)) eller if(!current($_POST)) eller if(!count(array_keys($_POST)) eller if(array_reduce($_POST) != NULL)

etc.etc.etc. if($_POST) är fortfarande det kortaste alternativet.

Jake.Nu 2011-05-03 21:54

Citat:

Ursprungligen postat av Althalos (Inlägg 20404112)
Eller if(!count($_POST)) eller if(!sizeof($_POST)) eller if(!end($_POST)) eller if(!next($_POST)) eller if(!current($_POST)) eller if(!count(array_keys($_POST)) eller if(array_reduce($_POST) != NULL)

etc.etc.etc. if($_POST) är fortfarande det kortaste alternativet.

Nja, jag skulle inte ta för givet att $_POST alltid är en array, som du gör.

objx 2011-05-03 23:23

Det är ju bara om du själv lyckas skriva över $_POST med din egen kod som den inte är en array.
T.ex:
$_POST = null;

Jonas 2011-05-04 01:23

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20403981)
Förstår inte riktigt poängen med det där exemplet om jag ska vara ärlig.
Du gör ju samma kontroll i funktionen som du lika gärna skulle kunna göra direkt i koden. Det hade ju till och med blivit kortare om du skrev den direkt i koden såhär:
PHP-kod:

<?php
if(isset($_POST['namn'])) {
$value $_POST['namn'];
} else {
echo 
'Inget namn satt';
}

Det där ger exakt samma resultat som din lösning.
Massa specialfunktioner i onödan gör bara koden onödigt komplex.

Eftersom den kontrollen sker på mer än ett ställe (vilket är troligt) så platsar den i en funktion.
All logik som görs på mer än ett ställe skall vara i en funktion för att underlätta.

Citat:

Ursprungligen postat av emilv (Inlägg 20403982)
Jonas själv har ett logiskt fel i exemplet.

Eh, var när hur? Koden är dessutom skriven direkt från huvudet, och var tänkt som exempel.

Citat:

Ursprungligen postat av Althalos (Inlägg 20404112)
if($_POST) är fortfarande det kortaste alternativet.

Som kommer att producera en NOTICE om $_POST inte är satt.

emilv 2011-05-04 06:33

Citat:

Ursprungligen postat av Jonas (Inlägg 20404134)
Eh, var när hur?

Din jämförelse med false ska inverteras. Just nu säger du att om värdet inte är satt så ska du använda det.

Den logik du försöker låta bli att upprepa är rätt meningslös. Det blir ju lika mycket kod att skriva, bara att du skriver post() och skippar arrayens namn istället för isset(), och det är tveksamt om det kommer behöva göras ändringar i framtiden. Jag tycker det blir klarare att bara göra issetjämförelsen öppet istället för att lägga den i en funktion som potentiellt göra många fler saker.

Men samtidigt håller jag inte riktigt med i all kritik mot metoden. Om det fungerar för dig och dina projekt är det antagligen bra kod, och jag kan förstå att vissa inte vill skriva $_POST överallt. Och du har rätt i att vissa andra förslag ger notiser - syndigt värre!

coredev 2011-05-04 09:18

Om jag förstår dig rätt så vill du göra följande:

[pseudokod]
if(är_satt($_POST)) {
//validera under-element till POST:en här samt gå vidare med hanteringen av dessa
}
[/pseudokod]

Detta vill du göra för att helt enkelt slippa gå in och ladda din inlänkade fil om du inte kommer från rätt formulär / om något bara klickat på "submit" / annan mystisk anledning?

Jag tror nog att du bör kolla på att revidera din design istället för att bara hitta en lösning som fungerar. Ditt pattern verkar vara ganska sårbart mot förändringar.

pelmered 2011-05-04 17:30

Citat:

Ursprungligen postat av Jonas (Inlägg 20404134)
Eftersom den kontrollen sker på mer än ett ställe (vilket är troligt) så platsar den i en funktion.
All logik som görs på mer än ett ställe skall vara i en funktion för att underlätta.

Ja, absolut där håller jag med.
Men i det exemplet hjälper det dig ju inte alls eftersom du ändå tvingas göra i stort sett samma kontroll i koden ändå . Det gör ju att funktionen inte förenklar och gömmer undan kod vilket är hela anledningen till att man placerar sådan logik som används på flera ställen i en funktion.
Jämför:
Citat:

Ursprungligen postat av Jonas (Inlägg 20403980)
PHP-kod:

<?php
if( ($value post('namn')) === false) {
echo 
'Hej ' $value;
} else {
echo 
'Inget namn satt';
}
?>


med
PHP-kod:

<?php
if(isset($_POST['namn'])) {
echo 
'Hej ' $_POST['namn'];
} else {
echo 
'Inget namn satt';
}

Din funktion fyller ju ingen funktion då man kan göra exakt samma kontroll direkt i koden och den är dessutom både enklare och kräver ett mindre antal tecken. Det andra exemplet har ju även fördelen att alla vet exakt vad som händer där utan att veta vad funktionen "post" gör.

pelmered 2011-05-04 19:16

Citat:

Ursprungligen postat av Jake.Nu (Inlägg 20404115)
Nja, jag skulle inte ta för givet att $_POST alltid är en array, som du gör.

Är $_POST satt av servern är det en array, annars returnerar väl alla de där kontrollerna false, eller åtminstone något som evalueras till fasle i en if-sats. Har inte kolla på alla i huvudet dock så jag kan ha fel.

Althalos 2011-05-04 21:07

Citat:

Ursprungligen postat av Jonas (Inlägg 20404134)
Som kommer att producera en NOTICE om $_POST inte är satt.

Testa kör följande på din dator:
error_reporting(-1);
if(!$_POST) echo 'test';

Det genererar i alla fall ingen E_NOTICE i min logg. Dessutom så används överallt i manualen på php.net...

Citat:

Nja, jag skulle inte ta för givet att $_POST alltid är en array, som du gör.
$_POST är en s.k. "superglobal array" - man hänvisar till den på det sättet i manualen och det står tydligt att den endast definieras i form av en array.

Jake.Nu 2011-05-05 06:57

Citat:

Ursprungligen postat av Althalos (Inlägg 20404250)
Testa kör följande på din dator:
error_reporting(-1);
if(!$_POST) echo 'test';

Det genererar i alla fall ingen E_NOTICE i min logg. Dessutom så används överallt i manualen på php.net...



$_POST är en s.k. "superglobal array" - man hänvisar till den på det sättet i manualen och det står tydligt att den endast definieras i form av en array.

Ja den definieras som en array men det finns inget som hindrar att skriva över den med valfritt värde.

pelmered 2011-05-06 00:31

Citat:

Ursprungligen postat av Jake.Nu (Inlägg 20404287)
Ja den definieras som en array men det finns inget som hindrar att skriva över den med valfritt värde.

Finns ju ingen anledning att skiva över den. Om man skriver kod där det kan hända har man nog gjort något väldigt fel och då bör man nog tänka om lite i och för sig.

Jake.Nu 2011-05-06 07:02

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20404440)
Finns ju ingen anledning att skiva över den. Om man skriver kod där det kan hända har man nog gjort något väldigt fel och då bör man nog tänka om lite i och för sig.

Självfallet är det inte ett "normalt" förfarande.


Alla tider är GMT +2. Klockan är nu 13:09.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson