出现错误“'字段列表'中的未知列'文本'”
Posted
技术标签:
【中文标题】出现错误“\'字段列表\'中的未知列\'文本\'”【英文标题】:Getting error "Unknown column 'text' in 'field list'"出现错误“'字段列表'中的未知列'文本'” 【发布时间】:2019-08-16 22:34:54 【问题描述】:我正在尝试将文本插入我的数据库表 reqviews
。但我收到错误消息:
Unknown column 'text' in 'field list'
。我不确定我的代码有什么问题。请帮忙
if (isset($_POST['combut']))
$rqvcom = $_POST['rqvcom'];
$rqid = (int)$_GET['rqid'];
$conn->query("
INSERT INTO reqviews (rqvrqid, rqvuserid, rqvcom, rqvdate)
SELECT $rqid, $sid, $rqvcom, NOW()
FROM requests
WHERE EXISTS (
SELECT rqid
FROM requests
WHERE rqid = $rqid)
AND NOT EXISTS (
SELECT rqvid
FROM reqviews
WHERE rqvuserid = $sid
AND rqvrqid = $rqid)
LIMIT 1
");
我的代码的作用:当在rqvcom
textarea 中输入一些文本时,该文本会被插入到reqviews
表的rqvcom
列中。如果reqviews
表上已存在具有rqvuserid
用户的行,则无法插入具有相同用户ID 的另一行。我的问题是我的代码给了我我提供的错误信息。
编辑:表reqviews
rqvid | rqvrqid | rqvuserid | rqvcom | rqvdate
表requests
rqid
【问题讨论】:
如果“text”是$rqvcom
的值,这行SELECT $rqid, $sid, $rqvcom, NOW()
会尝试选择列text
由于您要插入字符串,因此您必须在 SELECT
语句中对它们进行转义。小心 Sql 注入
这就是您收到错误的原因。您想使用$rqvcom
选择什么?
你确定没有事吗? :D 你正在插入字符串,所以你必须使用这样的东西: ...SELECT 'text', 'your value',
ecc ...如果你不使用'
字符mysql认为text
是列的名称。这就是您收到该错误的原因
@misner3456 是的。但是如果你在没有任何其他更新的情况下这样做,你很容易受到 Sql 注入
【参考方案1】:
SELECT $rqid, $sid, $rqvcom, NOW()
这将选择这些变量中的列名:
// let's say these are the values in your variables:
$rqid = "text";
$sid = "session123";
$rqvcom = "example";
// then this query:
SELECT $rqid, $sid, $rqvcom, NOW()
// is the same as:
SELECT text, session123, example, NOW()
这就是您收到该错误的原因。这不太可能是您想要的。我怀疑您实际上想要的是选择rqid
、sid
和rqvcom
列:
SELECT rqid, sid, rqvcom, NOW()
编辑:现在您已经添加了表格结构,您似乎更可能想要实际选择字符串值,在这种情况下,您需要将变量用引号括起来,例如 @Giacomo M 建议:
SELECT '$rqid', '$sid', '$rqvcom', NOW()
// which will become:
SELECT 'text', 'session123', 'example', NOW()
那么你的数据库就不会混淆字符串和列名了。
【讨论】:
但这些是我的表列名称 -(rqvrqid, rqvuserid, rqvcom, rqvdate)
在 insert
行中定义。幸运的是,您使用此方法的方法有效:SELECT '$rqid', '$sid', '$rqvcom', NOW()
,这使我可以将变量插入到我的表中。但是我留下了一个奇怪的错误,它总共插入了 6 行,而它应该只插入 1 行?
我不确定LIMIT 1
是否会被解释为 SELECT 的一部分或 INSERT 语句的一部分。那么,如果只执行查询的 SELECT 部分,它会返回多少行?这段代码有可能被多次执行吗?无论哪种方式,这是一个不同的问题,应该是一个单独的问题(如果你愿意,你可以链接到这个问题)。
@rickdenhaan 它将成为 SELECT 语句的一部分。 INSERT 没有 LIMIT 子句。
@rickdenhaan 我使用 Barmar 的代码解决了 6 行插入问题。但我也赞成你的,因为这也有助于解决我的问题 - 谢谢!【参考方案2】:
如果您尝试将$rqvcom
的值插入数据库,则需要将其放在引号中,因为它是一个字符串。否则,将其视为列名。
$conn->query("
INSERT INTO reqviews (rqvrqid, rqvuserid, rqvcom, rqvdate)
SELECT $rqid, $sid, '$rqvcom', NOW()
FROM requests
WHERE EXISTS (
SELECT rqid
FROM requests
WHERE rqid = $rqid)
AND NOT EXISTS (
SELECT rqvid
FROM reqviews
WHERE rqvuserid = $sid
AND rqvrqid = $rqid)
LIMIT 1
");
但是,这会使您容易受到 SQL 注入的影响,因此您应该使用准备好的语句。
$stmt = $conn->prepare("
INSERT INTO reqviews (rqvrqid, rqvuserid, rqvcom, rqvdate)
SELECT ?, ?, ?, NOW()
FROM requests
WHERE EXISTS (
SELECT rqid
FROM requests
WHERE rqid = ?)
AND NOT EXISTS (
SELECT rqvid
FROM reqviews
WHERE rqvuserid = ?
AND rqvrqid = ?)
LIMIT 1
");
$stmt->bind_param("iisiii", $rqid, $sid, $rqvcom, $rqid, $sid, $rqid);
$stmt->execute();
【讨论】:
是的 - 这解决了一切!哇-您永远不会不为答案提供确切的解决方案,并包含超出要求的内容,非常感谢您!我试图同时弄清楚如何将其变成准备好的声明,但不确定如何。谢天谢地,你能够做到这一点,我明白 Giacomo 说现在用引号括起 rqvcom 是什么意思。真的,我非常感谢您的帮助,谢谢!以上是关于出现错误“'字段列表'中的未知列'文本'”的主要内容,如果未能解决你的问题,请参考以下文章
HandsonTable 中的 \9 是啥?构建失败并出现语法错误