[php] sessie wordt niet onthouden na foute invoer form

Pagina: 1
Acties:
  • 188 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • eatualive
  • Registratie: Juni 2005
  • Laatst online: 27-07-2024
ik heb een form pagina en als ik het allemaal goed heb begrepen moet elke pagina met session_start() beginnen.

Dan komt mijn script:

PHP:
1
2
3
4
5
$_SESSION['id2'] = $_POST['id2'];
  
  $query2 = "SELECT * FROM kabels WHERE id='".$_SESSION['id2']."' ";
  $result2 = mysql_query($query2)or die("Fout in query2: $query2".mysql_error());
  $data2 = mysql_fetch_array($result2);


Hier sla ik de geposte id van een form van een andere pagina op in de session.
Dan laat ik de query uitvoeren en dit doet hij goed.

Nou komt er een form en als je 2 velden niet invuld zijn krijg je een fout en wordt je terug gestuurt naar deze pagina. Nu zou hij toch die session nog in zijn geheugen moeten hebben zitten zodat hij weer de goede gegevens in het form zet? maar bij mijn gebeurd er dat hij in het form allemaal lege velden laat zien.

Hier onder mijn form script maar ik den kdat daar het probleem niet zit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
echo "<table width=467 border=0>";
echo "  <tr>";
echo "    <td width=88 align=right valign=middle><span class=style2>Omschrijving</span>:</td>";
echo "    <td colspan=3>";
echo "<INPUT NAME=omschrijving id=omschrijving size=60 maxlength=60 value='".$data2['omschrijving']."'></td>";
echo "  </tr>";
echo "  <tr>";
echo "    <td align=right valign=middle><span class=style2><span class=style2>Merk</span>:</td>";
echo "    <td width=231><input name=merknaam id=merknaam value='".$data2['merk']."' readonly=1 >    </td>";
echo "    <td width=97><div align=right><span class=style2>Kabel nr.</span>:</div></td>";
?>   <td width=33><INPUT  NAME="kabel_nr" id="kabel_nr" size="5" maxlength="4"  " value="<?php echo $data2['kabel_nr'] ?>" >  </td>
<?
echo "  </tr>";
echo "  <tr>";
echo "    <td align=right valign=middle><span class=style2>Opmerking:</span></td>";
echo "    <td colspan=2><INPUT NAME=opmerking is=opmerking size=30 maxlength=30 value='".$data2['opmerking']."'></td>";
?> <input name="sort" id="sort" type="hidden" value="" > 
   <input name="editid" id="editid" type="hidden" value="<?php echo $_SESSION['id2'] ?>">
<td><input name=submit type=submit onClick="doe();" class=style2 VALUE=EDIT></td> <?
echo "  </form>";
echo "  </tr>";
echo "</table>";
echo "<table width=467 border=0>";
echo "  <tr>";
echo "    <td width=81><div align=left class=style1></div></td>";
echo "    <td width=376><span class=style1>* Opmerking hoeft niet perse ingevuld worden </span></td>";
echo "  </tr>";
echo "</table>";
 }
 
else 
 { 
 $omschrijving = empty($_POST['omschrijving']) ? die ("<CENTER>U hebt geen omschrijving ingevuld!<BR><META HTTP-EQUIV=Refresh CONTENT=2; URL=javascript:history.back()></CENTER>") : mysql_escape_string($_POST['omschrijving']);
 $bericht = empty($_POST['kabel_nr']) ? die ("<CENTER>U hebt geen kabel nr ingevuld!<BR><META HTTP-EQUIV=Refresh CONTENT=2; URL=edit.php?editid=$editid></CENTER>") : mysql_escape_string($_POST['kabel_nr']); 



 $query3 = "UPDATE kabels SET omschrijving='".$_POST['omschrijving']."', merk='".$_POST['merknaam']."', kabel_nr='".$_POST['kabel_nr']."', opmerking='".$_POST['opmerking']."', sort='".$_POST['sort']."' WHERE ID='".$_POST['editid']."'"; 
 $result3 = mysql_query($query3) or die ("Fout in query: $query3. ".mysql_error()); 
 echo "<CENTER><B>Kabel succesvol aangepast!</B></CENTER>"; 
 
header('Location: http://localhost/nl/bewerken.php');

 } 


?> 

[ Voor 48% gewijzigd door eatualive op 27-04-2006 10:57 ]


Acties:
  • 0 Henk 'm!

  • Atari Paul
  • Registratie: November 2002
  • Laatst online: 08:32
Heb je al ter test een print_r($_SESSION) gedaan, om te zien of de sessie helemaal leeg is ?

Stability ?? My Atari still has it :)


Acties:
  • 0 Henk 'm!

Verwijderd

Waar sla je de ingevulde waarden op in een sessievariabele dan :?
Laat maar :)

[ Voor 14% gewijzigd door Verwijderd op 27-04-2006 11:26 ]


Acties:
  • 0 Henk 'm!

  • eatualive
  • Registratie: Juni 2005
  • Laatst online: 27-07-2024
Als ik dit doe zie ik dat de fuctie gevuld is totdat ik post en dan is hij de sessie kwijt en heeft hij geen waarde.

Acties:
  • 0 Henk 'm!

  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 16-08 16:35
wordt de sessie wel geregistered op elke pagina / via elke mogelijk pad?

Acties:
  • 0 Henk 'm!

  • Atari Paul
  • Registratie: November 2002
  • Laatst online: 08:32
Ok, hoe ga je dan terug naar de vorige pagina (waar de foute waarden waren ingevuld) ?

Stability ?? My Atari still has it :)


Acties:
  • 0 Henk 'm!

  • eatualive
  • Registratie: Juni 2005
  • Laatst online: 27-07-2024
Atari Paul schreef op donderdag 27 april 2006 @ 11:28:
Ok, hoe ga je dan terug naar de vorige pagina (waar de foute waarden waren ingevuld) ?
PHP:
1
2
$omschrijving = empty($_POST['omschrijving']) ? die ("<CENTER>U hebt geen omschrijving ingevuld!<BR><META HTTP-EQUIV=Refresh CONTENT=2; URL=javascript:history.back()></CENTER>") : mysql_escape_string($_POST['omschrijving']); 
 $bericht = empty($_POST['kabel_nr']) ? die ("<CENTER>U hebt geen kabel nr ingevuld!<BR><META HTTP-EQUIV=Refresh CONTENT=2; URL=edit.php?editid=$editid></CENTER>") : mysql_escape_string($_POST['kabel_nr']);


Hoezo registered?

[ Voor 13% gewijzigd door eatualive op 27-04-2006 11:31 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Even terzijde:
• je doet iets met header() na output
• ipv 10x echo onder elkaar kan je ook een string over meerdere regels laten lopen of uit php mode stappen. Je code is sowieso zeer slecht leesbaar.
• bij het stuk van query 3 gebruik je wel mysql_real_escape_string, maar volgens zet je de oorspronkelijk POST-waarde net zo hard in de query.
• Category is waarschijnlijk een betere naam dan Sort. Sort is een beetje ambigue.

[ Voor 18% gewijzigd door Voutloos op 27-04-2006 11:35 ]

{signature}


Acties:
  • 0 Henk 'm!

  • eatualive
  • Registratie: Juni 2005
  • Laatst online: 27-07-2024
Voutloos schreef op donderdag 27 april 2006 @ 11:32:
Even terzijde:
• je doet iets met header() na output
• ipv 10x echo onder elkaar kan je ook een string over meerdere regels laten lopen of uit php mode stappen. Je code is sowieso zeer slecht leesbaar.
• bij het stuk van query 3 gebruik je wel mysql_real_escape_string, maar volgens zet je de oorspronkelijk POST-waarde net zo hard in de query.
die header is voor als alles wel goed is dan wordt de database geupdate en daarna doorgestuurt naar die pagina via de header.

Ja zag gisteren ook dat het makkelijk kon met die echo maar ben nu te lui om te veranderen

Met die derde bebrijp ik niet waar je op doelt.
Maar als er iets niet is ingevuld dan wordt die query neit uitgevoerd.

[ Voor 6% gewijzigd door eatualive op 27-04-2006 11:37 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
eatualive schreef op donderdag 27 april 2006 @ 11:35:
Met die derde bebrijp ik niet waar je op doelt.
Je set $bericht en $omschrijving en gebruikt die vervolgens niet. Overigens moet je ook de overige user input checken. :Y)

{signature}


Acties:
  • 0 Henk 'm!

  • eatualive
  • Registratie: Juni 2005
  • Laatst online: 27-07-2024
Nee allen die 2 moeten ingevuld worden de rest is optioneel.

Acties:
  • 0 Henk 'm!

  • dennis112
  • Registratie: Oktober 2003
  • Laatst online: 11-09 00:25
Sorry hoor, maar ik snap het niet zo hoe je het nu gemaakt hebt.

Je hebt het in je script over $data2. Wat staat er in $data2 want dat kan ik uit je script niet opmaken. Verder zeg je $_SESSION['id2'] = $_POST['id2']; maar waar haal je die id2 vandaan want die kan ik ook nergens anders terugvinden.

Ik heb het namelijk zo gedaan aan bij mij werkt het perfect.

<?php
session_start();
if(isset($_SESSION['admin'])){
include "contactdb.php";
include "style.txt";
if (isset($_GET['actie'])&& $_GET['actie']== 'versturen'){
$_SESSION['actienaam']=$_POST['actienaam'];
$_SESSION['actieplaatje']=$_POST['actieplaatje'];
$_SESSION['actielink']=$_POST['actielink'];
$_SESSION['geldigheid']=$_POST['geldigheid'];
$_SESSION['actieomschrijving']=$_POST['actieomschrijving'];
if (empty($_POST['actienaam'])) {
echo "Je hebt geen actienaam ingevuld, <a href=\"actie_toevoegen.php\">Probeer nogmaals</a>.";
} else if (empty($_POST['actieplaatje'])) {
echo "Je hebt geen link naar de teaser gegeven, <a href=\"actie_toevoegen.php\">Probeer nogmaals</a>.";
} else if (empty($_POST['actielink'])) {
echo "Je hebt geen link naar de hoofdpagina van de actie gegeven, <a href=\"actie_toevoegen.php\">Probeer nogmaals</a>.";
} else if (empty($_POST['geldigheid'])) {
echo "Je hebt geen duur van de actie aangegeven, <a href=\"actie_toevoegen.php\">Probeer nogmaals</a>.";
} else if (empty($_POST['actieomschrijving'])) {
echo "Je hebt geen omschrijving van de actie gegeven, <a href=\"actie_toevoegen.php\">Probeer nogmaals</a>.";
} else {
$registreer = "INSERT INTO acties (actienaam, actieomschrijving, actieplaatje, actielink, geldigheid) VALUES ('".$_POST['actienaam']."', '".$_POST['actieomschrijving']."', '".$_POST['actieplaatje']."', '".$_POST['actielink']."', '".$_POST['geldigheid']."')";
mysql_query($registreer) or die(mysql_error());
session_unregister('actienaam');
session_unregister('actieplaatje');
session_unregister('actielink');
session_unregister('geldigheid');
session_unregister('actieomschrijving');
?>
<META http-equiv="refresh" content="2; url=admin.php">
<?php
echo "De actie is toegevoegd aan de website!";
}}} else {
?>
<script language="JavaScript">
window.location="admin.php";
</script>
<?php
}

?>

Hier zie je dat ik elk veld van mij formulier in een andere sessie opsla, en als er iets fout is dan kun je teruggaan door op een link te klikken. Javascript:history.back werkte bij mij ook niet.

Asus P6T Deluxe, Intel Core i7 920, 6Gb 1333Mhz DDR3, 2 x Sapphire HD5830 in Crossfire


Acties:
  • 0 Henk 'm!

  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 16-08 16:35
session_start();

Acties:
  • 0 Henk 'm!

Verwijderd

In zijn startpost meldde hij toch echt dat hij dat wel weet...

Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

Ik heb even een snel voorbeeldje gemaakt die ongeveer dat doet wat je wilt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
//test3.php
session_start();
print_r($_SESSION);
if (isset($_SESSION['id2'])) {
        $id2 = $_SESSION['id2'];
}
else {
        $id2="";
}

if (isset($_SESSION['blaat'])) {
        $blaat = $_SESSION['blaat'];
}
else {
        $blaat = "";
}

?>

<form action="test4.php" method="post">
<input type="text" name="id2" value="<?php echo $id2; ?>"><br />
<input type="text" name="blaat" value="<?php echo $blaat; ?>"><br />
<input type="submit" value="submit">
</form>


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//test4.php
session_start();

print_r($_POST);//debugcode

// Niet belangrijk, maar wel fijn om te onthouden
if (!empty($_POST['blaat'])) {
        $_SESSION['blaat'] = $_POST['blaat'];
}
// wel belangrijk maar ook onthouden..
if(!empty($_POST['id2'])) {
        $_SESSION['id2'] = $_POST['id2'];
}
else {
        $_SESSION['id2'] = "";
        ?>You did not enter an id2. <a href="test3.php"> go back and try again</a><?php
}
?>

Acties:
  • 0 Henk 'm!

  • HansMij
  • Registratie: Mei 2002
  • Laatst online: 22:01
Op regel 1 doe je:
PHP:
1
$_SESSION['id2'] = $_POST['id2'];


Vervolgens doe je een update (de variabelen zijn hier denk ik nog bekend, en daarna krijg je een form (volgens je verhaal iig). Als in dat form iets niet goed is, dan wordt je teruggestuurd, ik neem aan naar dezelfde pagina als waarvan ik zojuist de code gekopieerd heb. Ik vermoed dat je vervolgens alleen doorstuurt naar het juiste php-bestand, en vervolgens niet de post-variabelen zet.

Vervolgens wordt deze regel nogmaals uitgevoerd.
PHP:
1
$_SESSION['id2'] = $_POST['id2'];


De postvariabele is niet gezet, en dus wordt je $_SESSION['id2'] geleegd.

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 10-09 12:28
Trouwens, hou bij deze opzet ook nog even rekening met XSS en SQL-injection.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
eatualive schreef op donderdag 27 april 2006 @ 11:40:
Nee allen die 2 moeten ingevuld worden de rest is optioneel.
Dan moet je je meer verdiepen in programmeren. Want je doet daar meer dan alleen een die(). Als die 2 vars gevuld zijn vang je de waarde van real_escape_string() op. En daar is niets mis mee, het is zelfs aan te bevelen, maar gebruiken het dan ook. Dit ivm onder andere XSS en SQL-Injection (zoals Tron hierboven noemt), 2 vormen van misbruik die kunnen optreden als je onnauwkeurig met user input omgaat.

{signature}

Pagina: 1