2017-09-27 21 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?