热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php拼接多个insert,php–将多个INSERTS分成一个表和多个表

我正在尝试使用PostgreSQL数据库在PHP中开发一个Q&A网站.我有一个动作来创建一个页面,其中包含标题,正文,类别和标签.我设法插入所有这些字段,但是我在插入多个标记值时遇

我正在尝试使用PostgreSQL数据库在 PHP中开发一个Q& A网站.

我有一个动作来创建一个页面,其中包含标题,正文,类别和标签.我设法插入所有这些字段,但是我在插入多个标记值时遇到了一些问题.

我使用这个函数将逗号分隔的值放到一个数组中,现在我想要一些东西将每个数组元素插入到表标记的数据库中(避免重复),然后插入我的多对多关系表问题标签:

$tags = explode(',', $_POST['tags']); //Comma separated values to an array

打印这样的东西:

Array ( [0] => hello [1] => there [2] => this [3] => is [4] => a [5] => test )

动作/ create_question.php

$category = get_categoryID_by_name($_POST['category']);

$question = [

'userid' => auth_user('userid'),

'body' => $_POST['editor1'],

'title' => $_POST['title'],

'categoryid' => $category

];

create_question($question, $tags);

然后我的create_question我应该插入标签.

function create_question($question, $tags) {

global $conn;

$query_publications=$conn->prepare("SELECT * FROM insert_into_questions(:body, :userid, :title, :categoryid);

");

$query_publications->execute($question);

}

我在考虑做这样的事情:

全球$conn;

foreach ($tags as $tag) {

$query_publications=$conn->prepare("INSERT INTO tags(name) VALUES($tag);

");

$query_publications->execute($question);

}

但后来我需要在我的多对多表中插入标签id.我是否需要创建另一个过程get_tags_id然后获取tag_id数组并在我尝试标记时插入它们?

我什么时候执行查询?插入后或彼此结束?

对于任何误用的术语或我的新手问题,我们深表歉意.我是PHP的新手,我正在努力解决一些新概念.

最佳答案 您可以使用CTE在一个SQL命令中完成所有操作.

假设Postgres 9.6和这个经典的多对多模式(因为你没有提供它):

CREATE TABLE questions (

question_id serial PRIMARY KEY

, title text NOT NULL

, body text

, userid int

, categoryid int

);

CREATE TABLE tags (

tag_id serial PRIMARY KEY

, tag text NOT NULL UNIQUE);

CREATE TABLE questiontags (

question_id int REFERENCES questions

, tag_id int REFERENCES tags

, PRIMARY KEY(question_id, tag_id)

);

要使用标记数组插入单个问题:

WITH input_data(body, userid, title, categoryid, tags) AS (

VALUES (:title, :body, :userid, :tags)

)

, input_tags AS ( -- fold duplicates

SELECT DISTINCT tag

FROM input_data, unnest(tags::text[]) tag

)

, q AS ( -- insert question

INSERT INTO questions

(body, userid, title, categoryid)

SELECT body, userid, title, categoryid

FROM input_data

RETURNING question_id

)

, t AS ( -- insert tags

INSERT INTO tags (tag)

TABLE input_tags -- short for: SELECT * FROM input_tags

ON CONFLICT (tag) DO NOTHING -- only new tags

RETURNING tag_id

)

INSERT INTO questiontags (question_id, tag_id)

SELECT q.question_id, t.tag_id

FROM q, (

SELECT tag_id

FROM t -- newly inserted

UNION ALL

SELECT tag_id

FROM input_tags JOIN tags USING (tag) -- pre-existing

) t;

dbfiddle here

这会创建任何尚未存在的标记.

Postgres数组的文本表示如下所示:{tag1,tag2,tag3}.

如果保证输入数组具有不同的标记,则可以从CTE input_tags中删除DISTINCT.

详细说明:

> Insert data in 3 tables at a time using Postgres

> How to use RETURNING with ON CONFLICT in PostgreSQL?

> How to implement a many-to-many relationship in PostgreSQL?

> Cannot INSERT: ERROR: array value must start with “{” or dimension information

如果您有并发写入,则可能需要执行更多操作.特别考虑第二个链接.



推荐阅读
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 尽管存在唯一列,仍显示“当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用”的消息。 ... [详细]
  • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • 利用ViewComponents在Asp.Net Core中构建高效分页组件
    通过运用 ViewComponents 技术,在 Asp.Net Core 中实现了高效的分页组件开发。本文详细介绍了如何通过创建 `PaginationViewComponent` 类并利用 `HelloWorld.DataContext` 上下文,实现对分页参数的定义与管理,从而提升 Web 应用程序的性能和用户体验。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 本文介绍了在 Android 平台上的图片上传工具类优化方案,重点讨论了如何通过设置 `MultipartEntity` 来实现图片的高效上传。具体实现中,通过自定义 `UserUploadServiceImpl` 类,详细展示了如何构建和发送包含图片数据的 HTTP 请求。此外,还探讨了如何处理上传过程中的常见问题,如网络异常和文件格式验证,以确保上传的稳定性和可靠性。 ... [详细]
  • 本文详细解析了 `DirectoryInfo.GetFiles` 方法的使用方法及其应用场景。通过示例代码展示了如何在 C# 程序中利用该方法获取指定目录下的所有文件列表,同时探讨了其参数选项和返回值类型,为开发者提供了实用的操作指南。 ... [详细]
  • 本文初步探讨了PHP中基于JWT(JSON Web Token)的身份验证机制。具体流程包括:1. 客户端通过用户名和密码发起登录请求;2. 服务器接收并验证用户凭证的合法性,若验证通过,则生成并返回一个JWT令牌;3. 客户端接收该令牌,并在后续请求中携带此令牌以完成身份验证。这一机制不仅提高了安全性,还简化了会话管理。 ... [详细]
  • 在 Asp.net 应用中,动态加载 DropDownList 控件的数据源是一项常见需求。本文探讨了如何高效地从数据库中获取数据,并实时更新下拉列表,确保用户界面始终与后台数据保持同步。通过使用 ADO.NET 和 LINQ to SQL 技术,开发者可以轻松实现这一功能,同时提高应用的性能和用户体验。文中还提供了代码示例和最佳实践,帮助开发者解决常见的数据绑定问题。 ... [详细]
  • 注:写博客或者项目的README文档经常用到markdown语法,所以markdown的语法做了一个总结,本文是基于【markdown】基 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
author-avatar
Melody-Zhu1988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有