在语句中,无论字段中的所有值(变量)都没有接收到数据INSERT INTO
,都必须写入表的所有字段。VALUE
例子
$conexion->query( "INSERT INTO $ejemp (casa, color, estrato, barrio, carro) VALUES ('$casa','$color','$estrato','$calle','$carro')" );
该表有 5 个字段,但只有, ,ejemp
字段从表单接收数据。其他人没有。casa
color
estrato
问题是因为我在 Web 服务器上有一个数据库,并且我添加了 3 个新列,在我修改它之前,这些列INSERT INTO
没有插入任何数据,但是我有一个XAMPP
包含不存在字段的表,INSERT
它确实记录了发送。
自从我阅读以来,有人可以澄清这一点,但大多数文档都是英文的。
- -编辑 - -
红色字段(图片中的最后 3 个)不在 中INSERT
但不在 中VALUE
,也就是说,它有 23 个项目在其中INSERT
,23 个项目在 VALUE 中。我的意图是用另一个表格填充最后 3 个字段,UPDATE
在最后 3 个字段在表中之前,数据被插入,在不再附加这 3 列之后。我所做的就是把里面的值INSERT
和里面的变量写进去VALUE
,虽然它们没有收到数据,有INSERT
数据发送。
代码是这样的
$conexion->query( "INSERT INTO $tabla_db1 (submission_id, pedido, fecha, seleccionael6, valorfonendo, lodeseas, seleccionael25, totalart, abonofonendos, abonoaccesorios, envio, valorabono, fechalimite, total, nombre, documento, celular, correoelectronico, direccionde, ciudad, departamento, comentarios, texto_a) VALUES ('$id','$pedido','$fecha','$fonendo','$valor_fdo','$marcar','$articulo','$total_art','$abono_f','$abono_a','$envio','$abono','$limite','$total','$nombre','$doc','$cel','$mail','$dir','$city','$dpto','$info','$texto_a')" );
MySQL 文档对 type的查询进行了以下说明
INSERT INTO ...
:换句话说,第二个选项意味着您可以编写如下语句:
如您所见,列的列表没有出现在
VALUES
...的左侧,在这种情况下,必须按照它们在表中定义的顺序为每列提供一个值,根据类型传递该值表的列(varchar、int 等)。虽然可以这样做,但正常的做法是按照第一个选项中的说明构建我们的,即在我们要插入数据的列的名称左侧和值的右侧
INSERT
显式指示我们要插入的。VALUES
VALUES
要回答您的问题:
假设一个这样的表:
现在让我们看几个案例。
案例 1:一切正常……应该如此
如果您编写这样的查询以将数据插入上表:
必须将列的值和列的
nombre
另一个值apellido
传递给查询。这里在 SQL 语句中省略了该列documento
,但插入了数据,因为该列定义了一个默认值,它将在创建记录时假定该值。案例2:不太正常......但它有效
此查询会起作用,因为您输入的是
nombre
空白数据,这与 null 不同。案例3:不太正常,但它有效
它也有效,因为在这种情况下,该列
apellido
可以为空。案例 4:省略列表中指示的列的值
如果您编写这样的查询:
您将有权在 MySQL 中出现以下错误:
也就是说,您告诉我要在两列中输入数据,但您只给我一列的数据!.
案例 5:尝试在不可为空的列中输入空值
可能发生的另一件事是您尝试
NULL
在不可为空的列中输入空值。例如:在这里,您将有权收到以下错误:
如果你看到
CREATE TABLE
上面的那个你就会明白这个系统抗议的原因:)但是,在情况 2 中没有错误,因为输入了一个空白值,而不是 null,因为
NULL
和不一样。
案例6:忽略SQL语句中同时没有定义默认值的不可为空列
在以下查询中:
您将应得以下错误:
因为您从 SQL 语句中省略了
nombre
既不能为空也没有默认值的列。documento
您将看到在此语句和其他插入语句中省略的列没有发生同样的情况。为什么它对 没有任何要求,documento
并且对nombre
是 因为documento
它定义了默认值,所以当在任何语句中省略列时,创建的新行假定该值。VER DEMO DEL CÓDIGO
推荐
强烈建议在包括来自外部的数据的所有数据库处理中使用准备好的查询,因为发送整个查询,即整个指令所在的位置,是 SQL 注入的大门。准备好的查询所做的是将数据与 SQL 语句本身分开,使代码更安全,甚至更容易。
看看它:
这可能是因为在添加列时您允许空值,或者如果您不允许它们,则放置了默认值