Toon posts:

[php] Mail/post fout

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het volgende script gebouwd. Begin van de avond werkte het, ik heb geen idee wat ik aangepast heb maar plots wordt alles doorgestuurd naar de ?result=failmail. Ik zit met er al heel lang op blind te staren maar kom er niet achter. Wie heeft het antwoord?

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
<?php
$username="naam";
$password="wachtwoord";
$database="kickoff";

$voornaam=$_POST['voornaam'];
$achternaam=$_POST['achternaam'];
$leerjaar=$_POST['leerjaar'];
$mail=$_POST['mail'];
$studentnummer=$_POST['studentnummer'];

//mail parameters
$to=$_POST['mail'];
$subject='Toegangsbewijs KICK-OFF Party Aardrijkskunde';
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: KICK-OFF Party Aardrijkskunde <tickets@kickoff-ak.nl>' . "\r\n";
$message='hoi';

//insert into database
mysql_connect(localhost, $username, $password);
@mysql_select_db($database) or die( "kan de database niet bereiken");

$query = "INSERT INTO gegevens VALUES ('','$voornaam','$achternaam','$leerjaar','$mail','$studentnummer')";
mysql_query($query);

//mail
if(
mail($to, $subject, $message, $headers)){

mysql_close();

header("Location: tickets.php?result=succes");}

else {
    
mysql_close();

header("Location: tickets.php?result=failmail");}

?>

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 20:49

remco_k

een cassettebandje was genoeg

Verwijderd schreef op woensdag 10 juni 2009 @ 00:28:
Ik zit met er al heel lang op blind te staren maar kom er niet achter. Wie heeft het antwoord?
Je moet je niet blind staren, dat lost niets op. Zonde van de tijd.
Je moet debuggen, dat lost wél wat op. Wat staat er in $_POST['mail']; (tijdens debuggen)?
Wat staat er bij de mail functie in de variabelen: $to, $subject, $message en $headers?
Met deze info (slechts de code) kunnen wij verder ook niet veel.
Even warnings en errors aanzetten zou je de info kunnen geven die je zoekt, want kennelijk returnt the mail functie false...

n.b. die mysql_close(); kan ook wel voor de if.
En lees je even in over SQL injection, want je huidige script is hier ubergoed voor te misbruiken.
Want wat gebeurd er als ik als achternaam dit invul:
bla','','',''); DELETE FROM gegevens; INSERT INTO gegevens VALUES ('','','
(en dan zijn er vast nog wel simpelere dingen te bedenken die in 1 klap je database stuk maken.)

[ Voor 33% gewijzigd door remco_k op 10-06-2009 00:46 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 06-10 06:36

KompjoeFriek

Statsidioot

Het antwoord is: leer debuggen.
Een skill waarmee je ongetwijfeld dit, en mogelijk ook volgende problemen oplossen :)

GoT is geen forum waar je zomaar je code op kunt kwakken en wachten tot iemand het werk voor je doet. Daarentegen zijn er hier wel mensen bereid je te helpen.

Ik zou zelf beginnen met beide Header functies in comments te zetten, zodat je de uitvoer van je script ziet ipv je meteen redirected wordt.
Verder ook wat remco_k zegt: errors/warnings aanzetten

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Het is een mierenneukertje, maar als je script niet naar behoren werkt, maak dan geen gebruik van de @ voor functies, daarmee onderdruk je eventuele foutmeldingen waardoor je later eventueel in de knoop komt.

Ook je foutafhandeling (meer 'design' technisch gesproken) is ook niet je-van-het. Mooi dat je een foutmelding echo'ed op scherm, maar wat heeft je eindgebruiker daar verder aan? :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Begrijp me niet verkeerd, ik probeer niet zomaar een pasklaar antwoord te krijgen. Dat zou niet eens leuks zijn. Ik heb redelijk ervaring met HTML, php komt en dit is de eerste keer dat ik fatsoenlijk sql gebruik. Hoe wordt debugging gedaan met sql? Voor HTML weet ik validators, voor sql weet ik niet wat een goed bruikbare is (als die er al is).

Beide wel bedankt voor jullie antwoord, daar heb ik al iets aan. Voor de volledigheid:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form id="form" method="post" action="insert.php">
        <h1>
        <p><label for="voornaam">Voornaam:</label><input type="text" name="voornaam" /></p>
        <p><label for="achternaam">Achternaam:</label><input type="text" name="achternaam" /></p>
        <p><label for="leerjaar">Leerjaar:</label><select name="leerjaar">
                    <option value="1">Jaar 1</option>
                    <option value="2">Jaar 2</option>
                    <option value="3">Jaar 3</option>
                    <option value="4">Jaar 4</option>
                    <option value="5">Jaar 5</option>
                    </select></p>
        <p><label for="mail">Mail:</label><input type="text" name="mail" /></p>
        <p><label for="studentnummer">Studentnummer:</label><input type="text" /></p>
        <p><label for="verzend"></label><input type="submit" name="verzend" value="Verzenden" /></p>
        </h1>
        </form>

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 16:51
Wij bedoelen hier geen "outline" debugger maar eerder er 1 in, bijvoorbeeld zet over een echo achter waar jij denkt dat het fout loopt, of zelfs nog een die.. Dat valt hier voornamelijk onder debuggen, er zijn natuurlijk nog wel andere aspecten maar die kan je zelf verder lezen in dit topic

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 20:49

remco_k

een cassettebandje was genoeg

Verwijderd schreef op woensdag 10 juni 2009 @ 00:48:
Begrijp me niet verkeerd, ik probeer niet zomaar een pasklaar antwoord te krijgen. Dat zou niet eens leuks zijn. Ik heb redelijk ervaring met HTML, php komt en dit is de eerste keer dat ik fatsoenlijk sql gebruik. Hoe wordt debugging gedaan met sql? Voor HTML weet ik validators, voor sql weet ik niet wat een goed bruikbare is (als die er al is).
Validators zijn _geen_ debuggers. _jij_ bent de debugger.
Maar waaruit maak je nou op dat je SQL moet gaan debuggen? Voor zover ik zie heb je een probleem in je PHP code en niet in de SQL code.
Sterker nog, als die fout gaat, loopt je script volgens mij gewoon door. (omdat je de return waarde van mysql_query niet checked). Er verschijnt misschien wel een error op het scherm, maar door je header location is die sneller weg dan dat hij verschijnt.

Dus ga nou je PHP code eens debuggen, enable en bekijk alle warnings en errors, inspecteer (dmv een simpele echo) de waardes in je post variabele en daarmee moet je het probleem gewoon kunnen lokaliseren.


Meer heb je voorlopig niet nodig.

ps. SQL debugging doe je trouwens gewoon in een SQL editor die bij de database server hoort. In het geval van MySQL met phpmyadmin of MySQL query browser.
Maar dat heeft voor nu even niets met je probleem te maken.

[ Voor 20% gewijzigd door remco_k op 10-06-2009 01:10 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

Naast de tip van de @ weghalen voor de functies, is het ook een goed idee om tijdens het ontwikkelen helemaal bovenin je script (direct na <?php dus) te zetten:
PHP:
1
error_reporting(E_ALL | E_STRICT);

(...maar dan zonder <?php en ?> natuurlijk, dat voegt GoT toe.)
Daardoor krijg je meer waarschuwingen en tips over dingen die niet helemaal 100% zijn in je script.

Een beetje SQL debuggen zou je in ieder geval kunnen doen door vlak voor de mysql_query regel te zetten:
PHP:
1
echo "Query: $query<br />";


En verder natuurlijk her en der echo's invoegen. Eventueel kun je je script zo bouwen dat je heel simpel de "debug modus" kunt in en uitschakelen. Bovenin je script zou je bijvoorbeeld kunnen zetten:
PHP:
1
define('DEBUG', true);

Dan kun je de echo regeltjes zo schrijven:
PHP:
1
if (DEBUG) { echo "Query: $query<br />"; }

Als je het debuggen wilt uitschakelen, zet je simpelweg de define op false. Daarmee worden alle debug-echo's in een keer uitgeschakeld.

Let op dat het versturen van een header niet meer werkt zodra er al output (door echo's) is geweest. Een header moet worden verstuurd voordat er ook maar 1 karakter is verstuurd, al was het maar een spatie of een regeleinde. Dus ook als bijvoorbeeld mysql_connect een foutmelding geeft (wat tekst output is), zal een header-functie niet meer werken.

Offtopic: de <h1> tag is bedoeld voor een titel he, niet om een compleet formulier mee weer te geven. ;)

[ Voor 23% gewijzigd door Bergen op 10-06-2009 01:25 ]


Acties:
  • 0 Henk 'm!

  • croontje
  • Registratie: April 2004
  • Laatst online: 26-07 00:34
Volgens mij moet in: mysql_connect(localhost, $username, $password);
localhost tussen quotes:

mysql_connect('localhost', $username, $password);
of
mysql_connect("localhost", $username, $password);

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zonder quotes kan ook werken, maar dan krijg je er wel een strict error op. Een error welke imo direct fatal had mogen zijn, want de onbekende-constante-naar-string cast feature moet gewoon dood.

Meer ontopic: Controleer (*&%$@^$ nou eens de return values van system en database calls. Er gaat wellicht meer fout, maar zonder deze controle moet je gewoon niet eens een topic durven starten, want je hebt nog niet zelf aan enige foutafhandeling gedaan.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Topic kan dicht, ik ben eruit, en zeker dankzij jullie hulp. Debuggen is een kunst, daar ben ik wel uit. Soms heb je net even dat kleine duwtje in de juiste richting nodig, en dat hebben jullie gegeven. Dank daarvoor

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zaterdag 13 juni 2009 @ 00:55:
Topic kan dicht, ik ben eruit, en zeker dankzij jullie hulp. Debuggen is een kunst, daar ben ik wel uit. Soms heb je net even dat kleine duwtje in de juiste richting nodig, en dat hebben jullie gegeven. Dank daarvoor
Als je dan ook nog even de vinger op de pijnlijke plek wil leggen en voor leering ende vermaeck wil aangeven wat het probleem nou was dan leren anderen er ook nog iets van ;)

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!

Verwijderd

Topicstarter
Het was heel flauw, maar als er geen mailadres ingevuld werd dan werd er niks verzonden wat als FAIL werd beschouwd. Aangezien ik de invoer nog niet checkte kwam ik daar maar niet achter. Inmiddels werkt alles weer perfect, door ook wat checks in te bouwen. (en debuggen :P)

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 23:05

MueR

Admin Devschuur & Discord

is niet lief

remco_k schreef op woensdag 10 juni 2009 @ 00:34:
En lees je even in over SQL injection, want je huidige script is hier ubergoed voor te misbruiken.
Want wat gebeurd er als ik als achternaam dit invul:
bla','','',''); DELETE FROM gegevens; INSERT INTO gegevens VALUES ('','','
(en dan zijn er vast nog wel simpelere dingen te bedenken die in 1 klap je database stuk maken.)
Even mierenneuken. Hier gaat alleen een warning of error uit komen (afhankelijk van hoe TS errors afvangt), want mysql_query ondersteunt maximaal 1 query tegelijk. Voor meerdere queries zul je naar functies als mysqli::multi_query moeten kijken. Doet overigens niks af aan het feit dat TS wat aan SQL injection moet doen.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@MueR
I know, ben ik me ook volledig van bewust. Ik wilde eerste alles werkend hebben voordat ik SQL injection tegen zou gaan. Daar ga ik dus nu aan beginnen. Maar bedankt voor het even aanstippen :)
Pagina: 1