2017-09-27 18 views
1

我是初學者。我有一個更新字段,我只有2個字段是強制性的。但是,當我更新所有其他領域更新爲空數據庫中的空白。有沒有辦法只提交SQL中的非空字段,或者我必須驗證每個字段併爲每個字段寫一個if(!empty())大小寫和不同的sql語句嗎?如何僅向PHP提交非空var到sql數據庫?

This is my query after correcting 

<?php 
define("DB_SERVER", "localhost"); 
define("DB_USER", "root"); 
define("DB_PASSWORD", ""); 
define("DB_DATABASE", "testingtimelines"); 


$connect = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); 
if(isset($_POST['submit'])){ 

$TA = $_POST['tharea']; 
$Brand = $_POST['brand']; 
$JobType = $_POST['jobtype']; 
$DevLead = $_POST['devlead']; 
$OnsiteDPM = $_POST['OnsiteDPM']; 
$ISDAY0 = $_POST['isday0']; 
$VeevaNo = $_POST['VeevaNo']; 
$SiteName = $_POST['sitename']; 
$SiteType = $_POST['sitetype']; 
$AuthorURL = $_POST['authorurl']; 
$BFWURL = $_POST['bfwurl']; 
$Target = $_POST['target']; 
$Complexity = $_POST['complexity']; 
$Developer = $_POST['Developer']; 
$PlannedStartDate = $_POST['plandate']; 
$PlannedActivity = $_POST['plannedactivity']; 
$TR = $_POST['ingredients']; 
$TestingResource = implode(", ",$TR); 
$ActualStartDate = $_POST['actualdate']; 
$ActivityStatus = $_POST['activitystatus']; 
$ActualClosureDate = $_POST['closedate']; 
$Comments = $_POST['Comments']; 
$PlannedEndDate = $_POST['enddate']; 
$sql = $connect->prepare("UPDATE `testingdashboard` SET `TA`=IF(`TA`='',?,`TA`), 
      `Brand`=IF(`Brand`='',?,`Brand`), 
      `JobType`=IF(`JobType`='',?,`JobType`), 
      `DevLead`=IF(`DevLead`='',?,`DevLead`), 
      `OnsiteDPM`=IF(`OnsiteDPM`='',?,`OnsiteDPM`), 
      `ISDAY0`=IF(`ISDAY0`='',?,`ISDAY0`), 
      `SiteName`=IF(`SiteName`='',?,`SiteName`), 
      `SiteType`=IF(`SiteType`='',?,`SiteType`), 
      `AuthorURL`=IF(`AuthorURL`='',?,`AuthorURL`), 
      `BFWURL`=IF(`BFWURL`='',?,`BFWURL`), 
      `Target`=IF(`Target`='',?,`Target`), 
      `Complexity`=IF(`Complexity`='',?,`Complexity`), 
      `Developer`=IF(`Developer`='',?,`Developer`), 
      `PlannedStartDate`=IF(`PlannedStartDate`='',?,`PlannedStartDate`), 
      `TestingResource`=IF(`TestingResource`='',?,`TestingResource`), 
      `ActualStartDate`=IF(`ActualStartDate`='',?,`ActualStartDate`), 
      `ActivityStatus`=IF(`ActivityStatus`='',?,`ActivityStatus`), 
      `ActualClosureDate`=IF(`ActualClosureDate`='',?,`ActualClosureDate`), 
      `Comments`=IF(`Comments`='',?,`Comments`), 
      `PlannedEndDate`=IF(`PlannedEndDate`='',?,`PlannedEndDate`), 
      WHERE `VeevaNo`='$VeevaNo' AND `PlannedActivity`='$PlannedActivity'"); 
      $sql->bind_param("ssssssssssssssssssss", $TA, $Brand, $JobType, $DevLead, $OnsiteDPM, $ISDAY0, $SiteName, $SiteType, $AuthorURL, $BFWURL, $Target, $Complexity, $Developer, $PlannedStartDate, $TestingResource, $ActualStartDate, $ActivityStatus, $ActualClosureDate, $Comments, $PlannedEndDate); 


$sql->execute(); 
      if(mysqli_query($connect,$sql)){ 
      //header("localhost/testing/list.php"); 
      echo "success"; 
      $sql->close(); 
      header('location:new.php'); 
      } 
?> 

但現在我得到「未定義指數」的錯誤和「致命錯誤:未捕獲的錯誤:調用一個成員函數bind_param()」

通過empty()謝謝

+0

通過使用更新的值 –

+0

您是要添加的所有新數據到你的數據庫表的數組或者是你真的更新舊的數據? – Sand

+0

更新舊數據。例如,我已經填寫了所有必填字段,以免剩餘空白,現在我試圖更新這些剩餘字段 – Andruraj

回答

0

您可以檢查它PHP如你所說或試圖把SQL和使用優勢:

UPDATE mytable t 
    SET t.col = IF(foo='',t.col,foo) 
WHERE ... 

編輯:另外,我建議使用PDO prepared statements。因爲現在你很容易受到SQLi injection的影響。

+0

'mysqli_ *'也準備了語句。 – Script47

+0

嘗試過但不工作 – Andruraj

+0

你可以顯示SQL查詢嗎? – Vastlik

1

這似乎更像是一個設計問題,假設用戶正在填寫表單,您可以從數據庫中檢索行值並預先填充表單,然後當他們提交值時,您只需覆蓋現有的數據而不是長時間的SQL語句檢查值是否爲空。

其次總是驗證和清理你的用戶輸入,永遠不要相信它。這不僅可以防止錯誤(未定義索引[...]),還可以防止惡意企圖攻擊您的網站。

第三,看到你正在使用mysqli_*,爲什麼你不使用準備好的語句來防止SQL Injection

注意:您的constructor對於mysqli_*是OOP形式,但您在進一步使用過程功能。爲了保持一致性,請選擇程序或OO。

閱讀材料

How can I prevent SQL injection in PHP?