2017-10-20 4 views
0

설치가 Apache24, php 환경 및 postgresql 데이터베이스가 있습니다. db 테이블에 값이있는 일부 열 (전부는 아님)을 채우려고하지만 예상대로 작동하지 않습니다.pg_query INSERT INTO not working

나는 오류/경고 및 DB 다음은 채워지지 않습니다 얻을 :) (pg_query : 경고를 쿼리 실패 : 오류 : 구문 오류 또는 근처 "c329a92850f6d539dd376f4816ee2764517da5e0235514af433164480d7a"LINE 1에 ... 단어, 소금) 가치 (DEFAULT , [email protected], per, 8254c329a92850 ...^C : \ Users \ Public \ Server \ Apache24 \ htdocs \ eMe \ newuser.php on line 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() : 쿼리 실패 : "또는"근처의 구문 오류 LINE 1 : INSERT INTO 사용자 (userid,`mailaddress`,`username`, ... 30 행의 C : \ Users \ Public \ Server \ Apache24 \ htmlocs \ eMe \ newuser.php

+1

[MySQL에서 작은 따옴표, 큰 따옴표 및 백틱을 사용하는 경우] 가능한 복제본 (https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes -and-backticks-in-mysql) – aynber

+0

pgsql과 상호 작용할 수있는 PDO로 전환하는 것이 좋습니다. . 준비된 문과 매개 변수 바인딩을 사용하면 따옴표 문제를 걱정할 필요가 없으며 값을 이스케이프 처리 할 필요가 없습니다. – 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