有谁能告诉我如何防止这个PHP代码替换两个值?
$sql2="UPDATE users SET urls = replace(urls, 'http://someurl.com', '') WHERE uname='$username'";
$result2=mysql_query($sql2);
例如,字段“urls”包含:
使用上面的代码会移除这两个网址,只留下“/page.html” 我如何确保它只删除值,不删除任何其他内容。
答案 0 :(得分:1)
您好 为什么不在where子句中全部完成呢?
UPDATE users SET urls='' where urls='http://someurl.com' and uname='$username'
或者
UPDATE users SET urls='' where urls not like '%.html' and uname='$username'
我相信你可以根据自己的具体要求制定出一些东西
答案 1 :(得分:1)
抱歉,...... @jamesKG - 假设joeys示例你的代码什么都不会更新, @Widor - 这是非常特别的,只有在要替换的url位于第一行时才有效。
乔伊,基本上不建议在一个领域持有多个值......不必说。现在你知道了自己:-) 无论如何,假设您现有的数据结构更好地首先获取网址内容,请在PHP中以您喜欢的方式替换它,然后使用您的结果更新网址。这应该比SQL容易得多,尽管我是使用数据库功能的粉丝。 使用PHP,您可以将“\ r \ n”的网址分成单个项目并单独处理每个项目。
不要担心额外的数据库访问(如果有用户名的索引)。
答案 2 :(得分:0)
如果该字段实际上包含这两个网址之间的换行符,那么您可以执行类似
的操作 $sql2="UPDATE users SET urls = replace(urls, 'http://someurl.com\r\n', '') WHERE uname='$username'";
对于只有一个网址的记录,您可以在WHERE
子句中执行此操作:
WHERE urls='http://someurl.com' and uname='$username'
答案 3 :(得分:0)
为您的更新子句添加“限制”。
UPDATE tbl
SET urls = replace(urls, 'http://someurl.com', '')
WHERE uname = $username
ORDER BY uname, urls
LIMIT n
如果您有可以更新多条记录的更新,但只需要修改一条记录,请使用此选项。
我使用ORDER BY作为安全网,以便您可以预测在尝试调试数据或代码时将更新哪条记录。
注意:此类问题通常是架构较弱的症状,即您的数据未正常规范或主键未充分定义。理想情况下,在where子句中使用主键将允许您为更新指定单个记录。
- J Jorgenson -