【问题标题】:Updating a mysql column with keys from another column from the same table使用同一表中另一列的键更新 mysql 列
【发布时间】: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 列中的字段值进行更新。抱歉问得这么不清楚和复杂。我真的不知道该怎么解释。欢迎任何编辑,任何答案都会有很大帮助。谢谢 我到处搜索,但没有找到任何答案。

【问题讨论】:

    标签: php mysql arrays


    【解决方案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 编写更新查询。
      • 讨论你的“无模式”设计:stackoverflow.com/questions/11779252/…
      • 我当然不会为每个值写一个查询。我当然不会循环传递查询。我只是想确保是否有办法使用 mysql 查询来做到这一点。你“以自己的方式”回答了我的问题。
      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 2014-12-08
      • 2019-07-25
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多