INSERT INTO,ON DUPLICATE KEY,WHERE语法错误

时间:2016-04-14 09:21:00

标签: php html mysql

这是我的代码:

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'

然后我收到此错误:

  

错误:您的SQL语法出错;检查与您的MySQL服务器版本对应的手册,以便在#< name&= 39;'''''''''''在第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 |

我试图通过表单上的隐藏输入来提交ID但是因为我从下拉列表中选择了名称,所以它也不会提交ID,因为您不知道下拉列表中的哪个条目直到提交我猜。

编辑我之前没有使用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 |
+----+-------+----------+------------+----------+

第二行是&#34;更新&#34;然而,它刚刚添加了一个新条目,因此为什么我有WHERE子句。

4 个答案:

答案 0 :(得分: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'

注意:还要确保在将变量放入查询之前转义变量,因为这可能会导致黑客攻击和其他问题。

答案 1 :(得分:0)

选择和textarea具有相同的名称 - &gt;名。

答案 2 :(得分:0)

坏消息是,这不起作用,因为MySQL不允许在查询的更新部分中使用WHERE子句。

删除哪里可以使用...

grep

答案 3 :(得分:0)

WHERE不是必需的,对INSERT查询没有意义。 WHERE用于引用(查找)数据库中存在的位置,但INSERT个查询会添加新数据,因此使用WHERE没有意义。

在这里,您使用ON DUPLICATE KEY UPDATE语法,该语法将使用重复键自动更新行。由于DB知道您提供的键列的值,因此WHERE子句是隐式的。显然,系统将UPDATE数据库中的新值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,time和time)给出,它就会一直有效。