最近我收到一条错误消息,我不知道如何处理。这很模糊。
我使用的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 ..
答案 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 (...)
但是,您的语法错误是您遇到的最少问题。让我向您介绍一个经典:
您的查询遵循以下模式:
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)