1

このスクリプトはAjaxを使用して呼び出しています。スクリプトの「データベースへの書き込み」部分は正常に実行されますが、何らかの理由で、スクリプトの実行時にsend_receipt()関数が実行されません。

スクリプトは最終的に2つの電子メールを送信するため、電子メールの送信機能はカスタム関数内に含める必要があります。1つは顧客への領収書、もう1つは会社への通知です。したがって、すべてのmail()変数とデータが繰り返されますが、ターゲットの電子メールアドレスが異なり、スクリプトの実行時に両方の関数が呼び出されます。

どんな助けでも大歓迎です。

ありがとう!

アヤックス:

    $.ajax({
        type: "POST",
        url: "selfnormal.php",
        data: "fname="+ fname +"& lname="+ lname +"& worktel="+ worktel +"& privtel="+ privtel +"& mobtel="+ mobtel +"& email="+ email +"& workaddress="+ workaddress +"& homeaddress="+ homeaddress +"& level="+ level +"& size="+ size +"& deliv="+ deliv +"& venue="+ venue +"& ioshdate="+ ioshdate +"& isdiscount="+ isdiscount +"& elcas="+ elcas +"& funding="+ funding +"& paytype="+ paytype +"& selfinvoicead="+ selfinvoicead +"& companyname="+ companyname +"& companyaddress="+ companyaddress +"& PO="+ PO +"& tcs="+ tcs +"& finalprice="+ finalprice +"& finalvat="+ finalvat +"& finalfee="+ finalfee +"& finaltotal="+ finaltotal +"& finalmonthly="+ finalmonthly +"& finaladmin="+ finaladmin,
        success: function(){
        alert ("success");
        }

PHP:

<?php
$firstname = htmlspecialchars(trim($_POST['fname']));
$lastname = htmlspecialchars(trim($_POST['lname']));
$worktel = htmlspecialchars(trim($_POST['worktel']));
$privtel = htmlspecialchars(trim($_POST['privtel']));
$mobtel = htmlspecialchars(trim($_POST['mobtel']));
$email = htmlspecialchars(trim($_POST['email']));
$workaddress = htmlspecialchars(trim($_POST['workaddress']));
$homeaddress = htmlspecialchars(trim($_POST['homeaddress']));
$level = htmlspecialchars(trim($_POST['level']));
$size = htmlspecialchars(trim($_POST['size']));
$deliv = htmlspecialchars(trim($_POST['deliv']));
$venue = htmlspecialchars(trim($_POST['venue']));
$ioshdate = htmlspecialchars(trim($_POST['ioshdate']));
$isdiscount = htmlspecialchars(trim($_POST['isdiscount']));
$elcas = htmlspecialchars(trim($_POST['elcas']));
$funding = htmlspecialchars(trim($_POST['funding']));
$paytype = htmlspecialchars(trim($_POST['paytype']));
$selfinvoicead = htmlspecialchars(trim($_POST['selfinvoicead']));
$companyname = htmlspecialchars(trim($_POST['companyname']));
$companyaddress = htmlspecialchars(trim($_POST['companyaddress']));
$po = htmlspecialchars(trim($_POST['PO']));
$tcs = htmlspecialchars(trim($_POST['tcs']));
$courseprice = htmlspecialchars(trim($_POST['finalprice']));
$vat = htmlspecialchars(trim($_POST['finalvat']));
$fee = htmlspecialchars(trim($_POST['finalfee']));
$admin = htmlspecialchars(trim($_POST['finaladmin']));
$total = htmlspecialchars(trim($_POST['finaltotal']));
$monthly = htmlspecialchars(trim($_POST['finalmonthly']));

$dbc = mysqli_connect('xxxx', 'xxxx', 'xxxx', 'xxxx')
or die ('Could not connect to MySQL server.');

$query = "INSERT INTO enrolments (fname, lname, worktel, privtel, mobtel, email, workaddress, homeaddress, level, size, deliv, venue, ioshdate, isdiscount, elcas, funding, paytype, selfinvoicead, companyname, companyaddress, po, tcs, price, VAT, BIFM_Fee, Total, Monthly, adminfee)" . 
"VALUES ('$firstname', '$lastname', '$worktel', '$privtel', '$mobtel', '$email', '$workaddress', '$homeaddress', '$level', '$size','$deliv','$venue', '$ioshdate','$isdiscount','$elcas', '$funding', '$paytype','$selfinvoicead','$companyname','$companyaddress','$po','$tcs', '$courseprice', '$vat', '$fee', '$total', '$monthly', '$admin')";

$result = mysqli_query($dbc, $query)
or die ('error querying database');
mysqli_close($dbc);

function send_receipt() {
$to = $email;
$subject = $firstname . ', thank you for enrolling on the ' . $level . ' ' . $size . ' (' . $deliv . ')';
$msg = "Hi $firstname," . PHP_EOL . 
    PHP_EOL .
    "Thanks for enrolling with us. Please find a summary of your enrolment below. We'll be in touch shortly to arrange payment, after which we will send you joining instructions and course details." . PHP_EOL .
    PHP_EOL . 
    "Please be aware that in accordance with UK Legislation, you are legally entitled to a 7 day 'cooling off' period during which you may cancel your course at no cost. After this period, you will be liable for full payment as detailed below." . PHP_EOL . 
    PHP_EOL . 
    "Level: $level" . PHP_EOL .
    "Scale: $size" . PHP_EOL .
    "Delivery Method: $deliv" . PHP_EOL .
    "Payment Method: $paytype" . PHP_EOL .
    "Course Price: £$courseprice" . PHP_EOL .
    "VAT: £$vat" . PHP_EOL .
    "ILM/BIFM fee: £$fee" . PHP_EOL .
    "Total: £$total" . PHP_EOL .
    PHP_EOL . 
    "We look forward to welcoming you onto the course in the near future." . PHP_EOL .
    PHP_EOL .
    "Kind regards" . PHP_EOL .
    PHP_EOL .
    "The Xenon Group staff";

    mail ($to, $subject, $msg, 'From: Xenon Group Enrolments');
}

send_receipt();
4

2 に答える 2

1

PHPの最初の段階では、関数スコープ外の変数に依存しています。これはPHPの動作方法ではありません。関数の外部の変数にアクセスする場合はglobal $var;、変数を関数のスコープにプルするために使用する必要があります...これを行わないと、変数はすべて未定義になるため、mail()関数は何を送信するかわかりません。$email空になるので送信しています。

function send_receipt(){

  global $email, $firstname, $lastname; /* and so on... */

}

ただし、使用する引数を関数に送信するように関数を調整する方がはるかに優れています。これにより、関数がより再利用可能になります。

function send_receipt( $email, $firstname, $lastname ){

  /* and so on ... */

}

または、さらにポータブルです(柔軟なデータを送信できるため):

function send_receipt( $email_to, $user_data ){

  /// place any default values here - just in case a value is missed
  $user_data += array(
    'firstname' => '',
    'lastname' => '',
  );

  /// create a shortcut to the data
  $ud = $user_data;

  $msg  = "Hi {$ud[firstname]}," . PHP_EOL .
          "Thanks for enrolling with us....";

  /* and so on ... */

}

次に、URLエンコードの問題を回避するには、次のようにjQueryajax呼び出しを作成するのが最適です。

$.ajax({
    type: "POST",
    url: "selfnormal.php",
    data: {
      "fname": fname,
      "lname": lname,
      "worktel": worktel,
      /* and so on */
    },
    success: function(){
     alert ("success");
    }
 });

これは、jQueryが以前に行っていたのではなくURLエンコードを正しく処理するためです...エンコードがなく、データに不正なURL文字が含まれていると2番目に壊れてしまいます。

クリスのコメントに応えて:)

上記は、PHPスクリプトがデータを受信する方法を変更するものではなく、サーバーへの転送中にデータを保護するだけです。これにより、PHPスクリプトは、解析を開始すると情報を正しく解釈できます。たとえば、URLエンコードしない場合、次のようにすると以前のURLが壊れます。

var firstname = 'Pebbl & Pebbl';
var lastname = 'Pebbl';
var url = 'firstname=' + firstname + '&lastname=' + lastname;

上記のURLを使用すると、PHPスクリプトは次のURLを受け取る可能性があります。

echo $_POST['firstname'];

/// would output 'Pebbl ' rather than the correct 'Pebbl & Pebbl'

PHP側でデータを受信する方法に関しては、次のようにするとおそらく簡単になります。実行していることは問題ありませんが、サーバー側のスクリプトの能力を使用していないだけです;)

/// define array of 'allowed param names' and 'var names to use in your script'
$allowed_fields = array(
  'fname' => 'firstname',
  'lname' => 'lastname',
  'email' => 'email',
  /* and so on ...*/
);

/// step each of the allowed fields
foreach( $allowed_fields as $field_name => $script_name ){

  /// check the post array to see if we have a value for that param name
  if ( !empty($_POST[$field_name]) ) {
    /// if we do, process by removing whitespace
    $value = trim( $_POST[$field_name] );
    /// and converting html to safe characters
    $value = htmlspecialchars( $value );
  }
  else {
    /// if no value default to empty
    $value = '';
  }

  /// use a variable variable to set the variable defined by $script_name 
  /// to $value i.e. if $script_name == 'email', then this would be the 
  /// same as writing $email = $value;
  $$script_name = $value;

}
于 2012-10-18T08:02:55.543 に答える
0

エラーメッセージの応答を表示するようにajaxを変更してみてください。

$.ajax({
    type: "POST",
    url: "selfnormal.php",
    data: "fname="+ fname +"& lname="+ lname +"& worktel="+ worktel +"& privtel="+ privtel +"& mobtel="+ mobtel +"& email="+ email +"& workaddress="+ workaddress +"& homeaddress="+ homeaddress +"& level="+ level +"& size="+ size +"& deliv="+ deliv +"& venue="+ venue +"& ioshdate="+ ioshdate +"& isdiscount="+ isdiscount +"& elcas="+ elcas +"& funding="+ funding +"& paytype="+ paytype +"& selfinvoicead="+ selfinvoicead +"& companyname="+ companyname +"& companyaddress="+ companyaddress +"& PO="+ PO +"& tcs="+ tcs +"& finalprice="+ finalprice +"& finalvat="+ finalvat +"& finalfee="+ finalfee +"& finaltotal="+ finaltotal +"& finalmonthly="+ finalmonthly +"& finaladmin="+ finaladmin,
    success: function(){
        alert ("success");
    },
    error: function (xhr, status, thrownError) {
       alert(xhr.responseText);
       alert(thrownError);
    }
});
于 2012-10-18T08:06:26.647 に答える