出于学习目的,我正在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>
答案 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作为单选按钮的值。