2011-08-08 7 views
0

2つのセクションからなるフォームがあります。各セクションは1行で始まり、スクリプトを使用してさらに行を追加できます。フォームはthis pageの下部に表示されます。デフォルト値がMySQLデータベースに送信される行を防ぐ方法

フォームではデフォルト値が使用されています。デフォルト値を含む行を送信しない方法を探しています(MySQLデータベースと電子メールの両方)。ユーザーは1行(つまり、賃金または未払料金)で完了することが多いため、しばしば1行の情報のみを提出します。フォームの現在のコードは以下の通りです。事前に任意の助け

おかげで、

ニック

HTML:

<form method="post" name="booking" action="bookingengine.php"> 
    <fieldset> 
     <h2>Waged/Organisation Rate</h2> 
     <p> 
      <input type="text" name="name[]"> 
      <input type="text" name="email[]"> 
      <input type="text" name="organisation[]"> 
      <input type="text" name="position[]"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <fieldset> 
     <h2>Unwaged Rate</h2> 
     <p> 
      <input type="text" name="name2[]"> 
      <input type="text" name="email2[]"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <p><input type="submit" name="submit" id="submit" value="Submit and proceed to payment page" class="submit-button" /></p> 

</form> 

スクリプト:

<script> 
$(function() { 
    var defaults = { 
     'name[]':   'Name', 
    'name2[]':   'Name', 
     'email[]':   'Email', 
    'email2[]':   'Email', 
     'organisation[]': 'Organisation', 
     'position[]':  'Position' 

    }; 

    // separating set and remove 
    // note that you could add "defaults" as an arg if you had different 
    // defaults for different fieldsets 
    var setDefaults = function(inputElements) { 
     $(inputElements).each(function() { 
      var d = defaults[this.name]; 
      if (d) { 
       // set with jQuery 
       // we don't need the data - just check on the class 
       $(this).val(d) 
        .addClass('default_value'); 
      } 
     }); 
    }; 

    var removeDefaults = function(inputElements) { 
     $(inputElements).each(function() { 
      if ($(this).hasClass('default_value')) { 
       $(this).val('') 
        .removeClass('default_value'); 
      } 
     }); 
    }; 

    setDefaults(jQuery('form[name=booking] input')); 

    $("span.add").click(function() { 
     // get the correct fieldset based on the current element 
     var $fieldset = $(this).closest('fieldset'); 
     var $inputset = $('p', $fieldset) 
       .first() 
       .clone() 
       .insertBefore($('p', $fieldset).last()); 
     // add a remove button 
     $inputset.append('<span class="remove">Remove</span>'); 
     setDefaults($('input', $inputset)); 
     // return false; (only needed if this is a link) 
    }); 

    // use delegate here to avoid adding new 
    // handlers for new elements 
    $('fieldset').delegate("span.remove", { 
     'click': function() { 
      $(this).parent().remove(); 
     } 
    }); 

    // Toggles 
    $('form[name=booking]').delegate('input', { 
     'focus': function() { 
      removeDefaults($(this)); 
     }, 
     'blur': function() { 
      // switch to using .val() for consistency 
      if (!$(this).val()) setDefaults(this); 
     } 
    }); 
}); 
</script> 

PHP:

<?php 

$emailFrom = "****"; 
$emailTo = "****"; 
$subject = "****"; 

$body = "****" . "\n\n"; 
$row_count = count($_POST['name']); 
$row_count2 = count($_POST['name2']); 

$values = array(); 

for($i = 0; $i < $row_count; $i++) { 
    // variable sanitation... 
    $name = trim(stripslashes($_POST['name'][$i])); 
    $email = trim(stripslashes($_POST['email'][$i])); 
    $organisation = trim(stripslashes($_POST['organisation'][$i])); 
    $position = trim(stripslashes($_POST['position'][$i])); 

    // this assumes name, email, and telephone are required & present in each element 
    // otherwise you will have spurious line breaks. 
    $body .= "Name: " . $name . " Email: " . $email . " Organisation: " . $organisation . " Position: " . $position . "\n\n"; 

    //prepare the values for MySQL 
    $values[] = '(\'' . $name . '\',\'' . $email . '\',\'' . $organisation . '\',\'' . $position . '\')'; 

} 

mysql_select_db($database, $connection); 

$query1 = "INSERT INTO conference (Name, Email, Organisation, Position) VALUES " . implode(',', $values); 

$result1 = mysql_query($query1); 
if (!$result1) { 
    die('Invalid query: ' . mysql_error()); 
} 


$body .= "****" . "\n\n"; 

$values = array(); 

for($i = 0; $i < $row_count; $i++) { 
    // variable sanitation... 
    $name = trim(stripslashes($_POST['name2'][$i])); 
    $email = trim(stripslashes($_POST['email2'][$i])); 

    // this assumes name, email, and telephone are required & present in each element 
    // otherwise you will have spurious line breaks. 
    $body .= "Name: " . $name . " Email: " . $email . "\n\n"; 

    //prepare the values for MySQL 
    $values2[] = '(\'' . $name . '\',\'' . $email . '\')'; 
} 
$query2 = "INSERT INTO conference (Name, Email) VALUES " . implode(',', $values2); 

$result2 = mysql_query($query2); 
if (!$result2) { 
    die('Invalid query: ' . mysql_error()); 
} 

// send email 
$success = mail($emailTo, $subject, $body, "From: <$emailFrom>"); 

// redirect to success page 
if ($success){ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=/conference/payment.html\">"; 
} 
else{ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">"; 
} 
?> 
+2

警告 - あなたのコードはSQLインジェクションの影響を受けやすいです! –

+0

ありがとうございます。より安全にするために私が何をする必要があるのか​​教えていただけますか? – Nick

+0

準備済みの文を使用します。 –

答えて

0

私はあなたが持っている検証がエラーを返さなかったと仮定してPHPでIF文を使用します。

私は私が必要なものだけを挿入するか、デフォルト値から必要と残りの部分を削除または変更することができ、それぞれのデフォルト値のためにこれを行うだろう例

// SET VARIABLES 
$name2 = $_POST['name2']; 
// SET CORRECT VALUES 
if($name2 == "Surname") { $name2 = ""; } 
// RUN DB FUNCTIONS 

については

。また、ユーザーデータが未処理のままであることを意味します。

これが正しい軌道に乗るのに役立ちたいと思っています:)

+0

おかげでRyan。私はまだ検証方法を試していません(それは次のステップです)。すべてのデフォルト値を示唆していて、行にデフォルト値しか含まれていない場合、空の行がMySQLデータベースに追加されますか?また、PHPによって生成された電子メールについては、既定値の行のエントリがまだ残っているので、これを防ぐ方法を検討する必要があります。 – Nick

+1

私の意見では、コーディングが間違っていると思います。それぞれの部分を分解し、独立して開発するために、どのようなデータが必要なのかを知ることから始めます。その後、私は検証を書いて、次にデータベースに挿入して、最後に電子メールを書きます。この注文の理由は、私はプログラミングでデータを正しく扱うことができます。データを最初に保存することができます。電子メールに障害がある場合、データはすでに保存されていて、必要に応じて再送信できます。それはあなたに理にかなっていますか? – Ryan

+0

ライアンに感謝します。私は間違った方法をコーディングしていると思っています!必要なデータに関しては、ユーザーがデータを追加する任意の行について、すべてのフィールドを完了する必要があり(つまりデフォルト値なし)、電子メールが有効である必要があります。私は各_section_に1つの行があり、ユーザーは1行しか完成させたくないかもしれないので、これをどう扱うかを考えなければなりません。いずれかの行に削除ボタンを追加してから、すべてのデフォルト値をブロックするための検証コードを取得して、不要な行を削除するか、行の検証をスキップしてデフォルト値のみをスキップして、 MySQL。 – Nick

関連する問題