出现错误“'字段列表'中的未知列'文本'”

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()

这就是您收到该错误的原因。这不太可能是您想要的。我怀疑您实际上想要的是选择rqidsidrqvcom 列:

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 是什么意思。真的,我非常感谢您的帮助,谢谢!

以上是关于出现错误“'字段列表'中的未知列'文本'”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会出现分段错误?我正在尝试解决迷宫问题中的老鼠

Flutter中的Webview无法正常工作,出现平台错误

HandsonTable 中的 \9 是啥?构建失败并出现语法错误

为啥会出现“INSERT INTO 语句中的语法错误”?

iOS 中的 ExtAudioFileRead 出现错误代码 -50

使用来自 arduino 串行打印的数据更新 matlab 中的线图,为啥会出现“数组形状错误”错误?