使用nextval

时间:2018-11-18 17:16:17

标签: php postgresql

我用.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行:INSERT   转换为ec_account值('nextval('ec_account_id')','f ...

                                ^

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

1 个答案:

答案 0 :(得分: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的另一个说明是,当您将列定义为“ serial”类型时,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