2013-07-13 76 views
1

我写一个基本的PHP注册脚本与以下数据库:PHP脚本没有插入PG数据库

DROP TABLE IF EXISTS authentication; 
CREATE TABLE authentication (
    userID SERIAL UNIQUE REFERENCES users(userID), 
    eMail TEXT PRIMARY KEY REFERENCES users(eMail), 
    passwordSalt TEXT, 
    hashedSalt TEXT, 
    saltText TEXT, 
    securityAnswer1 TEXT, 
    securityAnswer2 TEXT, 
    securityAnswer3 TEXT 
); 

和下面的注册脚本:

<?php 
    include 'https.php'; 

    //Create a connection to the database. If the connection fails, kill the 
    //process and issue an error message 
    $conn = pg_connect("host=localhost user=myusername password=mypassword dbname=mydatabase"); 
    if (!$conn) { 
    die("Failed to connect to database."); 
    } 

    //If the register button is pressed.. 
    if (isset($_POST['submit'])) { 
    //Check to make sure password+confirmation match. If not, error out. 
    if ($_POST['password'] != $_POST['confirm-password']) { 
     echo 'ERROR: passwords do not match<br />'; 
     echo 'Return to <a href="registration.php">registration</a> page.<br />'; 
     break; 
    } 

    //Then check to make sure the username doesn't already exist in the DB. 
    $result = pg_prepare($conn, "duplicateUser", 'SELECT username FROM mydatabase.users WHERE username = $1'); 
    $result = pg_execute($conn, "duplicateUser", array($_POST['username'])); 
    $row = pg_fetch_assoc($result); 

    //If it already exists, set match to true. 
    foreach ($row as $res) { 
     if ($res == $_POST['username']) 
     $match = true; 
    } 

    //If match is true, error out. 
    if ($match == true) { 
     echo 'ERROR: username already in use<br />'; 
     echo 'Return to <a href="registration.php">registration</a> page.<br />'; 
     $match = false; 
     break; 
    } 
    } 
?> 

<html> 
<head> 
<title>Registration page</title> 
</head> 
<body> 
<form method='POST' action='registration.php'> 
Username (e-mail): <input type='text' name='username' /><br /> 
Password: <input type='password' name='password' /><br /> 
Confirm password: <input type='password' name='confirm-password' /><br /> 
<input type='submit' name='submit' value='Register' /><br /> 
</form> 
Return to <a href='index.php'>login</a> page.<br /> 

</body> 
</html> 

<?php 

    //If the registration button is pressed.. 
    if (isset($_POST['submit'])) { 
    //Take the username and password, salt the password using an SHA1 
    //encryption of a random number, concatenate the password to the 
    //beginning of the salt, then save the SHA1 of that concatenation 
    //as the hashed and salted password. 
    $username = $_POST['username']; 
    $confirmusername = $_POST['confirm-username']; 
    $password = $_POST['password']; 
    $confirmpassword = $_POST['confirm-password']; 
    if ($username != $confirmusername) 
     echo "Please make sure your username is consistent."; 
    if ($password != $confirmpassword) 
     echo "Please make sure your passwords match."; 

    $salt = sha1(rand()); 
    $saltedPass = $password.$salt; 
    $hashedSalt = sha1($saltedPass); 

    //Store the username, hashed+salted password, and salt in the 
    //authentication table. 
    $result = pg_prepare($conn, "authentication", 'INSERT INTO mydatabase.authentication VALUES ($1, $2, $3)'); 
    $result = pg_execute($conn, "authentication", array($username, $salt, $hashedSalt)); 

    //Start the session, set the $_SESSION variables loggedin to true and 
    //username to the supplied username, then redirect to index.php 
    session_start(); 
    $_SESSION['loggedin'] = true; 
    $_SESSION['username'] = $username; 
    header("Location: index.php"); 
    } 
?> 

但是,当我得到phpPgAdmin的,行尚未被插入到数据库中。有任何想法吗?

谢谢。

+2

您需要为要插入的列命名。类似于'INSERT INTO mydatabase.authentication(col1,col2,col3)VALUES($ 1,$ 2,$ 3)' –

回答

1

首先想到的是您需要显式提交事务。 This answer似乎证实了Postgres没有自动提交。

+0

我在pg_prepare语句中显式声明了列(email,hashedSalt,saltText),但它仍未发布到数据库。 如何使用pg_prepare和pg_execute提交事务?我认为pg_execute照顾了通信? – neilthawani

+0

'pg_query('COMMIT')'。我想'pg_execute('COMMIT')'也可以。关于是否有任何方法自动提交,文档不是很清楚,但似乎并不像其中的任何方法。 –

+0

这是postgres中不存在的自动提交的概念。无论是你开始一个事务,你必须提交它,或者你不开始一个事务,显然你不必提交它。上面的php代码不会启动任何事务,所以不需要提交。 –

1

代码应测试pg_preparepg_execute的结果,并显示或记录pg_last_error()错误。否则,你会遇到任何问题。

另外,由于它连接到一个名为mydatabase的数据库并引用表为mydatabase.tablename,因此可以合理地怀疑您正在应用这种将数据库名添加到表名中的MySQL事物。它不适用于Postgres。 MySQL的数据库相当于PostgreSQL中的模式。

所以,除非你明确地创建了一个名为mydatabase一个Postgres模式,尝试不使用任何前缀:

INSERT INTO authentication VALUES ($1, $2, $3) 

这也适用于以前的SELECT这可能失败出于同样的原因,也没有错误检查。

+0

是的,那也行不通。我的问题是,这对我在课堂上提交的家庭作业很顺利...... – neilthawani