2011-08-08 2 views
0

2 개의 섹션이있는 양식이 있으며 각 섹션은 하나의 행으로 시작하고 스크립트를 사용하여 추가 행을 추가 할 수 있습니다. this page 하단의 양식을 볼 수 있습니다.기본 값이 MySQL 데이터베이스에 제출되는 행을 방지하는 방법

이 양식은 기본값을 사용하며 기본값을 포함하는 행을 제출하지 않는 방법을 찾고 있습니다 (MySQL 데이터베이스와 전자 메일 모두). 사람들은 한 행 (예 : Waged 또는 Unaged 속도) 만 완료 할 수 있기 때문에 종종 한 행의 정보 만 제출하면됩니다. 양식의 현재 코드는 다음과 같습니다. 사전에 어떤 도움

감사합니다,

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

관련 문제