Sida 1 av 2

När körs PHP-kod i .php-fil blandad med html?

Postat: 5 september 2007, 15:38:19
av JimmyAndersson
En bättre rubrik hade blivit för lång. :)
Låt säga att jag har en .php-fil som är uppbyggd såhär:

Kod: Markera allt

<table><tr><td>
<form action="<?echo $_SERVER['PHP_SELF']?>" method="POST">
<input name="data" id="data" type="text" >
<input type="submit" name="submit" value="Ok">
</form>
</td></tr></table>

<?
$data = &_POST['data'];
osv
?>
Då körs php-koden först efter jag tryckt på Submit-knappen. Men jag förstår inte varför. :)
Hade jag bytt ut PHP-koden mot html-kod så hade ju de raderna körts.
Så hur fungerar det? :)

Jag är mest van vid html och perl så där är ju "server-koden" separerad från formuläret i html-filen.


Orsaken till att jag undrar är för att jag ska ha flera formulär (med varsin submit-knapp) och olika PHP-kodblock på en och samma .php-fil. Kommer inte riktigt på hur jag ska göra...


edit: Lade till textinmatningsfältet i koden.
Vilken enormt lång tid det tar att skicka detta inlägg......

Postat: 5 september 2007, 17:04:57
av sodjan
> Hade jag bytt ut PHP-koden mot html-kod så hade ju de raderna körts.

Inte koden efter "<form action..." väl !? De körs när man klickar på submit.
Men du menar att det skulle ha körst av PHP redan på servern innan
det skickas över till klienten ?

Jag tror att jag förstår vad du vill göra.
PHP ska dynamisk skapa dina formulär på servern innan de skickas
till klienten. Du kanske får skriva PHP kod som skapar hela <form .... </form> ?
Inte bara några delar inne i formuläret. !?

OK, lite ute på hal is här, men ändå... :-)

Postat: 5 september 2007, 19:18:07
av ragnwald
Anledningen är att $_POST['nånting'] har ett värde först efter du submittar formuläret till filen själv, om du förstår vad jag menar.

Formulärinfon lagras i $_POST-variabler och finns inga såna satta så kan ju inte koden utföra så mycket.

Postat: 5 september 2007, 21:25:05
av JimmyAndersson
Alla inlägg är bra inlägg, trots att det inte riktigt var detta jag undrade över. :)

sodjan:

>> Hade jag bytt ut PHP-koden mot html-kod så hade ju de raderna körts.

> Inte koden efter "<form action..." väl !? De körs när man klickar på submit.
> Men du menar att det skulle ha körst av PHP redan på servern innan
> det skickas över till klienten ?

Det jag menade var ifall php-koden var utbytt mot html-kod, t.ex såhär:

Kod: Markera allt

<table><tr><td> 
<form action="<?echo $_SERVER['PHP_SELF']?>" method="POST"> 
<input name="data" id="data" type="text" > 
<input type="submit" name="submit" value="Ok"> 
</form> 
</td></tr></table> 

<center>lite text</center>
<a href="www.test.se">Länk</a>
Då hade ju "lite text" och länken visats innan jag tryckt på submit-knappen.
Om dessa rader istället är php-kod (som i mitt förra kodexempel) så hade inte php-koden körts förrän jag tryckt submit-knappen. Det jag undrade över var: varför? :)

Nu råkar ju den första raden av php-koden bestå av kod som tar emot det som postades i formuläret, men hur mycket kod hade körts om php-delen hade sett ut såhär:

Kod: Markera allt

Först html-delen med formuläret, sedan:
<?
echo "Tryck på knappen";  <--- Den hade väl körts innan man trycker submit?
$data = &_POST['data'];   <---- och den körs efter man tryckt?
echo "Tack.";               <--- samma med den.
?>
<center>lite text</center>     <------ Den visas innan submit?
<a href="www.test.se">Länk</a>   <------ och den här?
<?
$abc = $123;               <----- Men när körs den?
?>

Många frågor men jag försöker bara förstå från grunden. :)
Jag vill som sagt ha flera formulär med varsin submit-knapp på samma sida (dvs samma .php-fil). Sedan ska några kodblock med php-kod ta hand om det som matas in i varje formulär-block. Såhär:

Kod: Markera allt

Ta bort användare:           .     Editera användare:
 ________________     __     .    _________________      __
|________________|   |OK|    .   |_________________|    |OK|
                      ""     .                           ""
      ^                      .           ^
      |                      .           |
      |                      .           |
  ett php-block              .   ett annat php-block
  tar emot vad som           .   tar emot detta.
  skrivs och tar             .   
  bort den användaren        .
...........................................................

Jag tror att jag förstår vad du vill göra.
PHP ska dynamisk skapa dina formulär på servern innan de skickas
till klienten. Du kanske får skriva PHP kod som skapar hela <form .... </form> ?
Inte bara några delar inne i formuläret. !?


Även om du missförstod min fråga så var det en bra idé och svaret på en fråga jag inte hunnit skriva än. :D

Postat: 5 september 2007, 22:03:00
av backen
Alla rader körs ju även första gången men &_POST['data']; är ju ingenting eftersom ingenting har skickats med POST. När filen körs efter att du tryckt på submit skickas ju även POST variablerna med.

Vill du ha flera formulär och köra olika kod beroende på vilket formular som skickats så kan du tex lägga till ett dolt formularfält med info om vilket formular som skickats.

Kod: Markera allt

<input type="hidden" name="formular" value="form1" />
eller

Kod: Markera allt

<input type="hidden" name="formular" value="form2" />
och sedan köra olika kod beroende på innehållet i &_POST['formular'];

Postat: 5 september 2007, 22:55:20
av sodjan
OK, då är jag med.
Du kör samma html/php fil både vid första visningen och som
"target" för submit-knappen. Ja, då måste man ju hålla reda på
om den anropas från servern som ett resultat av första-visningen
eller som ett anrop från ett av formulären. Och självklart finns inte
variabler som skapas vid en POST i det första fallet.

Jag tror att *all* PHP kod körs (eller försöker köras), men vad hände
med den kod som försöker använda &_POST[...] ? Det beror väl på hur
felhanteringen i PHP fungerar, och det vet jag inte.

Postat: 5 september 2007, 22:57:56
av JimmyAndersson
backen:
Den lösningen kommer göra hela koden väldigt smidig. :)
Mycket bra idé! :tumupp:


"Alla rader körs ju även första gången men &_POST['data']; är ju ingenting eftersom ingenting har skickats med POST. När filen körs efter att du tryckt på submit skickas ju även POST variablerna med."

Aha, då har jag lite mer grepp om hur det fungerar.

edit: oj, såg att Sodjan hann före. Måste läsa.

edit; sodjan:
aha, då förstår jag. :)
Det är så mycket lättare att programmera när man förstår hur det fungerar. :D

Postat: 5 september 2007, 23:05:24
av Micke_s
På lyset har också andra vettiga tips att ge
http://www.onlamp.com/pub/a/php/2004/08 ... dling.html

Postat: 5 september 2007, 23:22:03
av JimmyAndersson
På lyset? Bild

Bra sida! Hittade flera bra lösningar där. :)



Off-topic:
"by David Sklar"
Undrar om han är släkt med den lysande basisten Leland Sklar. :)

Postat: 5 september 2007, 23:26:46
av sodjan
Jo, det blir inte enklare av att samma html/php fil kan anropas
på olika sätt. :-)

En metod för att hålla det lite "renare" (ifall det fungerar för övrigt)
är naturligtsvis att separera filerna, d.v.s en html/php fil som
lägger upp den första sidan och andra filer som sedan anropas
av formulären. Det blir lite jobbigare att få tillbaka samma sida, det
brukar bli en "kvittens" sida varifrån man sedan får "gå tillbaka" till
grundsidan igen.

Med en enda html/php så blir det lite snyggare för användaren, men,
som sagt, det blir lite mer att hålla reda på i koden. En annan metod
(som jag tror nämndes) är "hidden" fält i formulären, då får man även
en enkel metod för att se vilken av submit-knapparna som användes.
Man kan även enkelt ha flera submit knappar i samma formulär och
låta det hela gå via lite javascript som (beroende på vilken knapp som
klickades) fyller i lämpliga form-variabler innan form-action anropas...

Postat: 6 september 2007, 10:40:52
av cykze
Man behöver inte ens något hidden-fält. Det räcker med att kolla om knappens "name"-värde är satt.

if (isset($_POST['submit_button_1']))
{
...
}
else if (isset($_POST['submit_button_2']))
{
...
}

Postat: 6 september 2007, 14:46:15
av tgr
och självklart så kör man alla sina $_POST och $_GET igenom en regexp check eller motsvarande innan man gör något alls med dom. så slipper man andra som kör kod på ens server...

Postat: 6 september 2007, 15:02:25
av sodjan
Hm, jag kan inte förstå hur servern kan tillåta att *data* kan "köras".
Om inte servern har brister i skyddet mellan exekverbar (read only)
och data (read/write) minnessegment...

Postat: 6 september 2007, 15:13:42
av speakman
sodjan: Jag tror du missuppfattat något...

Postat: 6 september 2007, 15:17:47
av JimmyAndersson
tgr:
Räcker det om man då kollar så att vissa tecken (och ord) inte tillåts?

Helst bör man ju undvika $__POST när det gäller lösenord och sådant, men i det här fallet är det bara jag som kan komma åt sidan och de inblandade datorerna, så det borde inte vara någon fara.

Jag ska fixa en tråd lite senare om just säkerhet på servrar. :)


edit: Såg att sodjan frågade samma sak som jag funderade på, så någon får gärna förklara hur någon annan kan köra egen kod på t.ex min server.