Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新外键列的查询出现问题_Php_Sql - Fatal编程技术网

Php 更新外键列的查询出现问题

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在每个酒店的照片库中插入一张主照片,并在不同的页面上显示该照片。我在模型中编写

为了便于学习,我正在使用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;
}
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。请