2016-04-14 4 views
4

Вот мой код:INSERT INTO, дублирование KEY, где ошибка синтаксиса

INSERT INTO drivers (name, comments, start_time, end_time) 
    VALUES ('$name', '$comment', '$start', '$end') 
    ON DUPLICATE KEY UPDATE comments='$comment', start_time='$start', end_time='$end' 
    WHERE name='$name' 

Я тогда получаю эту ошибку:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE name=''' at line 1

Вот код формы, который подчиняющееся это SQL заявление:

<form *posting to seperate submit page*> 
    <table> 
    <tr> 
     <td>Driver:</td> 
     <td class=results> 
     <select name="name"> 
      <option value="">Pick one...</option> 
      <?php 

      $results2=mysqli_query($con,"SELECT id, name FROM drivers"); 
      if (!$results2) { 
       die('Error2: ' . mysqli_error($con)); 
      } 

      while($row = mysqli_fetch_array($results2)) { 
       echo "<option value='".$row['id']."'>".$row['name']."</option>"; 
      } 

      ?> 
     </select> 
     </td> 
    </tr> 
    <tr> 
     <td>Driver not in dropdown. Type name here:</td> 
     <td class="results"> 
     <textarea name="name" rows="1" cols="30" placeholder="Driver name"></textarea> 
     </td> 
    <tr> 
     <td>Start time:</td> 
     <td class="results"> 
     <textarea name="start" rows="1" cols="10" placeholder="Start time"></textarea> 
     </td> 
    </tr> 
    <tr> 
     <td>End time:</td> 
     <td class="results"> 
     <textarea name="end" rows="1" cols="10" placeholder="End time"></textarea> 
     </td> 
    </tr> 
    <tr> 
     <td>Comment:</td> 
     <td class="results"> 
     <textarea name="comment" rows="3" cols="50" placeholder="Comment - Optional"></textarea> 
     </td> 
    </tr>    
    <tr> 
     <td><input type="submit" value="Submit" /></td> 
    </tr> 
    </table> 
</form> 

И для ясности, здесь база данных создать таблицу заявление:

| drivers | CREATE TABLE `drivers` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL DEFAULT '', 
    `comments` varchar(255) DEFAULT NULL, 
    `start_time` time NOT NULL, 
    `end_time` time NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 | 

Я попытался получить идентификатор для отправки через скрытый ввод в форме, однако, поскольку я выбираю имя из выпадающего списка, он также не будет передавать идентификатор, потому что вы не знаете, какая запись в выпадающем меню это будет до тех пор, пока я не догадался.

EDIT Я попытался без предложения WHERE до и в конечном итоге с этим в базе данных:

+----+-------+----------+------------+----------+ 
| id | name | comments | start_time | end_time | 
+----+-------+----------+------------+----------+ 
| 1 | Steve | test 7 | 09:14:00 | 22:00:00 | 
| 2 |  | test 10 | 09:30:00 | 21:00:00 | 
+----+-------+----------+------------+----------+ 

Вторая строка является «обновление» к предыдущей записи, однако он только добавил новый поэтому я получил предложение WHERE.

+0

Я думаю, что вам не нужно использовать предложение where, MySQL знает, какую строку вы хотите отредактировать, это тот, который дублируется –

+0

$ sql = "INSERT INTO драйверы (имя, комментарии, start_time, end_time) VALUES ('. $ name. "', '". $ comment. "', '". $ start. "', '". $ end. "') ON DUPLICATE KEY UPDATE comments = '". $ comment. "' , start_time = '". $ start."', end_time = '". $ end."' "; –

+0

Перейти к статье о SQL-инъекции. – CodeCaster

ответ

4

Удалить WHERE name='$name' из вашего запроса, так как он автоматически обновит повторяющийся индекс.

Таким образом, ваш обновленный запрос будет:

INSERT INTO drivers (name, comments, start_time, end_time) 
    VALUES ('$name', '$comment', '$start', '$end') 
    ON DUPLICATE KEY UPDATE comments='$comment', start_time='$start', end_time='$end' 

ПРИМЕЧАНИЯ: Кроме того, убедитесь вы спасаясь переменным, прежде чем положить их в запросе, как это может привести к взломам и другим вопросам.

+0

спасибо, однако, когда я делаю это, в нижней базе данных появляется следующее: (извините ... я нажал enter ....) –

+0

'+ ---- + ------- + ------ ---- + ------------ + ---------- + | id | имя | комментарии | start_time | end_time | + ---- + ------- + ---------- + ------------ + ---------- + | 1 | Стив | тест 7 | 09:14:00 | 22:00:00 | | 2 | | тест 10 | 09:30:00 | 21:00:00 | + ---- + ------- + ---------- + ------------ + ---------- + 'Он оставляет поле имени пустым –

+1

@james_jimjam В обновлении вы не устанавливаете новое имя, поэтому, если оно пустое, оно останется пустым. – Justinas

0

Выберите, а textarea имеет то же имя -> имя.

+0

Да, это так, что я могу либо обновить данные драйвера, либо добавить новый драйвер в той же форме. Я был уверен, что это сработает, но это проблема, с которой я столкнулся. –

0

Плохая новость заключается в том, что это не сработает, поскольку MySQL не разрешает предложения WHERE в части обновления запроса.

Remove и где он будет работать ...

INSERT INTO drivers (name, comments, start_time, end_time) VALUES ('$name', '$comment', '$start', '$end') ON DUPLICATE KEY UPDATE comments='$comment', start_time='$start', end_time='$end' 
0

WHERE не требуется, и не имеет смысла для INSERT запроса. WHERE используется для ссылки (нахождения) местоположений в базе данных, которые существуют, но INSERT запросов добавляют новые данные, поэтому использование WHERE не имеет смысла.

Здесь вы используете синтаксис ON DUPLICATE KEY UPDATE, который автоматически обновляет строку с помощью дубликата ключа. Поскольку БД знает, какое значение для предоставленного ключевого столбца, предложение WHERE неявно. Очевидно, что система будет UPDATE новыми значениями в вашем DB WHERE, столбец ключей равен значению, которое вы пытались сделать INSERT.

Взглянув на определение таблицы drivers, ваш единственный ключ в таблице - это столбец первичного ключа с именем id, и это автоинкрементный столбец.Поскольку ваш запрос INSERT никогда не пытается вставить новое значение для id, значение ключевого столбца id будет генерироваться автоматически, а предложение ON DUPLICATE KEY всегда бесполезно.

Конечно, MySQL DB сообщает вам об ошибке в вашем синтаксисе, потому что WHERE не используется с запросом INSERT. Это просто сломанный запрос, но у вас также есть логическая проблема, о которой я говорил выше. Чтобы все упростить, вы должны просто использовать это:

INSERT INTO drivers (name, comments, start_time, end_time) VALUES ('$name', '$comment', '$start', '$end'); 

Он будет работать каждый раз, до тех пор, пока ваши значения приведены в правильных форматах (VARCHAR, VARCHAR, время и время).