2017-10-20 117 views
0

我有一個設置使用Apache24,php環境和postgresql數據庫。 我想填充數據庫表中的一些列(不是全部),但它不像我所期望的那樣工作。pg_query INSERT INTO無法正常工作

我碰到下面的錯誤/警告和db不填充: 警告:pg_query():查詢失敗:ERROR:語法錯誤或接近 「c329a92850f6d539dd376f4816ee2764517da5e0235514af433164480d7a」 LINE 1:......總之,鹽)VALUES(DEFAULT ,[email protected],per,8254c329a92850 ... ^在C:\ Users \ Public \ Server \ Apache24 \ htdocs \ eMe \ newuser.php上線34

對此的任何支持都非常感謝。尋找類似的問題,但不能解釋我的上下文中的答案

<?php 
# Registration form input to postgresql user table in myDB 
session_start(); 

# Retrieve data from input form 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 

# Concatenate and hash password with salt 
require_once(dirname(__DIR__).'\eMe\saltgenerator.php'); 
global $randString; 
#$randString = pg_escape_string($randString); 
$isalt = pg_escape_string($randString); 

$saltandpassword = $isalt. $password; 
$hashedpassword = hash('sha256', $saltandpassword, false); 

$username = pg_escape_string($username); 
$email = pg_escape_string($email); 
$hashedpassword= pg_escape_string($hashedpassword); 

# Insert data into Postgresql database 
# INSERT INTO table_name (column1, column2, column3 .....) VALUES (value1, value2, value3....) 
include_once(dirname(__DIR__).'\eMe\config.php'); 
$query = "INSERT INTO users (userid, mailaddress, username, userpassword, salt) VALUES (DEFAULT, $email, $username, $hashedpassword, $isalt)"; 
#$result = 
#pg_query_params($query); 
pg_query($query); 
?> 

我試圖包括引號和如link所述的反引號報價,但它不能解決問題。錯誤/警告略有不同,但:

警告:pg_query():查詢失敗:ERROR:語法錯誤或接近 「`」 LINE 1:INSERT INTO用戶(userid,`mailaddress`,`username`,`使用... ^在第30行的C:\ Users \ Public \ Server \ Apache24 \ htdocs \ eMe \ newuser.php上

+1

可能的重複[何時使用單引號,雙引號和反引號在MySQL](https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double- quotes -and-backticks-in-mysql) – aynber

+0

我真的推薦切換到PDO,它可以與pgsql進行交互。通過準備好的語句和參數綁定,您將永遠不必擔心引用問題,而且您不需要轉義您的值。 – aynber

+0

感謝您的意見。我看看我是否設法使用PDO。我覺得有點難以理解語法/設置 – om78

回答

0

您代碼中的唯一問題是您在編寫該代碼時沒有弄清楚:

$username = pg_escape_string($username); 

$username逃脫被注射,這是很好的,但是這將增加必要的引號的值,不在的值(更多請參閱Whats does pg_escape_string exactly do?)。

所以在查詢,報價需要圍繞文字文本除了值到逃逸的內容,如下面的:

$query = "INSERT INTO users (userid, mailaddress, username, userpassword, salt) 
      VALUES (DEFAULT, '$email', '$username', '$hashedpassword', '$isalt')"; 

(因爲在此查詢的變量已經過去了通過pg_escape_string

+0

嗨,感謝您的幫助,對於遲到的回覆感到抱歉。但是,我轉而使用PDO API,而不是遵循一些示例並使其以這種方式工作。 – om78