[PHP] Undefined index

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BD1
  • Registratie: Augustus 2009
  • Laatst online: 17-09 22:10
Ik heb hier een formulier die de gegevens ophaalt en deze gegevens in een MySQL-database zet. Hieronder is de code van het formulier:
HTML:
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
<html>
<head>
<title>Registreer</title>
</head>
<body bgcolor="fedcba">
<strong>Vul onderstaande gegevens in en registreer</strong>
<form method="post" action="gasten_opslaan.php">
<table bgcolor="abcdef" >
    <tr>
        <td>Voornaam:</td>
        <td><input type="text" name="voornaam" size="20"/></td>
    </tr>
    <tr>
        <td>Tussenvoegsel:</td>
        <td><input type="text" name="tussenvoegsel" size="20"/></td>
    </tr>
    <tr>
        <td>Achternaam:</td>
        <td><input type="text" name="achternaam" size="20"/></td>
    </tr>
    <tr>
        <td>Telefoonnummer:</td>
        <td><input type="text" name="telefoonnummer" size="20"/></td>
    </tr>
    <tr>
        <td>E-mailadres:</td>
        <td><input type="text" name="e-mailadres" size="20"/></td>
    </tr>
    <tr>
        <td>Gebruikersnaam:</td>
        <td><input type="text" name="gebruikersnaam" size="20"/></td>
    </tr>
    <tr>
        <td>Wachtwoord:</td>
        <td><input type="text" name="wachtwoord" size="20"/></td>
    </tr>
    <tr>
        <td><input type="submit" value="Registreer" size="20"/></td>
    </tr>
</table>
</form>
</body>
</html>

En hieronder staat de code waarin het script wordt uitgevoerd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

include("include/verbinding.inc.php");

$voornaam = addslashes($_POST["voornaam"]);
$tussenvoegsel = addslashes($_POST["tussenvoegsel"]);
$achternaam = addslashes($_POST["achternaam"]);
$telefoonnummer = addslashes($_POST["telefoonnummer"]);
$emailadres = addslashes($_POST["e-mailadres"]);
$gebruikersnaam = addslashes($_POST["gebruikersnaam"]);
$wachtwoord = addslashes($_POST["wachtwoord"]);

$sql = "INSERT INTO gasten(voornaam,tussenvoegsel,achternaam,telefoon,emailadres,gebruikersnaam,wachtwoord)
        VALUES ('$voornaam','$tussenvoegsel','$achternaam','$telefoonnummer','$emailadres','$gebruikersnaam','$wachtwoord')";
$resultaat = mysql_query($sql);

$verbreken = mysql_close($verbinding);

("De gegevens van ".$voornaam." ".$tussenvoegsel." ".$achternaam." zijn opgeslagen in de tabel");   

?>


Het probleem is nu dat ik een 'Undefined index' on line 5 t/m 11' krijg. Ik heb het probleem al besproken met verschillende mensen maar nog steeds geen oplossing

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
print_r je $_POST eens in gasten_opslaan.php. Dan ben je er snel genoeg achter wat het probleem is.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

En zoek voor de grap eens op die melding? Die ga je heel erg veel tegenkomen. Daarnaast is het gebruik van addslashes af te raden, gebruik liever mysql_real_escape_string().

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Of gebruik mysqli of PDO waardoor je niks meer hoeft te escapen.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

Verwijderd schreef op donderdag 25 maart 2010 @ 11:06:
Of gebruik mysqli of PDO waardoor je niks meer hoeft te escapen.
Pardon? Ik weet niet waar je die onzin vandaan haalt, maar je moet _altijd_ je input filteren danwel escapen.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MueR schreef op donderdag 25 maart 2010 @ 11:08:
[...]

Pardon? Ik weet niet waar je die onzin vandaan haalt, maar je moet _altijd_ je input filteren danwel escapen.
PDO ken ik niet, maar bij MySQLi gebruik je gewoon prepared statements en dan hoef je niets te "filteren" noch "escapen". Sterker: dat wil je dan juist niet. Gebruik je geen prepared statements en rag je een query zo naar MySQL dan moet het natuurlijk wél. Maar ik neem aan dat lfs daar niet op doelde. PDO werkt, als ik me niet vergis, gelijkaardig.

[ Voor 19% gewijzigd door RobIII op 25-03-2010 11:43 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Verwijderd schreef op donderdag 25 maart 2010 @ 11:06:
Of gebruik mysqli of PDO waardoor je niks meer hoeft te escapen.
Je hoeft dan niet te escapen, maar je moet nog steeds de moeite nemen om je parameters te binden..Als je daar gewoon die query in mietert is het nog steeds onveilig ;)

Acties:
  • 0 Henk 'm!

  • Martiveen
  • Registratie: Januari 2009
  • Laatst online: 18:54
MueR schreef op donderdag 25 maart 2010 @ 11:08:
[...]

Pardon? Ik weet niet waar je die onzin vandaan haalt, maar je moet _altijd_ je input filteren danwel escapen.
PDO maakt gebruik van prepared statements. Denk dat lfs daar op aan het doelen was.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

RobIII schreef op donderdag 25 maart 2010 @ 11:38:
[...]

PDO ken ik niet, maar bij MySQLi gebruik je gewoon prepared statements en dan hoef je niets te "filteren" noch "escapen". Sterker: dat wil je dan juist niet. Gebruik je geen prepared statements en rag je een query zo naar MySQL dan moet het natuurlijk wél. Maar ik neem aan dat lfs daar niet op doelde. PDO werkt, als ik me niet vergis, gelijkaardig.
Ook MySQLi heeft gewoon een functie mysqli_query() waar je alle troep in kunt gooien die je wil. Het is dus niet zo dat je per definitie niet hoeft te escapen bij het gebruik van MySQLi.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CodeCaster schreef op donderdag 25 maart 2010 @ 11:46:
[...]

Ook MySQLi heeft gewoon een functie mysqli_query() waar je alle troep in kunt gooien die je wil. Het is dus niet zo dat je per definitie niet hoeft te escapen bij het gebruik van MySQLi.
Dat zeg ik. Don't make me quote myself :P
RobIII schreef op donderdag 25 maart 2010 @ 11:38:
Gebruik je geen prepared statements en rag je een query zo naar MySQL dan moet het natuurlijk wél.
Het ging er om dat het geen klinkklare onzin is zoals MueR beweerde maar dat lfs wat vaag was en niet speciek genoeg aangaf dat je dan Prepared Statements moet gebruiken.

[ Voor 32% gewijzigd door RobIII op 25-03-2010 11:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

Prepared statements gaan gebruiken zijn dan ook een andere tak van sport als gewoon overschakelen van mysql naar de mysqli/PDO library ;)

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • BD1
  • Registratie: Augustus 2009
  • Laatst online: 17-09 22:10
KabouterSuper schreef op donderdag 25 maart 2010 @ 10:58:
print_r je $_POST eens in gasten_opslaan.php. Dan ben je er snel genoeg achter wat het probleem is.
Dit heb ik al gedaan. Maar dan krijg ik ook de melding van een Undefined Index.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
BigDrummer1 schreef op donderdag 25 maart 2010 @ 10:55:
Ik heb hier een formulier die de gegevens ophaalt en deze gegevens in een MySQL-database zet. Hieronder is de code van het formulier:

...KNIP...

Het probleem is nu dat ik een 'Undefined index' on line 5 t/m 11' krijg. Ik heb het probleem al besproken met verschillende mensen maar nog steeds geen oplossing
Welke versie van php draai je? Misschien typfout in bestandsnaam?

offtopic:
Ga eens controles inbouwen! Gewoon er klakkeloos vanuit gaan dat je postvars gevuld zijn is vragen om moeilijkheden!
Daarbij kijk ook niet eens wat het resultaat van de gedraaide query is... Als de query mislukt op een of andere manier, zal je script nog steeds zeggen dat de gegevens zijn opgeslagen.
BigDrummer1 schreef op donderdag 25 maart 2010 @ 12:25:
[...]

Dit heb ik al gedaan. Maar dan krijg ik ook de melding van een Undefined Index.
Heb je enige ervaring met PHP? want dat maak ik aan deze reactie niet echt op...

[ Voor 14% gewijzigd door steffex op 25-03-2010 12:29 ]


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
lijkt me stug dat je de melding krijgt van een undefined index. Undefined variable is technisch mogelijk (maar de eerste PHP omgeving waar $_POST niet bestaat moet ik nog vinden)....een undefined index als je print_r($_POST) doet is onmogelijk.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • stappel_
  • Registratie: Augustus 2000
  • Laatst online: 14-09 12:59
KabouterSuper schreef op donderdag 25 maart 2010 @ 12:31:
lijkt me stug dat je de melding krijgt van een undefined index. Undefined variable is technisch mogelijk (maar de eerste PHP omgeving waar $_POST niet bestaat moet ik nog vinden)....een undefined index als je print_r($_POST) doet is onmogelijk.
$_POST is een array, en de "voornaam" is de index-id ergo undefined index.

Ubero: #2, Euler: #1, GOT: #1, Des: #1, Zeta: #1, Eon: #3, OGR-24: #3, OGR-25: #7,
LM: #7, AP: #5, DF: #19, D2OL: #37, SOB: #50, TSC: #63, RC5: #96


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

@RobIII: mea culpa. Ik had dat zinnetje gemist.
stappel_ schreef op donderdag 25 maart 2010 @ 12:50:
$_POST is een array, en de "voornaam" is de index-id ergo undefined index.
print_r($_POST); kán geen fouten geven met undefined index... Gezien deze reactie:
BigDrummer1 schreef op donderdag 25 maart 2010 @ 12:25:
Dit heb ik al gedaan. Maar dan krijg ik ook de melding van een Undefined Index.
gok ik dat BigDrummer1 gewoon "print_r($_POST)" bovenaan het php-bestand heeft geplaatst in de hoop dat dat automagisch alle index-problemen zou oplossen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op donderdag 25 maart 2010 @ 11:38:
[...]

PDO ken ik niet, maar bij MySQLi gebruik je gewoon prepared statements en dan hoef je niets te "filteren" noch "escapen". Sterker: dat wil je dan juist niet. Gebruik je geen prepared statements en rag je een query zo naar MySQL dan moet het natuurlijk wél. Maar ik neem aan dat lfs daar niet op doelde. PDO werkt, als ik me niet vergis, gelijkaardig.
Je vergist je inderdaad niet. PDO is de class die zoveel mogelijk database-types samenvoegt, zodat je zonder de gehele programmering hoeft te veranderen, van database kan veranderen.

In princiepe hoef je de data alleen nog maar te valideren.

Acties:
  • 0 Henk 'm!

  • BD1
  • Registratie: Augustus 2009
  • Laatst online: 17-09 22:10
stef-o schreef op donderdag 25 maart 2010 @ 12:27:
Heb je enige ervaring met PHP? want dat maak ik aan deze reactie niet echt op...
Nee, inderdaad ik heb geen ervaring met PHP. Maar is het een voorwaarde dat je ervaring met PHP moet hebben om in dit forum te posten? Niet dat je dit expliciet zegt, maar je wekt wel deze suggestieDat lijkt me niet...

En mocht ik het fout hebben, dan mijn excuses hiervoor.

Ik heb de code nu uitgevoerd op een andere webserver. En nu doet hij het wel zonder iets veranderd te hebben! Dankjulliewel voor jullie medewerking.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
BigDrummer1 schreef op donderdag 25 maart 2010 @ 13:14:
[...]


Nee, inderdaad ik heb geen ervaring met PHP. Maar is het een voorwaarde dat je ervaring met PHP moet hebben om in dit forum te posten? Niet dat je dit expliciet zegt, maar je wekt wel deze suggestieDat lijkt me niet...

En mocht ik het fout hebben, dan mijn excuses hiervoor.

Ik heb de code nu uitgevoerd op een andere webserver. En nu doet hij het wel zonder iets veranderd te hebben! Dankjulliewel voor jullie medewerking.
Waar ik op duid is het ontbreken van kennis, die voor php programming en debugging toch erg basis is.
Dit had je zonder een post ook prima kunnen oplossen (dat was mijn insteek).

Heb je wel enig idee wat het probleem veroorzaakte? want simpelweg het script verplaatsen naar een andere server en zeggen dat het probleem weg is, zorgt er niet voor dat je begrijpt wat er gebeurt. Waar je dus niks van leert ;) Daarom is het wel handig om te achterhalen wat het probleem was!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

stef-o schreef op donderdag 25 maart 2010 @ 13:31:
[...]

Heb je wel enig idee wat het probleem veroorzaakte? want simpelweg het script verplaatsen naar een andere server en zeggen dat het probleem weg is, zorgt er niet voor dat je begrijpt wat er gebeurt. Waar je dus niks van leert ;) Daarom is het wel handig om te achterhalen wat het probleem was!
Het probleem is er nog steeds. Die andere webserver heeft gewoon notices uit staan. Hij roept die melding nog steeds maar hij komt niet meer op het scherm te staan. Dat is geen manier van problemen oplossen...

BigDrummer1: nee, superveel verstand van zaken hebben hoeft niet om hier te kunnen posten. Maar tegelijkertijd had je kunnen opzoeken wat print_r doet en dan had je gezien dat print_r niet bedoeld is om je probleem op te lossen maar om te zien wat er eigenlijk in $_POST staat en dus om te zien of die index die jij wil aanspreken inderdaad wel bestaat. Die bestaat niet, maar dan kun je in elk geval nakijken waarom en wat er dan wél allemaal doorkomt/werkt.

Ik wil je graag aanraden dat gewoon te blijven debuggen op je andere webserver tot het werkt, want notices negeren is een doodzonde in my book.

Het probleem komt als ik het zo zie trouwens alleen voor als je de eerste keer op de pagina komt, na een post gaat dit wel werken. Gewoon een kwestie van if ($_SERVER['REQUEST_METHOD'] == 'post') erbij opnemen en met isset checken of alles wel geset is dat je verwacht.

[ Voor 9% gewijzigd door NMe op 25-03-2010 13:45 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 18:27
Sterker nog:
Op die andere server bestaat het probleem ook, alleen is die server waarschijnlijk minder gevoelig voor fouten. (ofterwijl, hij geeft minder meldingen weer, notices worden genegeerd)

Je kreeg een notice op de Undefined index, ook op de andere service bestaat die index niet, dus het verplaatsen lost niets op.


Met de print_r suggestie waarop je geattendeerd bent zou je (mits je ook echt gegevens post naar die pagina en hem niet rechtstreeks aanroept) een lijst moeten krijgen met de gegevens in de post-variabele (dit is een array)

Maar wat ik hiermee dus zeggen wil:
Verplaatsen naar een andere server, omdat die de fout (die er wel degelijk is!) niet weergeeft wilt niet zeggen dat het nu wel goed is.

edit: @hierboven: Staat eigenlijk keurig wat ik ook probeerde te melden.. :(

[ Voor 5% gewijzigd door jbdeiman op 25-03-2010 13:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Zoals hier boven vermeld is, is dit probleem vrij basic. Je zal dus eerst moeten checken of het formulier wel gepost is, dat zal normaal gesproken het probleem oplossen. Daarnaast is het aan te raden om mysql_real_escape_string() te gebruiken in plaats van addslashes(). :Y

Oh en je kan waar nodig ook nog checken of zo'n waarde bestaat:
PHP:
1
2
3
4
if (isset($_POST['blaat']))
{
    // hij bestaat!
}


;)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ongevraagde tip: sla wachtwoorden niet zomaar op in je database, maar maak een hash van het wachtwoord en sla die op.

Voorbeeld:

PHP:
1
$wachtwoord = md5($_POST['wachtwoord'] . 'hierWatWillekeurigeTekst');

Acties:
  • 0 Henk 'm!

Verwijderd

HuHu schreef op donderdag 25 maart 2010 @ 14:03:
Ongevraagde tip: sla wachtwoorden niet zomaar op in je database, maar maak een hash van het wachtwoord en sla die op.

Voorbeeld:

PHP:
1
$wachtwoord = md5($_POST['wachtwoord'] . 'hierWatWillekeurigeTekst');
Goede tip, en dan ook nog checken of het wachtwoord wel voldoet, als is het maar een minimale lengte.
Het hoeft dus niet zo te zijn dat bijv. de derde letter geen "i" mag zijn oid. :9

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Verwijderd schreef op donderdag 25 maart 2010 @ 14:34:
[...]

Het hoeft dus niet zo te zijn dat bijv. de derde letter geen "i" mag zijn oid. :9
:')

Acties:
  • 0 Henk 'm!

  • stategamer
  • Registratie: December 2007
  • Laatst online: 26-08 14:46
Mischien? :

PHP:
1
2
3
4
5
<?php
if($_SERVER['REQUEST_METHOD'] == 'post') {
//doe je ding
}
?>

[ Voor 8% gewijzigd door stategamer op 25-03-2010 14:41 ]


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 23:43

Reinier

\o/

Verwijderd schreef op donderdag 25 maart 2010 @ 14:34:
[...]

Goede tip, en dan ook nog checken of het wachtwoord wel voldoet, als is het maar een minimale lengte.
Het hoeft dus niet zo te zijn dat bijv. de derde letter geen "i" mag zijn oid. :9
thedailywtf \o/

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
stategamer schreef op donderdag 25 maart 2010 @ 14:39:
Mischien? :

PHP:
1
2
3
4
5
<?php
if($_SERVER['REQUEST_METHOD'] == 'post') {
//doe je ding
}
?>
Gebruik voor de zekerheid "POST", ik weet niet of "post" werkt.

Acties:
  • 0 Henk 'm!

Verwijderd

mcdronkz schreef op donderdag 25 maart 2010 @ 14:52:
[...]


Gebruik voor de zekerheid "POST", ik weet niet of "post" werkt.
Of je gebruikt:
PHP:
1
2
3
4
if (strtolower($_SERVER['REQUEST_METHOD']) == 'post')
{
    // posted :9
}

Dan weet je het altijd zeker... ;)
:D

[ Voor 17% gewijzigd door Verwijderd op 25-03-2010 14:59 ]


Acties:
  • 0 Henk 'm!

  • BD1
  • Registratie: Augustus 2009
  • Laatst online: 17-09 22:10
Even voor de duidelijkheid. Dit is een simpele opdracht voor school vandaar dat het wachtwoord letterlijk in de database staat. Maar ik zal later al jullie tips gebruiken om iets echt groots te gaan programmeren.

Trouwens, bij de 'eerste' webserver werden er ook geen gegevens in de database geplaatst. Bij deze webserver kreeg ik ook de welbekende 'Undefined Index' meldingen. Op de 'tweede' webserver werden de gegevens wel in de database geplaatst zonder de welbekende meldingen. Heel vreemd inderdaad... Ik zal proberen te achterhalen wat de fout is en zal hem posten als ik hem heb;)

Acties:
  • 0 Henk 'm!

Verwijderd

De fout is je al lang gegeven: je wilt een waarde opvragen uit een array, maar de key komt niet voor in de array, vandaar dat je die melding krijgt. Aangezien "undefined index" waarschijnlijk een notice is, wordt deze niet weergeven op de andere server, simpelweg omdat daar de error_reporting anders staat.
Pagina: 1