Avatar billede KHHP Juniormester
15. april 2012 - 14:39 Der er 14 kommentarer og
1 løsning

Formular med diverse funktioner

Hej
Jeg er igang med at lave en større ændring på min side, men er stødt på et lille problem med min booking-formular.
Formularen er lavet således:
http://pastebin.com/2Feib949
Når man trykker send for man denne side:
http://pastebin.com/xJkCG54E
Nu til det jeg har problemer med. Min formular fungerer som den skal, men mit php script giver mig "grå hår". Som I nok kan se, så forsøger jeg mig med at gemme indhold i en database, men samtidig skal den også forsøge at sende en mail til kunden.
Når jeg udfylder min formular og trykker send, så sendes jeg også videre til verify.php, men jeg får bare en hvid skærm, og der gemmes intet i databasen, og der sendes heller ingen mail.
Ligeledes har jeg i min formular en checkbox, hvis det tlf man har skrevet er til en mobil. Dette vil jeg gerne have til at fremgå i mailen der sendes til kunden, men ligeledes også den der sendes til mig.
Jeg har på fornemmelsen at der er noget galt, men kan ikke rigtig se hvad jeg har gjort forkert.
Avatar billede olebole Juniormester
15. april 2012 - 15:20 #1
<ole>

Tag én ting ad gangen - og du kunne begynde med databasen. Prøv flg. kode:

<?php
error_reporting(E_ALL);
include '../inc/connect.php';
//Gem indhold fra formularen
$navn = mysql_real_escape_string($_POST['navn']);
$virksomhed = mysql_real_escape_string($_POST['virksomhed']);
$adresse = mysql_real_escape_string($_POST['vej']);
$postby = mysql_real_escape_string($_POST['postby']);
$tlf = mysql_real_escape_string($_POST['tlf']);
$mail = mysql_real_escape_string($_POST['email']);
$spillested = ($_POST['spillested']) ? mysql_real_escape_string($_POST['spillested']) : $adresse;
$spillepostby = ($_POST['spillepostby']) ? mysql_real_escape_string($_POST['spillepostby']) : $postby;
$dato = mysql_real_escape_string($_POST['dato']);
$fra = mysql_real_escape_string($_POST['fra']);
$til = mysql_real_escape_string($_POST['til']);

//Indsæt i database
    if (isset($_POST['submit']) && $_POST['spamcheck'] == "") {
      $tabeldata = "INSERT INTO booking('navn', 'virksomhed', 'adresse', 'postby', 'tlf', 'mail', 'spillested', 'spillepostby', 'til', 'fra')VALUES ('$navn','$virksomhed', '$adresse', '$postby', '$tlf', '$mail', '$spillested', '$spillepostby', '$fra', '$til')";
     
      $resultat = mysql_query($tabeldata) or die (mysql_error());
    }
?>

Hvad får du ud af det, og hvad siger evt. fejl?

Du har vist i øvrigt byttet om på $fra og $til i VALUES. Det er nok ikke noget, der har betydning for, at scriptet ikke virker, men bør rettes  =)

/mvh
</bole>
Avatar billede olebole Juniormester
15. april 2012 - 15:22 #2
Når vi har fundet frem til fejlen, vil jeg i øvrigt anbefale, at du læser denne guide om prepared statements under MySQLI  *o)
Avatar billede KHHP Juniormester
15. april 2012 - 17:15 #3
Så fik jeg indsat dit forslag, som det eneste, så den nu kun indsætter i databasen, og jeg får følgende fejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''navn', 'virksomhed', 'adresse', 'postby', 'tlf', 'mail', 'spillested', 'spillep' at line 1
Avatar billede olebole Juniormester
15. april 2012 - 17:32 #4
Præcis! Slet dine gåseøjne omkring:

('navn', 'virksomhed', 'adresse', 'postby', 'tlf', 'mail', 'spillested', 'spillepostby', 'til', 'fra')

- eller skift dem ud med backticks:

(`navn`, `virksomhed`, `adresse`, `postby`, `tlf`, `mail`, `spillested`, `spillepostby`, `til`, `fra`)
Avatar billede KHHP Juniormester
15. april 2012 - 18:10 #5
Så langt så godt. Har opdateret koden fra linket til pastebin, så den er den aktuelle version. Og nu gemmer den også i databasen.
Så skal vi have fikset det med mail.
Avatar billede olebole Juniormester
15. april 2012 - 18:28 #6
Nu kan jeg ikke længere se din e-mail-kode, men jeg kan huske flere fejl. For det første kan du ikke bruge <br> i en tekstmail. Brug et alm. linjeskift i stedet.

Desuden var dim mail-funktion ikke kompatibel med utf-8. Prøv engang at kikke på denne funktion:

function escapeAddr($addr) {
    $check = preg_match('/(.*)<(.*)>/', $addr, $a);
    if ($check) $addr = '=?UTF-8?B?'.base64_encode($a[1]).'?= <'.$a[2].'>';
    return $addr;
}
function mail_utf8($to, $subject='Intet emne', $message='', $from='', $cc='', $bcc='') {
    $from = escapeAddr($from);
    $header = 'From: '.$from.PHP_EOL
            . 'Return-Path: '.$from.PHP_EOL
            . 'Reply-To: '.$from.PHP_EOL
            . 'MIME-Version: 1.0'.PHP_EOL
            . 'Content-type: text/plain; charset=UTF-8'.PHP_EOL
            . 'X-Mailer: PHP/'.phpversion().PHP_EOL
            . 'Content-Transfer-Encoding: 8bit'.PHP_EOL;
    if ($cc!='') $header .= 'Cc: '.escapeAddr($cc).PHP_EOL;
    if ($bcc!='') $header .= 'Bcc: '.escapeAddr($bcc).PHP_EOL;
    $header .= PHP_EOL;
    return mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header);
}

Selve mail-funktionen hedder mail_utf8 - escapeAddr er bare en hjælpefunktion, du ikke behøver bekymre dig om.

Du bruger funktionen på denne måde:

$success = mail_utf8($mail, 'Et eller andet emne', 'En eller anden besked', 'noreply@dit_domain.dk', '', 'noreply@dit_domain.dk');
if ($success) {
    // Mail sendt
} else {
    // Shit hit the fan!
}

Så vil mailen blive sendt til brugeren og en kopi bliver sendt til dig selv, uden brugeren kan se det (BCC).
Avatar billede KHHP Juniormester
15. april 2012 - 19:23 #7
Så er det tilføjet.
Lige et enkelt spørgsmål omkring beskeden. I $success defineres mailadressen udfra den variabel der hedder $mail, så jeg kan også gøre det med beskeden, bare for at holde den del af koden så overskuelig som muligt. Så skal jeg bare lige vide hvordan jeg skal gøre det rigtigt, så det ikke giver problemer med resten af scriptet.
Har lagt min "gamle" kode her:
http://pastebin.com/TCh4zGHA
havde lige glemt at vi skulle bruge den til mail-delen. De mails der skal sendes ud kan jeg vel bare copy/paste og så fjerne <br /> fra dem. Men hvilke HTML-tags kan jeg bruge i mine mails, fordi jeg kunne egentlig godt tænke mig at lave en form for simpel styling, når hele mit site engang er færdigt, så mine mails passer ind i resten af designet.
Har også testet at alt virker, og det gør det.
Så var der lige den sidste ting med mobil. Jeg kunne godt tænke mig at der i databasen, samt i mails stod f.eks. Tlf: (+45) 12 34 56 78 (mobil), hvis man har sat hak i checkboxen mobil. Jeg kunne forestille mig at jeg skulle bruge noget if/else, men hvordan kan jeg ikke lige finde ud af.
Jeg kan lige så godt bede dig om at smide svar nu, så slipper jeg for det senere. Størstedelen af mit spørgsmål er jo blevet besvaret med stor tilfredshed.
Avatar billede olebole Juniormester
15. april 2012 - 19:36 #8
"De mails der skal sendes ud kan jeg vel bare copy/paste og så fjerne <br /> fra dem" >> Ja, og P-tags skal også fjernes. Dem erstatter du bare med et dobbelt linjeskift. Vent med HTML-formatering, til du har en simpel version på plads. Når du kommer dertil, skal dette:

. 'Content-type: text/plain; charset=UTF-8'.PHP_EOL

- til:

. 'Content-type: text/html; charset=UTF-8'.PHP_EOL

Hvad checkbox'en angår, så kan du skrive:

if (isset($_POST['mobil']) && $_POST['mobil']=='ja') {
  $tlf = $tlf.' (mobil)'
}

Jeg samler ikke point. Du lægger bare et svar og accepterer det, så tråden lukkes - men tak for tilbudet  =)
Avatar billede olebole Juniormester
15. april 2012 - 19:42 #9
I øvrigt tror jeg, at jeg selv ville gøre sådan efter mail-afsendingen:

if ($success) {
    header ('Location: done.php?sent=success');
} else {
    header ('Location: done.php?sent=fail');
}

- og så skrive statusbeskeden ind i done.php udfra, hvad der står i $_GET['sent']
Avatar billede KHHP Juniormester
15. april 2012 - 19:49 #10
Ok. Jeg takker mange gange for hjælpen :)
Avatar billede inteeeL Nybegynder
15. april 2012 - 19:52 #11
@Ole: man kunne til fordel for større systemer, hvor der sendes flere mails udbygge din funktion, således at man ved kald af funktionen tilkendegiver, om der bruges plain eller html tekst.
<?php

function escapeAddr($addr) {
    $check = preg_match('/(.*)<(.*)>/', $addr, $a);
    if ($check) $addr = '=?UTF-8?B?'.base64_encode($a[1]).'?= <'.$a[2].'>';
    return $addr;
}
function mail_utf8($to, $subject='Intet emne', $message='', $from='', $content_type='text/plain', $cc='', $bcc='') {
    $from = escapeAddr($from);
    $header = 'From: '.$from.PHP_EOL
            . 'Return-Path: '.$from.PHP_EOL
            . 'Reply-To: '.$from.PHP_EOL
            . 'MIME-Version: 1.0'.PHP_EOL
            . 'Content-type: '.$content_type.'; charset=UTF-8'.PHP_EOL
            . 'X-Mailer: PHP/'.phpversion().PHP_EOL
            . 'Content-Transfer-Encoding: 8bit'.PHP_EOL;
    if ($cc!='') $header .= 'Cc: '.escapeAddr($cc).PHP_EOL;
    if ($bcc!='') $header .= 'Bcc: '.escapeAddr($bcc).PHP_EOL;
    $header .= PHP_EOL;
    return mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header);
}

?>

- Og så kan den laves til en guide. :-)
Avatar billede olebole Juniormester
15. april 2012 - 22:48 #12
@KHHP: Selvtak. En enkelt lille idé, jeg har lyst til at videregive, er at bruge en template til den slags mails. Det kan ofte gøre det lettere at overskue/vedligeholde. Begynd med at lave en fil, der ser således ud:

Hej %{NAVN}%.

Tak for din henvendelse. Vi har registreret den i vores system og bestræber os på at bekræfte oplysningerne indenfor 24 timer.

Dette er en automatisk bekræftelse og kan ikke besvares. Alle henvendleser omkring din registrering skal foregå til booking@creativespectrum.dk

Du har registereret følgende oplysninger i vores system:

Navn: %{NAVN}%
%{VIRKSOMHED}%
Adresse: $adresse
%{POSTBY}%
Tlf:(+45)%{PHONE}%
E-mail: %{MAIL}%
Spillested:
%{SPILLESTED}%
%{SPILLEPOSTBY}%

Tidspunkt

%{DATO}%
%{FRA}% - %{TIL}%

Med Venlig Hilsen

Mobildiskotek Creative Spectrum
Hostrupvej 30, Jejsing
6270 Tønder
Tlf: (+45)29 61 00 57 / (+45)20 22 46 49
E-mail: booking@creativespectrum.dk

Så kan du hente ind i dit mailscript og oversætte filen sådan:

$arrReplace = array(
    '%{NAVN}%' => $navn,
    '%{VIRKSOMHED}%' => $virksomhed,
    '%{POSTBY}% ' => $postby,
    '%{PHONE}% ' => $phone,
    '%{MAIL}% ' => $mail,
    '%{SPILLESTED}% ' => $spillested,
    '%{SPILLEPOSTBY}% ' => $spillepostby,
    '%{DATO}%' => $dato,
    '%{FRA}%' => $fra,
    '%{TIL}%' => $til
);
$templ = file_get_contents('mail_msg.tmpl');
$besked = strtr($templ, $arrReplace);

Nu indeholder variablen $besked indholdet af skabelonen ... med alle variabler indsat de relevante steder.

@inteeeL: Tak for tilføjelsen - og ja, den guide skal skrives en af de nærmeste dage  *o)
Avatar billede olebole Juniormester
15. april 2012 - 22:50 #13
PS: Jeg glemte at skrive, at din template skal hedde mail_msg.tmpl for at virke med koden i den sidste boks =)
Avatar billede KHHP Juniormester
16. april 2012 - 07:55 #14
og en tmpl-fil kan jeg skrive i notepad eller hvordan?
Avatar billede olebole Juniormester
16. april 2012 - 09:37 #15
Ja, men husk at gemme som utf-8  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester