我正在尝试为用户添加到其个人资料中的每个链接分配一个递增的id(posid),特定于他们在表中的id。这就是我所拥有的,似乎并没有起作用。怎么了?我的语法错了吗?
mysql_query("INSERT INTO userlinks (id,hash,url,title,posid)
VALUES (
'".$_SESSION['id']."',
'".md5($_GET['url'])."',
'".$_GET['url']."',
'".$_GET['title']."',
SELECT(IFNULL(SELECT MAX(posid)+1 FROM userlinks
WHERE id='".$_SESSION['id']."'), 1)
)");
答案 0 :(得分:2)
如果您不打算使用预准备语句或PDO,请使用:
$query = sprintf("INSERT INTO userlinks
(id, hash, url, title, posid)
SELECT %s,
%s,
%s,
%s,
IFNULL(MAX(t.posid), 1)
FROM userlinks t
WHERE id = %s",
mysql_real_escape_string($_SESSION['id']),
MD5(mysql_real_escape_string($_SESSION['url'])),
mysql_real_escape_string($_GET['url']),
mysql_real_escape_string($_GET['title']),
mysql_real_escape_string($_SESSION['id']));
$result = mysql_query($query);
使用INSERT语句,不能将SELECT与VALUES关键字混合使用 - 一个或另一个,SELECT支持定义静态值。
其次,MAX(...) + 1
在多用户情况下不可靠 - 您应该使用MySQL autoincrement functionality。
答案 1 :(得分:2)
我的语法错了吗?
肯定是的。
你不做任何错误处理。
所以,如果发生错误,你就不知道它是什么了
至少以这种方式运行你的查询并自己看看它们有什么问题
mysql_query($query) or trigger_error(mysql_error()." ".$query);
此外,您的SELECT(IFNULL(SELECT MAX(posid)+1 FROM userlinks
子选择看起来很可疑,因为您似乎没有利用自动增量和竞争条件的危险。
另外,正如它已经提到的那样,你不会逃避你的字符串。
至于你的排序,我会做什么:
这是一个代码,非常难看,但是要给你一个想法:
$id = intval($_POST['move']);
$place = db("SELECT place FROM $table WHERE id=$id");
if (!$id OR !$place) return(error("id or place is not set"));
if (isset($_POST['up'])) {
$sort = db("SELECT sort FROM $table WHERE id=$id");
$sort2 = db("SELECT max(sort) as msort FROM $table WHEREsort < $sort");
if ($sort2) $id2=db("SELECT id FROM $table WHEREsort = $sort2");
}
if (isset($_POST['down'])) {
$sort = db("SELECT sort FROM $table WHERE id=$id");
$sort2 = db("SELECT min(sort) as msort FROM $table WHEREsort > $sort");
if ($sort2) $id2 = db("SELECT id FROM $table WHERE sort = $sort2");
}
if ($sort2) {
$q1 = "UPDATE $table SET sort=$sort2 WHERE id=$id";
$q2 = "UPDATE $table SET sort=$sort WHERE id=$id2";
db($q1);
db($q2);
}
至于清理数据,请参阅这些问题
- PHP secure user variable
- In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
- How to include a PHP variable inside a MySQL insert statement
答案 2 :(得分:1)
您无法按照自己的方式合并insert into
和select
。您需要执行以下操作:
INSERT INTO your_table (col, col, col)
values
Select '".$_SESSION['id']."', '".md5($_GET['url'])."',MAX(posid)+1
from userlinks
WHERE id='".$_SESSION['id']."')
显然,上面的查询也不正确,你需要确保正确地连接你的字符串。目的是为您提供查询的正确结构