【问题标题】:Syntax Error while inserting students into postgres database via php using nextval使用 nextval 通过 php 将学生插入 postgres 数据库时出现语法错误
【发布时间】:2018-11-18 17:16:16
【问题描述】:

我用我的 .sql 文件创建了一个数据库:

CREATE SEQUENCE ec_account_id 
start 1
  increment 1;

create table ec_account
   (id          serial PRIMARY KEY,
    name        VARCHAR(40) not null,
    password    VARCHAR(80) not null,
    email       VARCHAR(30) not null,
    phone       VARCHAR(10) not null);


insert into ec_account values (nextval('ec_account_id'),'admin','68dc71d4b0724561008d7665a37d9f8bba008f95836c0caab9656d9f1983d314','123456@gmail.com','123456789');
insert into ec_account values (nextval('ec_account_id'),'dsds','cfb68d2dba58568ff9e223235ff1b77b3cb42c371403832a434112aabc','johnnsySilva@gmail.com','123456789');

我可以通过终端观看它(桌子)。检查html上的密码。一切进展顺利。但是现在我想通过 html 表单将新人员添加到数据库中,并且我希望 id 自动增加,但是我无法在数据库中插入(通过 php)实例,因为当我运行此代码时,我得到了这个错误:

$sql =  "INSERT into ec_account values ('nextval('ec_account_id')','$nome','$hashedPass','$email','$telemovel') ";

错误:错误:“ec_account_id”处或附近的语法错误第 1 行:插入 转换为 ec_account 值 ('nextval('ec_account_id')','f...

                                ^

我几乎可以肯定它与下一个 val 有关,但我不知道如何解决它。有人可以澄清一下吗?我不想承担必须记住已经在 ec_account 表中注册了多少人的责任,我认为这是每当我插入新行时自动递增主键的方法。

【问题讨论】:

  • 我认为您的nextval 不应被引用,它与数据库查询不匹配。我不知道postgresql,所以这是一个猜测。
  • PostgreSQL Autoincrement的可能重复

标签: php postgresql


【解决方案1】:

看来你犯了一个相当简单的错误:

$sql =  "INSERT into ec_account values ('nextval('ec_account_id')','$nome','$hashedPass','$email','$telemovel') ";

在 nextval 之前注意你多余的单引号。删除它和您添加的最后一个,一切都会好起来的。

$sql =  "INSERT into ec_account values (nextval('ec_account_id'),'$nome','$hashedPass','$email','$telemovel') ";

为了澄清,SQL 需要在字符串值周围加上引号。您不需要在传递的每个变量周围随机添加引号。

关于 Postgresql 的另一个说明是,当您将列定义为“串行”类型时,Postgresql 会为您创建一个名为 tablename_columname_seq 的序列。因此,当您可以使用 nextval('ec_account_id_seq') 并且不需要创建序列 ec_account_id 时,您冗余地创建了一个序列。

编写插入语句时,应避免使用速记方法并显式列出列。如果您需要执行不包含所有列的插入,或者如果您向表中添加会破坏现有插入语句的列,这可以避免以后出现问题。

固定:

$sql =  "INSERT into ec_account ('id', 'name', 'password', 'email', 'phone') 
values (nextval('ec_account_id'),'$nome','$hashedPass','$email','$telemovel')";

关于 SQL 注入、转义和参数的最后一句话:

这种使用 PHP 字符串插入值的技术容易出现许多问题,并在您的系统中造成漏洞。

我不知道您使用的是 pg api 还是 PDO,但无论哪种情况,您都应该使用参数来发送您的值。

a link to the pg_query_params page 解释了这一点。

我个人推荐using PDO

【讨论】:

  • 感谢您的回答。它解决了我的问题,我会研究一下
猜你喜欢
  • 2019-07-05
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多