如何编写这种SQL逻辑

时间:2018-10-18 13:43:34

标签: php

我有6个同名输入

<div class="col-sm-4">
   <input type="text" name="features[] value="Feature 1">
   <input type="hidden" name="feature_id[]" value="1">
</div>

.........

某些输入可能具有一些值,然后其中一些可能为空。

我想更新值,但是如果输入为空,我想插入它

我知道这样做可以变得容易,然后我尝试这样做。在我下面的例子中 我遍历来自$ _POST的数组值,尝试更新值,但是如果行数为0,我正在执行插入查询。问题是当我插入新值时,也会插入非空输入值。 所有$ _POST数据都保存在$featuresData数组中

这是我的代码

ProperyData.php

 public function propertyData() {
     $featuresData = [
         "Features"  => $_POST['features'],
         "FeatureId" => $_POST['feature_id']
     ];
   return $data;
)

file.php

   $data = new PropertyData();

$featuresArr = $data->propertyData()['featuresData'];

for($i = 0; $i < count($featuresArr['Features']); $i++) {

   $update_features = "UPDATE features SET Feature_Title= :Feature WHERE idFeature = :id";

 $this->db->query($update_features);
 $this->db->bind(':Feature', $featuresArr['Features'][$i]);
 $this->db->bind(":id", $featuresArr['FeatureId'][$i]);
 $this->db->execute();

 if($this->db->rowCount() == 0) {
   $insert_features = "INSERT INTO features (Feature_Title, Appartment_ID) VALUES (:Feature, :id)";

 $this->db->query($insert_features);

 if(!empty($featuresArr['Features'][$i])) {

        $this->db->bind(':Feature', $featuresArr['Features'][$i]);
        $this->db->bind(":id", $id);
        $this->db->execute();
       }
     }
}

3 个答案:

答案 0 :(得分:0)

当您将表单数据存储在$featuresData数组中并尝试在$featuresArr上循环时。您应该在上面循环播放。

$featuresData = [
     "Features"  => $_POST['features'],
     "FeatureId" => $_POST['feature_id']
 ];

更改为:

for($i = 0; $i < count($featuresData['Features']); $i++) {

}

,字段为:

  $featuresData['Features'][$i]
    $featuresData['FeatureId'][$i]

查看您输入的输入字段名称。

<input type="text" name="features[]" value="Feature 2">
<input type="hidden" name="feature_id[]" value="2">

注意:您将表单数据存储在$featuresData数组中。您应该在上面循环播放。

对于非空值,您应该在循环插入数据之前设置条件:

    if(empty($featuresData['Features'][$i]) && empty($featuresData['FeatureId'][$i])){
    // insert data query
    }else{
     // update data query
   }

答案 1 :(得分:0)

我看到两种解决方案。

首先,您可以选择SELECT ...(如果存在),更新,如果不存在,则插入。

第二,也许您可​​以扭转您的想法,然后尝试INSERT ...在重复键更新上...但是,仅当至少一个值(可能是Appartment_ID吗?)的值是UNIQUE(可能是主键)时,这才有效>

INSERT INTO features (Feature_Title, Appartment_ID) VALUES (:Feature, :id) 
ON DUPLICATE KEY UPDATE Feature_Title=values(Feature_Title)

答案 2 :(得分:0)

您可以使用ON DUPLICATE KEY UPDATE功能,进行以下操作:

$update_features = "INSERT INTO `features` (`idFeature`, `Feature_Title`) VALUES (:id, :Feature) ON DUPLICATE KEY UPDATE `Feature_Title` = :Feature";

$this->db->query ( $update_features);
$this->db->bind ( ":Feature", $featuresData['Features'][$i]);
$this->db->bind ( ":id", $featuresData['FeatureId'][$i]);
$this->db->execute ();

如果您需要更多信息,请参阅MySQL ON DUPLICATE教程。