2017-02-06 1 views
0

Я только недавно начал изучать базы данных в колледже в конце прошлого года и пытался узнать немного больше в свое время.
Мне посоветовали попробовать PostgreSQL на прошлой неделе и поразили кирпичную стену, пытаясь автоматически увеличивать идентификатор учетной записи до базы данных.PostgreSQL Auto Increment Вставить в PHP 7 Проблема

Система предназначена для автоматического добавления нового уникального идентификатора в таблицу учетных записей в строке «a_pid» при добавлении в форму POST электронной почты, имени пользователя и пароля.

Текущее сообщение об ошибке

Warning: pg_query(): Query failed: ERROR: column "email" does not exist LINE 1: ...NTO account (a_pid, email, username, pwd) VALUES ([email protected]^HINT: There is a column named "email" in table "account", but it cannot be referenced from this part of the query.


DDL

create table account (
    a_pid serial primary key, 
    email varchar (64), 
    username varchar (16), 
    pwd varchar (32) 
); 

DDL Вставка данных

Insert into account (a_pid,email,username,pwd) values (0,'[email protected]','Zero','12345678'); 
Insert into account (a_pid,email,username,pwd) values (1,'[email protected]','One','password123'); 
Insert into account (a_pid,email,username,pwd) values (2,'[email protected]','Two','[email protected]'); 

Форма "index.php"

<form name="signup" action="sign-up.php" method="post"> 
    Email <input name="email" type="text" maxlength="64" value="Please enter your email" onfocus="(this.value == 'Please enter your email') && (this.value = '')" onblur="(this.value == '') && (this.value = 'Please enter your email')"><br/> 
    Verify Email <input name="vf_email" type="text" maxlength="64" value="Please enter your email" onfocus="(this.value == 'Please enter your email') && (this.value = '')" onblur="(this.value == '') && (this.value = 'Please enter your email')"><br/> 
    Username: <input name="username" type="text" maxlength="16" value="username" onfocus="(this.value == 'username) && (this.value = '')" onblur="(this.value == '') && (this.value = 'username')"><br/> 
    Password: <input name="pwd" type="password" minlength="8" maxlength="32"><br/> 
    Password: <input name="vf_pwd" type="password" minlength="8" maxlength="32"><br/> 

    <input type="submit" value="Sign up"> 
</form> 

PHP Вставить "знак-up.php"

<?php 
$conn = "host=localhost port=5432 dbname=sql_account user=postgres password=databaseconnect"; 
$dbconn = pg_connect($conn); 

$email = pg_escape_string($_POST['email']); 
$username = pg_escape_string($_POST['username']); 
$pwd = pg_escape_string($_POST['pwd']); 

$query = "INSERT INTO account (a_pid, email, username, pwd) VALUES (". $email .", ". $username .", ". $pwd ."); 
SELECT currval(pg_get_serial_sequence('account','a_pid'))"; 

$result = pg_query($query); 
?> 
+0

Проверьте сообщение, он говорит что-то не так близко к «)», и в 'Три, 123,),' вы можете видеть, что у вас есть одна дополнительная запятая после «123», но нет нового значения. Удалите это и повторите попытку – Acapulco

+1

(1) Я считаю, что postgresql требует, чтобы строковые литералы цитировались, то есть '' email-0 @ example.com'', но вы не указали их в своем коде -> 'VALUES (". $ Email. ", ...' должно быть 'VALUES ('". $ email. "', ...'. (2) вы указываете 'a_pid' в своих столбцах' (a_pid, email, username, pwd) ', но не в ваши значения. Либо удалите его, либо добавьте «null» перед вашим письмом -> «VALUES (null, '». $ email. ", ...". (3) как было упомянуто, удалите последние ',' . (4) Я сомневаюсь, что 'pg_query()' разрешает несколько запросов, поэтому вам нужно будет удалить 'SELECT ...' – Sean

+0

@Acapulco удалено 1 ошибка получена еще ... Предупреждение: pg_query(): запрос не выполнен: ERROR : столбец «email» не существует. LINE 1: ... учетная запись NTO (a_pid, email, username, pwd). VALUES (email-3 @ ex ...^ СОВЕТ. В таблице «учетная запись» есть столбец с именем «email», но на эту ссылку нельзя ссылаться. –

ответ

0

Посмотрите на сообщение об ошибке вы получаете - это не что-нибудь делать с вашими автоматически увеличивающимися идентификаторами последовательности. Как говорит @ titan-studios, в вашей структуре БД отсутствует поле email.

Именно в сторону, вы не уточняя действительное значение для a_pid поля в VALUES части вашего SQL - вы указываете a_pid, email, username, pwd поля, но только дают $email, $username, $pwd значения.

Почему бы не позволить Postgres выполнять работу за вас и не указывать поле id вообще? Определение поля как serial автоматически установит значение по умолчанию для следующего значения последовательности.

https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

Кроме того, я бы сильно предлагаю смотреть на параметризованных подготовленных запросов вместо конкатенации: http://php.net/manual/en/function.pg-prepare.php

$query = "INSERT INTO account (email, username, pwd) VALUES ($1, $2, $3);