Relation * tablename *不存在

时间:2014-01-14 11:17:45

标签: php sql postgresql

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

我使用的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 ..

2 个答案:

答案 0 :(得分:2)

您显示的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 Injection - XKCD

您的查询遵循以下模式:

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

因此,是an SQL injection vulnerability的典型例子。

读:

答案 1 :(得分:0)

通过确保我在表名周围转义引号来解决。

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