使用同一表中另一列的键更新 mysql 列

Posted

技术标签:

【中文标题】使用同一表中另一列的键更新 mysql 列【英文标题】:Updating a mysql column with keys from another column from the same table 【发布时间】:2016-04-07 13:47:04 【问题描述】:

也许问题标题不是很具描述性。那是因为我真的不知道怎么写。但我的问题是我有一个名为 pagemeta 的表,其中包含三列 idpage_propertyproperty_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中另一列分组的另一列的顺序更新列

尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列

根据表中另一个现有列的内容更改 SQL Server 中的现有列

使用同一 Dataframe 中另一列的 int 作为索引获取列中的列表值

SQL - 更新表,以便在给定另一列的键的情况下对一列求和

用 Pandas 将 DataFrame 中某些列和行的值替换为同一 DataFrame 中另一列的值