查询以更新外键列问题

时间:2019-06-18 12:58:36

标签: php sql

出于学习目的,我正在oop php中针对属性/广告开发cms。我有三个与数据透视表连接的表。

photos (id, name, extension), 

property_photo (id, property_id, photo_id), 

properties (id, title, description, main_photo_id)

我为每个属性都有一个图片库,并且我试图通过外键(main_photo_id)为每个属性插入主照片(图库中的现有照片之一),并将该照片显示在不同的页面上。我在模型中编写函数(查询)时遇到麻烦。任何帮助深表感谢。这是我的一些代码:

AdModel:

public function MainPhotoInsert($id)
{   
    $this->db->query('INSERT INTO properties (main_photo_id) VALUES (:main_photo_id) SELECT id FROM PHOTOS WHERE id = :id LIMIT 1');
    $this->db->bind(':id', $id);
    $row = $this->db->single();

    return $row;
}

AdsController:

public function galleryAction()
 {
    if (!isset($_GET['id'])) {
        $photo_id = $_SESSION['photo_id'];
    } else {
        $photo_id = $_GET['id'];
    }

     if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); 

        if(isset($_POST['radio']))
        {
            $this->AdModel->MainPhotoInsert($photo_id);
            redirect('ads/index');
        }   
    }

    $data = $this->AdModel->getPhotosForProperty($photo_id);
    $data1 = $this->AdModel->MainPhotoData($photo_id);

    $this->view->render('ads/gallery', $data, $data1);
 }

gallery.php:

<form action="/ads/gallery?id=<?php echo $_GET['id']; ?>" method="POST">

  <?php foreach ($data as $key => $value) : ?>

        <img src="<?php echo '/public/photos/'.$value->name.'.'.$value->extension ?>" class="img-fluid img-thumbnail" width="250" height="250">
        <input type="radio" name="radio" value="<?php echo $value->photo_id; ?>" >Make main
    <br>

  <?php endforeach; ?>
    <br>
    <br>
    <button type="submit" name="submit" value="submit" class="btn btn-success form-control">Submit</button>
</form>

1 个答案:

答案 0 :(得分:1)

您的insert语句中不应包含select子句(至少不是您尝试执行的操作)。如果您只需要设置一次,则需要调整查询以包括其他两个值(标题和描述),否则它们将始终为空白。它应该最终看起来像这样:

INSERT INTO properties (main_photo_id, title, description) VALUES (:main_photo_id, : title, : description)

您更有可能需要一个 upsert (如果相关行已存在,则进行更新;如果不存在,则进行插入)。在MySQL中,语法为insert ... on duplicate key update。这意味着您将需要在属性表上使用主键(尚不清楚是否已经有了主键)。语法与上面的插入法非常相似,但是在不知道表的确切结构的情况下,我无法为您提供确切的查询。

更新: on duplicate key语法看起来像这样(这取决于您在表上设置主键的方式,例如,如果main_photo_id是主键,则可能行不通):

INSERT INTO properties 
    (id, main_photo_id, title, description) 
VALUES 
    (:id, :main_photo_id, : title, : description)
ON DUPLICATE KEY UPDATE 
    main_photo_id = :main_photo_id, 
    title = :title, 
    description = :description

旁注: gallery.php还将为每个图像生成一个单独的HTML表单,表单上的一个单选按钮并不是您真正想要的。您应该将表单移动为环绕整个foreach循环,以便您拥有一个表单。然后,应将图像ID作为单选按钮的值。