使用php更新数据库

使用php更新数据库,php,mysql,sql,Php,Mysql,Sql,我正在将addedworkhours插入数据库,但问题是,如果我为同一id(afnumber)插入多次,旧值和新值都会保留。新的val不能取代旧的val。我正在尝试更新它(评论部分),但是一点也不成功。结果总是一样的。我试图使用if/else条件使其工作,检查列中的值是否为空,然后插入。如果不更新,If条件语句中是否有帮助 我获取更新输出的方式: if(isset($_POST['submit'])){ if(AddedWH IS NULL) THEN $add

我正在将addedworkhours插入数据库,但问题是,如果我为同一id(afnumber)插入多次,旧值和新值都会保留。新的val不能取代旧的val。我正在尝试更新它(评论部分),但是一点也不成功。结果总是一样的。我试图使用if/else条件使其工作,检查列中的值是否为空,然后插入。如果不更新,If条件语句中是否有帮助

我获取更新输出的方式:

   if(isset($_POST['submit'])){

    if(AddedWH IS NULL) THEN

        $addedhours = $_POST['AddedHours'];
        $selectaf = $_POST['SelectAF'];
              $sql1="INSERT INTO `editedworkhours` (`AFNumber`,`AddedWH`) VALUES('$selectaf','$addedhours')";

             $getResult =mysql_query($sql1);
             if(mysql_affected_rows() > 0)
             {

             } 
             else{

             }

    else


                $tempname = $row['Field'];
                $sql2 = "UPDATE editedworkhours SET AddedWH ='".$_GET["addedhours"]."' WHERE AFNumber='".$_GET["selectaf"]."'";
                $result2 = mysqli_query($con,$sql2);
                if ($con->query($sql2) === TRUE) {
                } else {
                    echo "Error: " . $sql2 . "<br>" . $con->error;
                    echo '<script>swal("Error", "Something went wrong '.$con->error.'", "error");</script>';
                }
     echo '<script>swal("Success", "Changes have been saved", "success");</script>';  


} END IF;
echo $menu;
if(isset($\u POST['submit'])){
如果(AddedWH为空),则
$addedhours=$_POST['addedhours'];
$selectaf=$_POST['selectaf'];
$sql1=“插入到'editedworkhours'('AFNumber','AddedWH`)值('$selectaf','$addedhours')”;
$getResult=mysql\u查询($sql1);
如果(mysql\u受影响的\u行()>0)
{
} 
否则{
}
其他的
$tempname=$row['Field'];
$sql2=“UPDATE editedworkhours SET AddedWH=”。$\u GET[“addedhours”]。“'WHERE AFNumber=”。$\u GET[“selectaf”]。”;
$result2=mysqli_查询($con,$sql2);
if($con->query($sql2)==TRUE){
}否则{
echo“Error:”.$sql2.“
”$con->Error; echo“swal(“Error”,“出错了”。$con->Error.”,“Error”); } echo'swal(“成功”,“更改已保存”,“成功”); }如果结束; echo$菜单;
一种优雅的方法是将
afnumber
定义为表的主键:

ALTER TABLE `editedworkhours` 
ADD CONSTRAINT `editedworkhours_pk` PRIMARY KEY (`afnumber`);
编辑:
正如Gordon在评论中指出的,如果您已经拥有主键,则可以添加一个唯一的约束:

ALTER TABLE `editedworkhours` 
ADD CONSTRAINT `editedworkhours_uc` UNIQUE (`afnumber`);    
一旦约束就位,就可以利用MySQL的insert子句:


如果您正在谈论此片段:
$sql3=“UPDATE editedworkhours SET AddedWH+=”。$\u GET[“addedhours”]。“'WHERE AFNumber=”。$\u GET[“selectaf”]。”,您的问题是关于
AddedWH
列的,对吗?这是什么数据类型,我想是某种
VARCHAR

您应该将列的类型更改为例如
INTEGER
并使用
。。。设置AddedWH=AddedWH+“$\u获取[“addedhours”]。”..

现在要做的是添加一个字符串(
$\u GET
变量包含在记号中:
),因此SQL语句被解释为字符串连接


当然,这对所有类型的SQL注入都是开放的,但这不是你的问题的一部分(考虑使用预先准备好的语句,你会在这里和互联网上的其他地方(例如,谷歌)找到大量关于此主题的信息,请参见示例)。

好吧,我要做的是生成两个运行的语句—1个INSERT语句和1个UPDATE语句。但是,插入将检查相同的
afnumber
是否已经存在
。下面是一个示例脚本:

  if(isset($_POST['submit'])) {

   $addedhours = $_POST['AddedHours'];
   $selectaf = $_POST['SelectAF'];

$sql1="INSERT INTO `editedworkhours` (`AFNumber`,`AddedWH`) 
select '$selectaf','$addedhours'
where not exists (select afnumber from editedworkhours where afnumber = '$selectaf')";

$getResult =mysql_query($sql1);

 if(mysql_affected_rows($getResult) == 0) {

 $sql2 = "UPDATE editedworkhours SET AddedWH ='".$_POST["addedhours"]."' WHERE AFNumber='".$_POST["selectaf"]."'";

 $result2 = mysql_query($sql2);
 }

}
上述方法有两个作用:

a) 如果记录不存在,则插入 b) 如果插入导致0条记录,则更新

我还注意到,在“更新”部分中,您有
$\u GET
超全局,而insert有
$\u POST
,因此我将它们都更改为
$\u POST
。不确定是否有什么问题…

不要将
mysql\u*
mysqli\u*
混用!不要再使用mysql了

始终测试错误。是否
INSERT
得到了“重复密钥”,而您没有注意到

考虑使用

INSERT ... ON DUPLICATE KEY UPDATE ...

你的代码不是很清楚。把你要做的事情写个大纲怎么样。例如,如果在每篇文章中插入一个insert,那么您可能正在为每个增加的小时数条目积累一条记录?这是有意的吗?另外,您注释掉的代码混淆了对sql2和sql3的引用,这增加了混淆。@MaxHaaksman不,指责不是故意的,这是问题所在。其目的是为员工插入一个新的值,以替换旧的现有值。这就是我试图对注释部分所做的,但是它不起作用。等等,你想完全替换现有的值吗?那么,首先,您为什么要使用运算符
+=
?@stef77抱歉,这是一个错误,所以,实际上,现在一切都应该正常了。。。?如果是关于决定是插入
还是更新
,我会通过SQL检查条目是否存在,然后决定是插入还是更新,以获得Mureinik的答案,但从这一点上我并不真正理解您的问题。注意:这将通过声明
afnumber
为唯一(如果表已经有主键)来实现。如果它不是唯一的列,则根本不起作用。但在这种情况下,它似乎是独一无二的,所以一切都应该很好。如果将
addedwh
设置为
$addedwh
,即。OP不想增加。
INSERT ... ON DUPLICATE KEY UPDATE ...