Проблема с запросом на обновление при вставке значения внешнего ключа в столбец базы данных - PullRequest
0 голосов
/ 19 июня 2019

Я работаю над cms для свойств в oop php в учебных целях.У меня есть галерея с изображениями для каждого отдельного объекта.Теперь я пытаюсь получить одно из этих изображений в качестве основного изображения для этого конкретного свойства.У меня есть три стола.

properties (id, location, price, main_photo_id)

property_photo (id, property_id, photo_id)

photos (id, name, extension)

У меня возникли проблемы при написании запроса, который обновит столбец main_photo_id (таблица свойств) с идентификатором из таблицы фотографий (или photo_id из таблицы property_photo, в принципе это то же самое).Я знаю, что запрос не очень хороший, потому что он всегда записывает 0 в столбце main_photo_id, но я относительно неопытен в sql и, похоже, не могу найти проблему.Любая помощь приветствуется.

AdModel:

public function MainPhotoInsert($photoid)
{   
    $this->db->query('UPDATE properties INNER JOIN photos ON photos.id = properties.id SET properties.main_photo_id = :main_photo_id');     
    $this->db->bind(':main_photo_id', $photoid);
    $this->db->execute();
}

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($photoid);
            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 Ответ

1 голос
/ 19 июня 2019

Я предложил использовать этот запрос:

UPDATE properties SET main_photo_id = :main_photo_id WHERE id = :property_id;

Но для этого необходимо знать идентификатор объекта. Теперь я вижу, что у вас есть идентификатор свойства в таблице property_photo, так что вы также можете использовать это:

public function MainPhotoInsert($photoid)
{   
    $subQuery = "SELECT property_id 
                 FROM property_photo 
                 WHERE id = :main_photo_id2";
    $this->db->query("UPDATE properties 
                      SET main_photo_id = :main_photo_id1
                      WHERE id = ($subQuery)");     
    $this->db->bind(':main_photo_id1', $photoid);
    $this->db->bind(':main_photo_id2', $photoid);
    $this->db->execute();
}

Я использую подзапрос, чтобы найти идентификатор свойства, и поэтому мне нужно дважды связать идентификатор фотографии.

Примечание: я не уверен, но Mysql может запутаться из-за использования id из двух разных таблиц. Если вы получили ошибку, используйте псевдонимы, подобные этому:

public function MainPhotoInsert($photoid)
{   
    $subQuery = "SELECT B.property_id 
                 FROM property_photo AS B 
                 WHERE B.id = :main_photo_id2";
    $this->db->query("UPDATE properties AS A
                      SET A.main_photo_id = :main_photo_id1
                      WHERE A.id = ($subQuery)");     
    $this->db->bind(':main_photo_id1', $photoid);
    $this->db->bind(':main_photo_id2', $photoid);
    $this->db->execute();
}

Весь код не проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...