2016-06-07 141 views
0

嗨,我在我的網站有一個聯繫表單,用戶可以選擇性地填寫一些字段,並在點擊提交按鈕數據保存到數據庫,所有這一切工作正常,直到我決定從SQL注入消毒我的代碼,我在第一次試圖從SQL注入消毒它,它工作正常,因爲我表現出下面的代碼之前提到null列保護免受sql注入

<form method="Post" action=""> 
 
     <input type="text" name="name" />name 
 
     <select dir="rtl" style="width: 173px;" name="case" > 
 
     <option value="" disabled selected hidden>اplease choose</option> 
 
     <option value='rent'>rent</option> 
 
     <option value='sell'>sell</option> 
 
      </select > 
 
      <input type="checkbox" name="check1" value='a'>apartment<br> 
 
     <input type="submit" value="submit" /> 
 
     </form> 
 
<?php 
 
include("config.php"); 
 
    if(isset($_POST['submit'])){ 
 

 
     $date_clicked = date('Y-m-d H:i:s'); 
 

 
    } 
 
    //insert to database 
 
    \t $insert =mysqli_query($connect,"INSERT INTO $db_table VALUES (to simplify code i do not write this part)"); 
 

 
    } 
 
    ?>
現在我必須填寫所有的下拉列表和複選框,否則它給出錯誤「列」不能爲空「。我也不能在數據庫中插入日期和時間,它會給出同樣的錯誤。這裏是我的代碼時,我保護它弗朗SQL注入:
<form method="Post" action=""> 
 
    <input type="text" name="name" />name 
 
    <select dir="rtl" style="width: 173px;" name="case" > 
 
    <option value="" disabled selected hidden>اplease choose</option> 
 
    <option value='rent'>rent</option> 
 
    <option value='sell'>sell</option> 
 
     </select > 
 
     <input type="checkbox" name="check1" value='a'>apartment<br> 
 
    <input type="submit" value="submit" /> 
 
    </form> 
 

 
    <?php 
 
    include("config.php"); 
 
    if(isset($_POST['submit'])){ 
 

 
     $date_clicked = date('Y-m-d H:i:s'); 
 

 
    } 
 
    if(isset($_POST['submit'])){ 
 
    //insert to database 
 
    $query = mysqli_prepare($connect, "INSERT INTO $db_table VALUES (?,?,?,?)"); 
 
     /* bind parameters for markers */ 
 
     mysqli_stmt_bind_param($query, "ssss", $_POST[name],$_POST['check1'],$_POST['case'],$_POST['date_clicked']); 
 
    // execute query 
 
    if (mysqli_stmt_execute($query)) { 
 
     echo "Successfully inserted " . mysqli_affected_rows($connect) . " row"; 
 
    } else { 
 
     echo "Error occurred: " . mysqli_error($connect); 
 
    } 
 

 
    } 
 

 

 
    ?>

請幫我

+0

'$ _POST [name]'應該是'$ _POST [「name」]',這是在您的原始代碼中,還是隻是在您粘貼在代碼中的錯字? – apokryfos

+0

不是原來的那個,它是$ _POST [「name」] – Malekian

+0

確保沒有任何PHP警告。例如,只有當複選框被設置時,纔會設置'$ _POST [「check1」]',這樣你會在那裏得到一個PHP警告,這會使該行中的其餘代碼行爲不當。此外,請確保您的數據庫表允許可選字段中的空值。 – apokryfos

回答

1

確保您存在變數。這是必要的,因爲您的複選框,例如,如果不選中,它將爲空,這可能是您正在使用的表的問題。您可以設置默認值,然後插入它。

$name = !empty($_POST['name']) ? $_POST['name'] : ''; 
$check1 = !empty($_POST['check1']) ? $_POST['check1'] : ''; 
$case = !empty($_POST['case']) ? $_POST['case'] : ''; 
$date_clicked = date('Y-m-d H:i:s'); 

// prepare and bind 
$stmt = $connect->prepare("INSERT INTO `$db_table` (`name`, `check1`, `case`, `date_clicked`) VALUES (?, ?, ?, ?)"); 
$stmt->bind_param("ssss", $name, $check1, $case, $date_clicked); 

$stmt->execute(); 
$stmt->close(); 
+0

非常感謝您的回答下拉列表和複選框現在工作正常,但日期和時間變量無法正常工作,只能在數據庫中保存0000-00-00 00:00:00。我現在知道爲什麼。你可以幫我嗎? – Malekian

+0

我剛剛意識到生成日期並不是來自表單。我修改了我的答案。 – timhysniu

+0

非常感謝你的工作:) – Malekian