Синтаксическая ошибка при вставке студентов в базу данных postgres через php с использованием nextval - PullRequest
0 голосов
/ 18 ноября 2018

Я создал базу данных с моим файлом .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-форму, и я хочу, чтобы идентификатор увеличивался автоматически, однако я не в состоянии вставить (через php) экземпляры в базу данных, когда я запускаю этот код, я получаю эту ошибку:

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

ОШИБКА: ОШИБКА: синтаксическая ошибка в или около "ec_account_id" LINE 1: ВСТАВИТЬ в значения ec_account ('nextval (' ec_account_id ')', 'f ...

                                ^

Я почти уверен, что это как-то связано со следующим значением, но я не знаю, как его решить. Кто-нибудь может меня уточнить? Я не хочу, чтобы мне приходилось запоминать, сколько людейуже зарегистрирован в таблице ec_account, и я подумал, что это был способ автоматического увеличения первичного ключа всякий раз, когда я вставляю новую строку.

1 Ответ

0 голосов
/ 18 ноября 2018

Похоже, вы совершили довольно простую ошибку:

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

Обратите внимание на вашу постороннюю одинарную кавычку перед следующим. Удалите это и закрывающий, который вы добавили, и все должно быть в порядке.

$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, но в любом случае вам следует использовать параметры для отправки ваших значений.

Вот ссылка на страницу pg_query_params , которая объясняет это.

Я бы порекомендовал лично использовать PDO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...