Php 更新外键列的查询出现问题
为了便于学习,我正在使用oop php开发一个用于属性/广告的cms。我有三个与透视表连接的表Php 更新外键列的查询出现问题,php,sql,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在每个酒店的照片库中插入一张主照片,并在不同的页面上显示该照片。我在模型中编写
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;
}
ADS控制器:
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>
您不应该在insert语句中包含select子句,至少对于您正在尝试执行的操作是这样的。如果只需要设置一次,则需要调整查询以包含其他两个值title和description,否则它们将始终为空。结果应该是这样的:
INSERT INTO properties (main_photo_id, title, description) VALUES (:main_photo_id, : title, : description)
更可能的情况是,如果相关行已经存在,则需要upsert更新;如果相关行不存在,则需要insert更新。在MySQL中,语法是。这意味着您将需要属性表上的主键—不清楚您是否已经有了主键。语法与上面的insert非常相似,但是在不知道表的确切结构的情况下,我无法给出确切的查询
更新:
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
旁注:
php还将为每个图像生成一个单独的HTML表单,表单上有一个单选按钮,这并不是您真正想要的。您应该移动表单以环绕整个foreach循环,这样您就有了一个表单。然后您应该将图像ID作为单选按钮的值 在MainPhotoInsert中,您在哪里进行插入?我只看到一个SELECT@MickaëlLeger我不小心用错了方法。我现在编辑了这篇文章,但我真的不知道如何正确地为此编写插入方法。您能帮忙吗?MainPhotoInsert正在同一查询中插入和选择。这将失败。您想在这里做什么?您更新的表单仍在尝试将ID传递到表单操作的get字符串中。您可能想删除它,因为其他所有内容都是通过post设置的,您可以使用隐藏的输入来发送它。@Martin我正试图通过属性表中的外键main_photo_id为每个属性在库中插入一张现有照片,并显示它。我知道这个查询很糟糕,我只是不知道如何将它写入工作我在属性表上有主键,我编辑了gallery.php,还编辑了post。尽管如此,我还是在编写插入查询时遇到了困难,我只是不知道该怎么做。你能帮忙吗?查询的前半部分看起来不错,如果你只是做了一个插入,不需要更新,只需在选择后删除所有内容阅读有关如何使用插入的链接文章。。。在重复密钥更新时,我按照您所说的做了所有事情。现在绑定值时遇到问题。我应该这样做$this->db->bind':title',$data['title']$此->数据库->绑定:main\u photo\u id',$id;然后在函数或其他函数中传递$data,但我现在没有main_photo_id,它是属性表中的外键,连接到作为photos表主键的id。请