如何从PHP向sql数据库仅提交非空变量?

如何从PHP向sql数据库仅提交非空变量?,php,sql,Php,Sql,我是初学者。我有一个更新字段,其中只有两个字段是必填字段。但当我更新时,sql数据库中的所有其他字段都更新为空白。有没有办法只在SQL中提交非空字段,或者我必须验证每个字段并为每个字段编写if(!empty())大小写和不同的SQL语句 This is my query after correcting <?php define("DB_SERVER", "localhost"); define("DB_USER", "root"); define("DB_PASSWORD", "");

我是初学者。我有一个更新字段,其中只有两个字段是必填字段。但当我更新时,sql数据库中的所有其他字段都更新为空白。有没有办法只在SQL中提交非空字段,或者我必须验证每个字段并为每个字段编写if(!empty())大小写和不同的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');
            }
?>
这是我更正后的查询

如您所说,您可以通过PHP中的
empty()
进行检查,或者尝试利用SQL并使用:

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

编辑:我也建议使用。因为现在您很容易受到攻击。

这更像是一个设计问题,假设用户正在填写表单,您可以从数据库中检索行值并预先填写表单,然后,当他们提交值时,您将只是覆盖现有数据,而不是用冗长的SQL语句检查值是否为空

其次,始终验证和清理您的用户输入,永远不要信任它。这不仅可以防止错误(未定义的索引[…]),还可以防止恶意攻击您的站点

第三,既然您使用的是
mysqli*
,为什么不使用预先准备好的语句来防止

注意:您的for
mysqli*
是OOP格式的,但您正在进一步使用过程函数。为了保持一致性,请选择过程或OO

阅读材料


传递一个具有更新值的数组您是将所有新数据添加到db表中,还是真的在更新旧数据?更新旧数据。例如,我已经填充了所有必填字段,为了避免剩余字段为空,现在我正在尝试更新那些剩余字段
mysqli.*
也准备了语句。如果该变量为空,则必须在参数中检查它
`JobType`=if(?=”,`JobType`)