1

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

我有一个“编辑”页面,该页面由数据库填充并列出最多 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……这些输入似乎没有出现在我的问题中,即使它们出现在我的预览中。

我的链接表只有 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']}";
4

4 回答 4

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
于 2009-01-09T18:46:21.017 回答
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。

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

于 2009-01-09T18:44:54.543 回答
0

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

$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] . "')";
  }
}
于 2009-01-09T18:46:37.787 回答
-1

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

于 2009-01-09T19:23:48.820 回答