Avatar billede mazey Praktikant
07. september 2010 - 17:44 Der er 7 kommentarer og
1 løsning

jQuery og PHP

Hej Eksperter.

Vi springer direkte ud i det:

Jeg har 2 PHP sider - status.php og send_mail.php

status.php er en dataside, hvor man bl.a. kan se en persons navn og email. man har på denne side, mulighed for at trykke på et link som så sender en e-mail.
<a href='index.php?page=send_mail&id=$_GET[id]&sagsnummer=$_GET[sagsnummer]'>[SEND MAIL]</a>

i filen send_mail.php er så en redirect, som sender brugeren tilbage til datasiden, så snart mail-delen er fuldført.

Alt PHP virker fint men mit problem består i, at når man så har klikket på knappen og man trykker på browserens tilbageknap, så sender man en mail igen. Dette ville jeg gerne være foruden, og her læste jeg så om jQuery.

Er det muligt at man med f.eks. med jQuery eller anden Javascript, kan have en knap som ovenstående, men med en OnClick="" tilføjet, som kan eksekvere et php script direkte på siden istedet for at skulle sende til en anden URL, og derved muliggøre at man får sendt unødigt mange mails? :-)

Jeg håber nogen kan hjælpe, og uddyber naturligvis gerne, hvis dette er nødvendigt.
Avatar billede Slettet bruger
07. september 2010 - 19:24 #1
Via jQuery kan du lave et AJAX kald som fungerer ligesom når du bruger <form>-tagget.
Du skal på din send_mail.php-side så udskrive en status, det kan f.eks. være '1' for mailen er sendt og alt er godt, og '0' for hvis der opstod en fejl.

Et eksempel kunne se således ud:

status.php
<script type="text/javascript">
function send_mail(id, sagsnr) {
  $.post({
    type : "POST",
    url : "send_mail.php",
    data : { "id" : id, "sagsnummer" : sagsnr },
    success : function(data) {
      if(data == 1) {
        alert("E-mailen blev sendt!");
      } else {
        alert("Der opstod en fejl under afsending af e-mailen!");
      }
    }
  });
}
</script>

<input type="button" value="Send Mail" onclick="send_mail(<?php print $_GET["id"]; ?>, <?php print $_GET["sagsnummer"]; ?>)">

send_mail.php
<?php
$id = $_POST["id"];
$sagsnr = $_POST["sagsnummer"];

$receiver = "";
$subject = "";
$message = "ID: " . $id . "\n".
          "Sagsnummer: " . $sagsnr;
$headers = "";

if(@mail($receiver, $subject, $message, $headers)) {
  print 1;
} else {
  print 0;
}
?>

Ovenstående kode er ikke testet af, men det kan forhåbenligt give dig en idé om hvordan det kan gøres.
Avatar billede mazey Praktikant
07. september 2010 - 20:52 #2
Hej Roxki,

Tak for dit input - jeg har valgt at gøre brug af dit eksempel, og vil først og fremmest have det til at virke, så jeg håber at du vil hjælpe mig lidt på vej.

Jeg poster lige hele min kode, så du kan se hvordan og hvorledes:

status.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>

</head>

<body>
<script type="text/javascript">
function send_mail(id, sagsnr) {
  $.post({
    type : "POST",
    url : "send_mail.php",
    data : { "id" : id, "sagsnummer" : sagsnr },
    success : function(data) {
      if(data == 1) {
        alert("E-mailen blev sendt!");
      } else {
        alert("Der opstod en fejl under afsending af e-mailen!");
      }
    }
  });
}
</script>
<form action="" method="post">
<input type="button" value="Send Mail" onclick="send_mail(<?php print $_GET["id"]; ?>, <?php print $_GET["sagsnummer"]; ?>)">
</form>
</body>
</html>

send_mail.php

<?php
$id = $_POST["id"];
$sagsnr = $_POST["sagsnummer"];

$receiver = "";
$subject = "";
$message = "ID: " . $id . "\n".
          "Sagsnummer: " . $sagsnr;
$headers = "";

if(@mail($receiver, $subject, $message, $headers)) {
  print 1;
} else {
  print 0;
}
?>


Jeg kan godt se ideen i det, og jeg går ud fra, at hvis jeg klikker på "Send Mail" knappen, skulle jeg gerne opnå en status enten som 0, eller 1. Desværre returnerer den ingen værdi. Jeg har ydermere forsøgt mig med <form> tags, men stadig intet.
Mangler jeg flere jquery.js filer (eller AJAX for den sags skyld) for at få det til at virke?

Det skal siges at jeg bruger FireFox, men det skulle vel ikke gøre nogen forskel?
Avatar billede Slettet bruger
07. september 2010 - 21:35 #3
Jeg har lige kigget på koden, og lagde mærke til jeg er kommet til at blande jQuery metoderne 'ajax' og 'post' sammen, hvilket gjorde jeg fik lavet en helt ubrugelig kode - ups!.

Her er koderne fra de 2 filer jeg brugte til at teste det af - og det virkede hos mig.

status.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
        <script type="text/javascript">
        function send_mail(id, sagsnr) {
            $.post(
                "send_mail.php",
                { "id" : id, "sagsnummer" : sagsnr },
                function(data) {
                    if(data == 1) {
                        alert("E-mailen blev sendt!");
                    } else {
                        alert("Der opstod en fejl under afsending af e-mailen!");
                    }
                }
            );
        }
        </script>
    </head>
    <body>
        <input type="button" value="Send Mail" onclick="send_mail(<?php print $_GET["id"]; ?>, <?php print $_GET["sagsnummer"]; ?>)" />
    </body>
</html>

send_mail.php
<?php
$id = $_POST["id"];
$sagsnr = $_POST["sagsnummer"];

$receiver = "";
$subject = "";
$message =    "ID: " . $id . "\n".
            "Sagsnummer: " . $sagsnr;
$headers = "";

if(@mail($receiver, $subject, $message, $headers)) {
  print 1;
} else {
  print 0;
}
?>

Håber det virker som det skal hos dig :-)
Avatar billede mazey Praktikant
07. september 2010 - 22:43 #4
Det giver mening - jeg skal ærligt indrømme at jeg lavede noget af en brøler, idet jeg i starten heller ikke havde variablerne med i URL'en, og den derfor fejlede i koden. :-D

Nå, men nu virker det jo, og det er super lækkert - Jeg har derfor lagt koden videre ind i hele den oprindelige kode, og det virker stadig, dog med en forunderlig undtagelse: Når jeg klikker "Send" melder alerten at mailen ikke blev sendt, men det gør den altså.
Jeg har derfor kigget lidt videre på din kode og vil spørge dig hvad den function(data) egentlig gør, for jeg tror ikke der bliver returneret noget til den?

Det skal siges at URL'en er en del anderledes, end ovenstående filnavne, men det skulle vel heller ikke være det? - den ser således ud: http://personale.domain.dk/warranty/index.php?page=reklamation_status&id=7001&sagsnummer=106

På forhånd mange tak for din hjælp!
Avatar billede mazey Praktikant
07. september 2010 - 22:47 #5
...og forresten, så ligger send_mail.php også i en anden mappe: stien i statusfilen er derfor således: pages/send_mail.php
Avatar billede mazey Praktikant
07. september 2010 - 23:08 #6
Jeg har fundet fejlen, og den bestod i noget mysql som genererede lidt mere end bare et 1-tal.

Jeg har det hele til at fungere 100% nu, og vil takke dig mange gange for din hjælp. Det er super!

Skriver du et svar, så skal du få nogle point.

Endnu en gang tak.
Avatar billede Slettet bruger
07. september 2010 - 23:10 #7
URL'en er jeg ikke så interesseret i sålænge du har ændret dem i koden så det passer til deres rigtige placeringer.
Den anonyme funktion der laves i $.post() er en callback funktion, hvor det første argument er hvad der bliver udskrevet på siden, i dette eksempel skulle det gerne være '1' eller '0'.
Du kan læse mere om det på følgende adresse: http://api.jquery.com/jQuery.post/

Du kan evt. prøve at udskrive hele 'data' variablen i den anonyme funktion for at se det præcise output og så tilpasse IF-sætningen.
Avatar billede Slettet bruger
07. september 2010 - 23:15 #8
Du får et svar her
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