插入查询不会将数据添加到我的数据库。我的语法错了吗?

时间:2011-11-01 04:25:30

标签: php mysql sql mysql-error-1064

我正在尝试为用户添加到其个人资料中的每个链接分配一个递增的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)
           )");

3 个答案:

答案 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值更新它的排序字段。
  • 当我们必须交换2行时 - 只需交换它的排序值。

这是一个代码,非常难看,但是要给你一个想法:

$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 intoselect。您需要执行以下操作:

INSERT INTO your_table (col, col, col)
values
Select  '".$_SESSION['id']."',  '".md5($_GET['url'])."',MAX(posid)+1
from userlinks
WHERE id='".$_SESSION['id']."')

显然,上面的查询也不正确,你需要确保正确地连接你的字符串。目的是为您提供查询的正确结构