PHP probleem?

Zijn er hier mensen die goed met PHP overweg kunnen?

Sinds een week hebben wij onze site verhuisd naar een nieuwe webserver die PHP 4.3.6 draait. Alles is erg vlot gegaan behalve een paar PHP scripts waarvan een aantal functies het plots niet meer deden. Ik denk dat het een probleem is met het POST-en van variabelen binnen PHP.

Het zit zo, ik heb een input veld dat voor een paswoord. Als ik op de submit knop durk krijg ik de melding dat de variabele, het input field dus, leeg is. Volgens mij moet ik ergens in de code invoegen dat het ge-POST moet worden ($_POST[“pasw”]), maar ik kom er niet uit hoe.

Hier kan je een file downloaden die wel werkte onder PHP 4.3.4 maar niet meer onder PHP 4.3.6.

Je leest de get action niet uit in je link, wat je met een $_GET["action"] moet doen voor de case statement.

Wat je beter kan doen in is je form een hidden input mee te nemen waarin je de actie meegeeft: Zet tussen <form> en </form>:

[code:1:fbbebe523f]
<input type="hidden" name="action" value="paswcheck" />[/code:1:fbbebe523f]

Bovenaan je php doen je dan:

[code:1:fbbebe523f]$actiontype = $_POST["paswcheck"];[/code:1:fbbebe523f]
en dan in plaat van de case statements:

[code:1:fbbebe523f]if ($actiontype == "paswcheck") {
(de code voor het controleren van het wachtwoord)
}
else {
(de code die je wilt uitvoeren als er een andere actie is of de verkeerde actie)
}[/code:1:fbbebe523f]

Hmm, heb het zo geprobeerd, maar kom er niet uit wat ik fout doe...

[code:1:b2941c2407]<?
$actiontype = $_POST["paswcheck"];

switch($action) {
default:
echo “<html>
<head>
<title>login</title>
</head>
<body>
<div align=‘center’>
<p><font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>typ hier het
paswoord:</font></p>
<form name=‘form1’ method=‘POST’ action=’$PHP_SELF?action=paswcheck’>
<input type=‘hidden’ name=‘action’ value=‘paswcheck’ />
<p> <font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<input name=‘pasw’ type=‘password’ id=‘pasw’>
</font></p>
<p> <font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<input name=‘verzend’ type=‘submit’ id=‘verzend’ value=‘verzend’>
</font></p>
</form>
</div>
</body>
</html>”;
break;

case “paswcheck”;
if ($actiontype == “paswcheck”) {
echo “<html>
<head>
<title>error</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
Login was succesvol<br><br>
<strong><a href=’$PHP_SELF?action=hoofdmenu’>klik hier om verder te gaan.</a></strong>
</font>
</div>
</body>
</html>”;
} else {
die("
<html>
<head>
<title>error</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<strong>Uw paswoord is verkeerd ingegeven…<br><br>
<a href=‘index.php’>probeer opnieuw</a></strong>
</font>
</div>
</body>
</html>
");
}
break;

case "hoofdmenu";
echo "logged on";

}
?>[/code:1:b2941c2407]

Je moet of de 'switch' statement gebruiken, of de 'if', maar dit gaat inderdaad niet werken.

switch moet je gebruiken op ‘$actiontype’ en niet op ‘$action’, want je leest ‘$action’ nog steeds niet uit met een $_GET.

Dit zou moeten werken:

[code:1:382d3ad14e]
<?php
$pass="test";
$action = $_POST["action"];

switch($action) {
default:
echo “<html>
<head>
<title>login</title>
</head>
<body>
<div align=‘center’>
<p><font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>typ hier het
paswoord:</font></p>
<form name=‘form1’ method=‘POST’ action=’$PHP_SELF’>
<input type=“hidden” name=“action” value=“paswcheck” />
<p> <font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<input name=‘pasw’ type=‘password’ id=‘pasw’>
</font></p>
<p> <font size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<input name=‘verzend’ type=‘submit’ id=‘verzend’ value=‘verzend’>
</font></p>
</form>
</div>
</body>
</html>”;
break;

case “paswcheck”;
$paswoord=$_POST[“pasw”];
if($paswoord == $pass) {
echo “<html>
<head>
<title>error</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
Login was succesvol<br><br>
<strong><a href=’$PHP_SELF?action=hoofdmenu’>klik hier om verder te gaan.</a></strong>
</font>
</div>
</body>
</html>”;
} else {
die("
<html>
<head>
<title>error</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<strong>Uw paswoord is verkeerd ingegeven…<br><br>
<a href=‘index.php’>probeer opnieuw</a></strong>
</font>
</div>
</body>
</html>
");
}
break;

case "hoofdmenu";
echo "logged on";

}
?>[/code:1:382d3ad14e]

ps: de link ‘ga door naar hoofdmenu’ werkt zo niet; je moet alles wat je meestuur in een URL ook uitlezen, dus:

[code:1:382d3ad14e]<a href="index.php?var=blah">[/code:1:382d3ad14e]
uitlezen in je php met:

[code:1:382d3ad14e] $variabele = $_GET["var"][/code:1:382d3ad14e]

Inderdaad, nu werkt die terug. Ik begrijp nu het systeem van die hidden field. Nu heb ik alleen hetzelfde probleem met m'n upload script. Ik heb het op dezelfde manier proberen op te lossen, maar het wil toch niet lukken.

Als ik een file selecteer en ik druk dan op “uploaden”, dan zegt ie dat er geen file geselecteerd is. In het form van de filebrowser heb ik ook zo’n hidden field gezet met de actie naar “doupload”, en in het “doupload” gedeelte zit ook de $file = $_POST[“file”];

[code:1:dd61dbf8b9]$action = $_POST["action"];
$extlimit = "yes"; //beperking op de file extentie
$limitedext = array(".jpg",".jpeg",".JPG",".JPEG"); //gewenste uploadbare extenties
$sizelimit = "no"; //limiet op de omvang van de file?
$sizebytes = "200000"; //grootte limiet in bytes
$absolute_path = "ff weg gelaten…" //absolute path van de upload folder

//verboden

switch($action) {
default:
echo"
<html>
<head>
<title>toegang niet toegestaan</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<strong>
<p>&nbsp;</p>
<p>&nbsp;</p>
Deze pagina is beveiligd en enkel toegankelijk vanuit de admin panel.
</strong>
</font>
</div>
</body>
</html>";
break;

//uploaden

case “upload”:
echo"
<html>
<head>
<title>afbeelding uploaden</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<strong>
<form method=‘POST’ action=’$PHP_SELF’>
<input type=‘hidden’ name=‘action’ value=‘doupload’>
<p>bestand:<br>
<p>&nbsp;</p>
<input type=‘file’ name=‘file’ id=‘file’ size=‘30’><input type=‘submit’ name=‘submit’ value=‘uploaden’>
</form>
</strong>
</font>
</div>
</body>
</html>";
break;

//pre-upload check

case "doupload":
$file = $_POST["file"];
$dir = "dir";
if ($file != "") {

if (file_exists("$absolute_path/$file_name")) {
die("
<html>
<head>
<title>error</title>
</head>
<body text=’#333333’ link=’#ff0066’ vlink=’#ff0066’ alink=’#ff0066’>
<div align=‘center’>
<font color=’#333333’ size=‘1’ face=‘Verdana, Arial, Helvetica, sans-serif’>
<strong>dit bestand is al aanwezig op de server!
<p>&nbsp;</p>
<form method=‘POST’ action=’$PHP_SELF’>
<input type=‘hidden’ name=‘action’ value=‘upload’>
<input type=‘submit’ name=‘submit’ value=‘ga door’>
</form>
</strong>
</font>
</div>
</body>
</html>
“);
}
//error - te groot
if (($sizelimit == “yes”) && ($file_size > $sizebytes)) {
die(”
<html>
<head>
<title>error</title>…
… enzovoort…
[/code:1:dd61dbf8b9]

Misschien dat dit een probleem is sinds de update: [quote:5ebde8d652]Files will by default be stored in the server's default temporary directory, unless another location has been given with the upload_tmp_dir directive in php.ini. The server's default directory can be changed by setting the environment variable TMPDIR in the environment in which PHP runs. Setting it using putenv() from within a PHP script will not work. This environment variable can also be used to make sure that other operations are working on uploaded files, as well.[/quote:5ebde8d652]

Zie: http://nl3.php.net/features.file-upload

Ja inderdaad. Ik begrijp er niet veel van, dus ik ga maar op zoek naar een script dat gebruik maakt van deze nieuwe functies.

Bedankt voor de uitleg en hulp!

Ik heb PHP dus NIET opgewaardeerd, maar krijg op mijn Mac ook geen invulling aan mijn variabelen. Een formulier met inputveld geeft de variabelen gewoon niet door. Bij controle door simpelweg een echo van $submit geeft aan dat de variabele $submit leeg is.

Via mijn ‘normale’ webserver (zelfde versie PHP, maar Linux), werkt het wel gewoon.

Bovenstaande probleem op een iMac met 10.3.5 en op een G4 QuickSilver met 10.3.5 exact hetzelfde.

Zal hier een voorbeeld onder plaatsen:

[quote:85b5ac6815]<span class=“koptekst”>Contact…</span><br />
<form id=“contact” action=“verzendmail.php” method=“get” name=“contact”>
<table width=“180” border=“0” cellspacing=“0” cellpadding=“0”>
<tr height=“24”>
<td width=“125” height=“24”>Naam:</td>
<td height=“24”><input type=“text” name=“naam” size=“40”></td>
<td height=“24”></td>
</tr>
<tr height=“24”>
<td width=“125” height=“24”>E-mail:</td>
<td height=“24”><input type=“text” name=“email” size=“40”></td>
<td height=“24”></td>
</tr>
<tr>
<td valign=“top” width=“125”>Opmerkingen:</td>
<td><textarea name=“opmerking” rows=“4” cols=“40”></textarea></td>
<td></td>
</tr>
<tr>
<td valign=“top” width=“125”></td>
<td><input type=“submit” name=“submit” value=“Verzenden”></td>
<td></td>
</tr>
</table>
<input type=“hidden” name=“verzenden” value=“verzenden”>
<input type=“hidden” name=“recipient” value=“email@adreskomthier.nl”>
</form>
[/quote:85b5ac6815]
En hier volgt het actiescript

[quote:85b5ac6815]<?php

if($verzenden) {

$recipient = “email@adreskomthier.nl”;
$subject = “Aanvraag via website”;
$header = "From: ".$email.“n”;
$mail_body = “Het contactformulier werd op “.date(“d-m-Y”).” om “.date(“H:i”).” uur ingevuld.n”;
$mail_body .= “De volgende gegevens werden ingevoerd:nn”;
$mail_body .= "Naam: ".$naam.“n”;
$mail_body .= "Email: ".$email.“n”;
$mail_body .= “Opmerking:n”;
$mail_body .= $opmerking.“nn ------- einde van automatisch gegenereerde bericht -------”;

mail($recipient, $subject, $mail_body, $header);

// Formulier uitgevoerd: melding weergeven
$melding= “Hartelijk dank voor uw reactie.<br />Wij zullen uw aanvraag zo spoedig mogelijk verwerken!”;

}else{

$melding1 = “Er is iets fout gegaan tijdens het verwerken van uw aanvraag. U kunt <a href=index.php>hier klikken</a> om het nogmaals te proberen.”;
$melding2 = “<br /><br />”;
$melding3 = “Er zijn de volgende gegevens ingevuld:<br />”;
$melding4 = “Naam: “.$naam.”<br />”;
$melding5 = “E-mail: “.$email.”<br />”;
$melding6 = “Bericht: “.$opmerking.”<br />”;
$melding7 = $mail_body;

echo $melding1.$melding2.$melding3.$melding4.$melding5.$melding6.$melding7;
}

echo $melding;
?>[/quote:85b5ac6815]
Bovenstaande lijkt wat omslachtig, maar heb inmiddels allerlei mogelijkheden geprobeerd om de variabelen uit te lezen.

Zie ik iets over het hoofd??

Hi,

Kijk in je php ini eens naar register globals.
Staan deze aan of uit?

Verder is het van belang om gewoon $_GET[‘variabel’] te gebruiken voor alles wat via de adresbalk binnenkomt en $_POST[‘variabel’] te gebruiken voor alles wat via een formulier met method=‘post’ wordt verzonden.

Misschien werkt het in je huidige PHP versie nog wel, maar dat gaat er allemaal uit.
In ieder geval zou het zonder $_POST & $_GET moeten werken wanneer je in je php.ini bestand register_globals op ‘On’ zet. Hierdoor wordt je php script echter wel een stuk onveiliger, vandaar dat ie standaard ook op ‘Off’ staat.

@wout: bestanden roep je aan met HTTP_POST_FILES[‘fieldname’]. In je formulier moet je dan hebben staan:

[code:1:ba6ce181d3]
<form name=“index” id=“index” action=“index.php” enctype=“multipart/form-data”>
[/code:1:ba6ce181d3]
Het gaat dan specifiek om het “enctype” gebeuren…

Succes!

Mmmmm... Heb ook geprobeerd met de $_POST variabelen, lukte ook niet. Hieronder een voorbeeld van een testscript (vanuit een formulier weergeven van de variabelen). [quote:b3af8630ca] <?php $recipient=$_POST["recipient"]; $verzenden=$_POST["verzenden"]; $checkout=$_POST["checkout"]; $submit=$_POST["submit"];

$melding = “<h3>Hier de gegevens welke zijn doorgegeven: <br /><br /></h3>”;

echo $melding;
echo “recipient: “.$recipient.”<br />”;
echo “verzenden: “.$verzenden.”<br />”;
echo “checkout: “.$checkout.”<br />”;
echo “submit: “.$submit.”<br />”;
?>
[/quote:b3af8630ca]
Ik kan hier niets aan vinden waarom het niet zou werken, maar nogmaals; misschien zie ik iets over het hoofd?

Correctie: Heb zo zitten klungelen en proberen met $_POST en $_GET dat ik het de formaction nog op 'get' had staan. Ja, en dan doet dat '$_POST' het niet natuurlijk...

Hoe ziet het bijbehorende form er dan nu uit?

[quote:d9aff45d8e="bekhof"]Correctie: Heb zo zitten klungelen en proberen met $_POST en $_GET dat ik het de formaction nog op 'get' had staan. Ja, en dan doet dat '$_POST' het niet natuurlijk...[/quote:d9aff45d8e]

Je kan ze dus niet combineren? Niet een gedeelte get laten gebruiken en een gedeelte post?

Nee, dat is niet mogelijk.

Een actie is altijd [b:ab4607dec2]of[/b:ab4607dec2] post, [b:ab4607dec2]of[/b:ab4607dec2] get.

Als een bezoeker doet http://forum.macosx.nl/posting.php?mode=reply&t=24145, dan zijn de variabelen mode & t op te vragen via $_GET[‘mode’] & $_GET[‘t’].
Als je een formulier op method=get hebt staan, krijg je na submit bijvoorbeeld http://www.domein.nl/form.php?naam=invulnaam&email=invulemail etc etc etc
Ook hier zijn de variabelen naam & email op te vragen via de global $_GET[’’].

Wanneer je je formulier op method=post hebt staan, staat er niets in de adresbalk.
Alle gegevens zijn dan opvraagbaar via $_POST[’’]

Misschien dat je nu ook de gedachtengang snapt achter het wel / niet mogelijk zijn van wat je wilt

Ok, begin meer en meer te snappen waarom sommige van mijn probeersels het maar deels deden... :)

Wil je van het $_GET of $_POST gezeur af zijn, gebruik dan:

[code:1:0253ee8c16]$_GET = array_merge($_GET, $_POST);[/code:1:0253ee8c16]

[quote:175e19f9d0="Remco Vermeer"]Hoe ziet het bijbehorende form er dan nu uit?[/quote:175e19f9d0] [quote:175e19f9d0="Formulier"] <span class="koptekst">Contact...</span><br /> <form id="contact" action="verzendmail.php" method="post" name="contact"> <table width="180" border="0" cellspacing="0" cellpadding="0"> <tr height="24"> <td width="125" height="24">Naam:</td> <td height="24"><input type="text" name="naam" size="40"></td> <td height="24"></td> </tr> <tr height="24"> <td width="125" height="24">E-mail:</td> <td height="24"><input type="text" name="email" size="40"></td> <td height="24"></td> </tr> <tr> <td valign="top" width="125">Opmerkingen:</td> <td><textarea name="opmerking" rows="4" cols="40"></textarea></td> <td></td> </tr> <tr> <td valign="top" width="125"></td> <td><input type="submit" name="submit" value="Verzenden"></td> <td></td> </tr> </table> <input type="hidden" name="verzenden" value="verzenden"> </form> [/quote:175e19f9d0] Is maar een simpel testje, omdat ik het dus niet voor elkaar kreeg. Als ik nu de $_POST gebruik, werkt het dus wel...

Ander iets wat me opviel: Als ik een lijst produceer vanuit MySQL, kan ik deze ook alleen maar ‘clickable’ krijgen als ik bovenaan de actie de variabele $_GET controleer. Is dit normaal?

Voorbeeld:

[quote:175e19f9d0]
// Variabele subcat_id juist instellen
if(isset($_GET[“subcat_id”])==0){
$subcat_id=0;
}else{
$subcat_id=(int)$_GET[“subcat_id”];
}
[/quote:175e19f9d0]
Ik heb dus in de lijst op een link (artikelnummer bijvoorbeeld) geklikt, welke alleen de details van de betreffende regel (uniek ID = subcat_id) laat zien. Zonder bovenstaand voorbeeld lukt dit me niet, terwijl ik toch dacht dat dit niet nodig moest zijn, omdat de variabele al wordt ingegeven door het klikken in de lijst. Zal misschien hetzelfde idee zijn als met de $_POST variant, ik vraag het me gewoon af…

$_GET["subcat_id"] is een andere variabele als: $subcat_id

Dus dat klopt.

$subcat_id is leeg, tenzij je er wat instopt. $_GET[“subcat_id”] is gevuld als er in de QUERYSTRING de variabele subcat_id een waarde is gegeven.