【问题标题】:Confused how to write this simple UPDATE/INSERT困惑如何编写这个简单的 UPDATE/INSERT
【发布时间】:2010-09-30 13:27:36
【问题描述】:

好的,我很困惑如何为我在本地开发的这个简单应用程序编写插入/更新,以了解有关数据库交互的更多信息。

我有一个“编辑”页面,该页面由数据库填充并列出最多 9 个用户链接(在本例中为 user_id 2),如下所示:

<input type="text" name="link1" value="www.yahoo.com">  
<input type="text" name="link2" value="www.google.com">  
<input type="text" name="link3" value="www.amazon.com">  
<input type="text" name="link4" value="">  
<input type="text" name="link5" value="">  
<input type="text" name="link6" value="">  
<input type="text" name="link7" value="">  
<input type="text" name="link8" value="">  
<input type="text" name="link9" value="">  
<input type="submit" name="submitted" value="update">

这里应该显示 9 个文本输入,前 3 个输入填充了下面链接表中的 url...这些输入似乎没有出现在我的问题中,即使它们出现在我的问题中预览。

我的 links 表只有 2 列,如下所示:

user_id     linkurl
1           http://www.abcnews.com

2           http://www.yahoo.com
2           http://www.google.com        
2           http://www.amazon.com

3           http://www.ebay.com
3           http://www.craigslist.org

我该如何编写插入/更新查询,例如,编辑第三个链接并添加第四个,可能是第五个、第六个、第七个、第八个和第九个?

我在同一页面上还有一个用户个人信息部分,我可以使用如下查询轻松更新:

$query = "UPDATE users
          SET first_name='$firstname', last_name='$lastname', email='$email', state='$state'"  

if($newpass1){
    $query .= ", pass=md5('$newpass1')";
}

$query .= " WHERE user_id = {$_SESSION['user_id']}";

【问题讨论】:

    标签: php mysql insert


    【解决方案1】:

    我真的不明白你遇到了什么麻烦。如果您展示了一些您尝试过但没有达到您想要的效果,这可能会有所帮助。

    我的一条建议是,您可能希望在链接表中添加一个 link_id 列。这将使唯一标识每一行并保留原始输入顺序变得更加容易。 (我不知道 MySQL 的实现,但在一般 RDBMS 理论中,您不应该假设行是按照它们插入的顺序存储的。)

    更多细节:我认为link_id 将是一个介于1 和9 之间的数字,以便user_id 和link_id 一起唯一标识链接表中的一行。我认为这不能通过自动增量实现,但我不知道 mysql。当您从表中选择时,它将类似于“SELECT url FROM links WHERE user_id = 3 ORDER BY link_id”;这将使链接保持正确的顺序。提交表单时,我认为您会根据字段编号确定 link_id 的值。假设您的环境有办法确定受 SQL 操作影响的行数,我建议您尝试像“UPDATE links SET url = 'newvalue' WHERE user_id = 3 AND link_id = 4”这样的更新,然后如果报告 0 行已更新,而是执行 INSERT。

    附:我知道你说这是一个学习项目,但随着你的深入,请阅读 SQL 注入以及如何避免它!

    【讨论】:

    • 我希望 link_id 成为 auto_increment,是吗?当我的 user_id 是 auto_increment 时,我该怎么做?当我尝试将 link_id 添加为 auto_increment 时,mysql 报告“表定义不正确;只能有一个自动列,并且必须将其定义为键”。
    • 我最终将使用 mysql_real_escape_string,我现在只专注于让基础工作。
    【解决方案2】:

    我能想到的最简单的方法就是把你的html改成这样的

    <input type="text" name="link1" value="www.yahoo.com">  
    <input type="hidden" name="oldlink1" value="www.yahoo.com">  
    <input type="text" name="link2" value="">  
    <input type="hidden" name="oldlink2" value=""> 
    

    然后当您阅读它时检查隐藏元素是否为空白,如果是则插入,如果不使用更新语句中的值

    UPDATE table_name SET linkurl='www.mynewlink.com' 
    WHERE linkurl='www.yahoo.com' and user_id=1
    

    【讨论】:

      【解决方案3】:

      所以我可能会删除用户的所有现有条目,然后重新填充它们:

      $query = "DELETE FROM links WHERE user_id = {$_SESSION['user_id']}";
      foreach ($i = 1; $i < 10; $i++) {
        if (!empty($_POST['link' . $i])) {
          $query = "INSERT INTO links (user_id, linkurl) VALUES ({$_SESSION['user_id']}, '" . $_POST['link' . $i] . "')";
        }
      }
      

      【讨论】:

      • 如果发生错误并且插入无法运行(因为它不是事务),这是否有可能删除数据库中的所有用户链接?
      • 我建议将其放入事务中,并验证 $_SESSION['user_id'] 是一个整数。
      • 您的会话用户 ID 应该已经过验证 - 在页面加载时。如果它无效,您应该终止会话并将“用户”踢出去。
      • 我运行了上面的代码,它删除了我所有的用户链接,哈哈。从未制作过插件。请注意,我确实稍微更改了上面的代码...首先,将其设为 for 循环,然后使用 $link{$i} 而不是 $_POST['link' 。 $i] 因为我正在清理/清理 $_POST 并分配给 $linkX
      • $query = "从链接中删除 user_id = {$_SESSION['user_id']}"; for ($i = 1; $i
      【解决方案4】:

      我建议向表中添加一个唯一的行标识符(例如 SQL Server 中的标识列),并使用它来决定要更新哪些记录。没有行标识符的操作必然是插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多