繁体   English   中英

Relation * tablename *不存在

[英]Relation *tablename* does not exist

最近我收到一条错误消息,我不知道如何处理。 这很模糊。

我使用的PostgreSQL语句是:

    $result = pg_query($ruledbconnection, "INSERT INTO INPUT(num, pkts, bytes ,
    target,prot, opt, \"in\", out, source, destination, id) 
    VALUES('$num','$bytes','$pkts','$target', '$opt', '$protocol', '$in', '$out',
   '$source', '$destination', '$id')");

一切似乎都很好,对吧? 但是,当我使用变量执行此查询时:

ERROR: syntax error at or near "'INPUT'" LINE 1: INSERT INTO 'INPUT'(num, pkts, bytes ,
target, prot, opt, "i... ^

我已经坚持了一段时间,它可能是因为在PHP中逃脱,或者可能是别的什么?

我想要操作的表在我的数据库中称为INPUT。

您显示的SQL与错误不匹配。 SQL在表名周围没有引号,错误确实如此。

ERROR: syntax error at or near "'INPUT'" LINE 1: INSERT INTO 'INPUT'(num, pkts, bytes ,

所以。 单引号(撇号, ' )用于SQL ,而不是标识符 标识符引用双引号( " )。所以你写道:

INSERT INTO "INPUT" (...) VALUES (...)

请注意,引用表名称将保留大小写 所以,如果你在这里加倍引用它,你必须在引用它的任何地方引用它。 如果你只使用小写,你将保存你的理智:

INSERT INTO input (...) VALUES (...)

甚至更好,一个描述性的表名:

INSERT INTO packets_received (...) VALUES (...)

但是,您的语法错误是您遇到的最小问题。 让我向您介绍一个经典:

SQL注入 -  XKCD

您的查询遵循以下模式:

pg_query($conn, 'INSERT INTO sometable (col) VALUES ($user_input)')

因此,是SQL注入漏洞的典型示例。

读:

通过确保我逃脱表名周围的引号来解决。

"INSERT INTO INPUT (num, pkts, bytes , target, prot, opt, \"in\", out, source, destination, id)

应该:

"INSERT INTO \"INPUT\" (num, pkts, bytes , target, prot, opt, \"in\", out, source, destination, id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM