Запрос вставки не добавит данные в мою базу данных.У меня неправильный синтаксис? - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь назначить увеличенный идентификатор (posid) для каждой ссылки, которую пользователь добавляет в свой профиль, в зависимости от его идентификатора в таблице.Это то, что у меня есть, и это, кажется, не работает.Что случилось?У меня неправильный синтаксис?

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 ]

2 голосов
/ 01 ноября 2011

Если вы не собираетесь использовать подготовленные заявления или 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 с автоинкрементом .

Справка:

2 голосов
/ 01 ноября 2011

У меня неправильный синтаксис?

Определенно ДА.вы не обрабатываете ошибки.
Так что, если возникает ошибка, вы не имеете ни малейшего представления, что это такое.
хотя бы запустите ваши запросы таким образом и посмотрите, что с ними не так

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
- В PHP при отправке строк в базу данных я должен позаботиться о недопустимых символах с использованием htmlspecialchars() или использовать регулярное выражение?
- Как включить переменную PHP в оператор вставки MySQL

1 голос
/ 01 ноября 2011

Вы не можете объединить 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']."')

Очевидно, что вышеприведенный запрос также неверен, вам необходимо убедиться, что вы правильно связали свою строку. Намерение состоит в том, чтобы дать вам правильную структуру запроса

...