使用同一表中另一列的键更新 mysql 列
Posted
技术标签:
【中文标题】使用同一表中另一列的键更新 mysql 列【英文标题】:Updating a mysql column with keys from another column from the same table 【发布时间】:2016-04-07 13:47:04 【问题描述】:也许问题标题不是很具描述性。那是因为我真的不知道怎么写。但我的问题是我有一个名为 pagemeta
的表,其中包含三列 id
、 page_property
和 property_value
,这就是它的样子:
-----------------------------------
id | page_property | property_value|
------------------------------------
1 | telephone | 445854541 |
2 | email | c@gmail.com |
3 | icon | img/1.jpg |
到目前为止一切顺利。现在我有一个 html 表单,它向 php 页面发送一个 post 请求。 $_POST
数组键以 page_property
列中的字段命名,例如:电话和电子邮件以及图标。 $_POST
数组值是从表单中的输入字段设置的。最后我有一个包含这些值的 $_POST 数组:
telephone=>8988989
email=>b@gmail.com
icon=> img/2.jpg
问题从这里开始,我尝试更新pagemeta
表。我不知道如何编写UPDATE
查询,其中property_value
列中的字段使用$_POST
数组中的相应键进行更新。这意味着property_value
中的字段应根据page_property
列中的字段值进行更新。抱歉问得这么不清楚和复杂。我真的不知道该怎么解释。欢迎任何编辑,任何答案都会有很大帮助。谢谢
我到处搜索,但没有找到任何答案。
【问题讨论】:
【参考方案1】:使用这种数据库结构,您将需要 3 个查询来更新 3 个值,在我看来这很糟糕......
UPDATE pagemeta SET property_value = $_POST['telephone'] WHERE page_property = 'telephone'
UPDATE pagemeta SET property_value = $_POST['email'] WHERE page_property = 'email'
UPDATE pagemeta SET property_value = $_POST['icon'] WHERE page_property = 'icon'
您可能想重新考虑您的数据库结构,我不确定您的结构会赢得什么,而不是正常进行并创建一个名为电话的列,另一个称为电子邮件,最后一个称为图标
PD:请使用准备好的语句
【讨论】:
为每个字段创建一列的想法不是我想要的,因为该表用于多个页面,每个页面都有自己的属性和属性值。如果我这样做并更改我的表结构,我必须为每个页面创建一个表。 那么我的回答会奏效,但是你会陷入一场噩梦,每次都需要检查数据库,以确定哪些选项可以应用于特定页面。我仍然认为你可以/应该像我说的那样做,你只需要在你的表中添加一个名为 page_id 的列,然后你就可以将设置链接到一个特定的页面。【参考方案2】:通常,当您创建 HTML 表单时,您会添加一个 hidden 字段,其中包含您正在编辑的行的 ID。
<form>
<input type="hidden" name="id" value="1"> <!-- id of record being edited -->
<input type="tel" name="telephone" value="8988989">
<input type="email" name="email" value="b@gmail.com">
<input type="text" name="icon" value="img/2.jpg">
</form>
您的 $POST 数组将是:
id=>1
telephone=>8988989
email=>b@gmail.com
icon=> img/2.jpg
在没有 Id 的情况下,您会假设您希望创建一条新记录,即在表中插入另一行。
您的表格布局也将更改为在一行中包含所有内容的布局。
如果你得到一个 id,你的 UPDATE 将是:
UPDATE pagemeta SET
telephone=$_POST[telephone],
email=$_POST[email],
icon=$+POST[icon]
WHERE id=$_POST[id]
NB 以上 SQL 仅供说明之用。实际上,您必须验证您的表单输入以避免 SQL 注入攻击
【讨论】:
【参考方案3】:好的。您正坐在 PHP IDE 中查看一些全局变量并思考“我怎样才能将它们粉碎到数据库中?”
任何体面的 IDE 都会警告您使用 Superglobal 检索数据。 IDE 不会告诉您的是,如果您将正在做的事情发布到网络上,就会被利用。
听起来您刚刚开始您的旅程,因此请按照您的要求回答您的问题:
$conn = new mysqli("servername", "username", "password", "dbname");
foreach($_POST as $key => $value)
$sql = "UPDATE pagemeta SET property_value = $value WHERE page_property = $key"
$conn->query($sql)
$conn->close()
【讨论】:
我知道如何处理 $_POST 并且我知道如何避免 SQL 注入和其他类型的漏洞利用。我只是想知道是否有办法编写查询来解决这个问题。 没有戏剧。如果您打算为您的数据库坚持该设计,您将为每个单独的 property_values 编写更新查询。 讨论你的“无模式”设计:***.com/questions/11779252/… 我当然不会为每个值写一个查询。我当然不会循环传递查询。我只是想确保是否有办法使用 mysql 查询来做到这一点。你“以自己的方式”回答了我的问题。以上是关于使用同一表中另一列的键更新 mysql 列的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列
根据表中另一个现有列的内容更改 SQL Server 中的现有列