2012-09-04 5 views
0

Postgres DB에 행을 삽입하는 PHP 스크립트가 있습니다. 내 테스트 서버 (Postgres 9.1)에서는 제대로 작동하지만 새로운 공유 호스트에서는 실패합니다 (Postgres 8.4).pg_send_query_params는 TRUE를 반환하지만 실패 함

$query = "INSERT INTO " . $table . " VALUES (DEFAULT, $1, $2, CURRENT_TIMESTAMP::TIMESTAMP(0), $3, $4, ST_Point($4, $3))"; 
$result = pg_send_query_params($dbconn, $query, array($is_happy, $rate, $lat, $lon)); 

$result은 항상 TRUE이지만 행은 삽입되지 않습니다.

나는 또한 시도 :

$result = pg_get_result($dbconn); 

그러나 동일한 동작을 경험했다. 나는 또한 모두 시도 아래 CraigRinger의 거래 제안 @ 다음

: 여전히

$query = "BEGIN;INSERT INTO " . $table . " VALUES (DEFAULT, $1, $2, CURRENT_TIMESTAMP::TIMESTAMP(0), $3, $4, ST_Point($4, $3));COMMIT;"; 
$result = pg_send_query_params($dbconn, $query, array($is_happy, $rate, $lat, $lon)); 

pg_send_query($dbconn, "BEGIN;"); 
$query = "INSERT INTO " . $table . " VALUES (DEFAULT, $1, $2, CURRENT_TIMESTAMP::TIMESTAMP(0), $3, $4, ST_Point($4, $3));"; 
$result = pg_send_query_params($dbconn, $query, array($is_happy, $rate, $lat, $lon)); 
pg_send_query($dbconn, "COMMIT;"); 

와 같은 동작을 얻었다.

phpPgAdmin에서 INSERT 쿼리를 실행하면 행이 삽입됩니다. 나는 또한 PHP 스크립트에서이 쿼리의 결과를 얻을 수 있어요 : 삽입 쿼리 결과가 참 있지만 행이 삽입되지 않은 경우

"SELECT relid FROM pg_stat_user_tables" 

이 무엇을 의미합니까? 무엇이 문제가 될 수 있으며 어떻게 해결할 수 있습니까?

편집

내가 할 수 phpPgAdmin를 사용 INSERT 행과 PHP 스크립트에서 다음 SELECT 이러한 행.

다음은 실패한 전체 PHP 스크립트입니다 (완전한 전체 스크립트에있는 POST 수집 및 유효성 검사가 제거되었습니다). rest.php 스크립트는 연결 vars와 응답 기능 만 보유합니다. 이 rest.php 스크립트는 내 SELECT 스크립트로 작동합니다

<?php 
require "KLogger.php"; 
require "rest.php"; 

ini_set("error_reporting", E_ALL^E_NOTICE); 
ini_set("display_errors", 0); 
ini_set("log_errors", 1); 

$log = KLogger::instance(dirname(__FILE__), KLogger::DEBUG); 
$log_id = "AM".time(); 
$log->logInfo($log_id . " *** " . $_SERVER['REMOTE_ADDR']); 

$lat = '51.510199'; 
$lon = '-0.129654'; 
$rate = '10'; 
$is_happy = 't'; 

$dbconn = pg_connect("host=" . $host . " dbname=" . $db . " user=" . $user . " password=" . $pw); 
if(!$dbconn) 
{ 
    $log->logInfo($log_id . " No connection: " . pg_last_error()); 
    sendResponse(500, "Internal Server Error"); 
} 
else 
{ 
    $query = "INSERT INTO " . $table . " VALUES (DEFAULT, $1, $2, CURRENT_TIMESTAMP::TIMESTAMP(0), $3, $4, ST_Point($4, $3));"; 
    $result = pg_send_query_params($dbconn, $query, array($is_happy, $rate, $lat, $lon)); 
    if(!$result) 
    { 
     $log->logInfo($log_id . " No Result: " . pg_last_error()); 
     sendResponse(500, "Internal Server Error"); 
    } 
    else 
    { 
     $log->logInfo($log_id . " sendResponse(200)"); 
     sendResponse(200, "OK"); 
    } 
} 
pg_close($dbconn); 
?> 
+0

"행이 삽입되지 않았습니다." –

+0

@CraigRinger : phpPgAdmin으로 테이블을 탐색 중입니다. – Polly

+0

그래서 phpPgAdmin에 문제가없는 것은 무엇입니까? 'psql'에서'SELECT'을 시도 했습니까? 동일한 데이터베이스에 연결한다는 것이 확실합니까? –

답변

2

문제의이 종류의 가장 일반적인 원인은 개방형 uncomitted 거래입니다.

BEGIN (또는 암시 적으로 데이터베이스 드라이버에서 자동 커밋을 해제하여) 작업을 수행 한 트랜잭션 만 COMMIT까지 변경 사항을 볼 수 있습니다.

그런 경우 동일한 연결을 사용하여 동일한 스크립트 내에서 즉시 후속 쿼리에 변경된 행이 표시되지만 그 밖의 것은 없습니다.

또한 가능하여이를 확인할 수 있습니다 :

log_statement = 'all' 
log_line_prefix = 'db=%d pid=%p vtxid=%v txid=%x' 

및 가상 트랜잭션 BEGIN와 아이디 (vtxid)없이 COMMIT 일치를 찾아 일치하지 않는 트랜잭션을 발견.

postgresql.conf을 공유 호스팅으로 수정할 수없는 경우 ALTER USER myuser SET log_statement = 'all'; 또는 ALTER DATABASE mydatabase SET log_statement = 'all'; 수 있어야합니다.log_line_prefixpostgresql.conf 외부로 설정할 수는 없지만 호스트가 이미 적절한 설정을 가지고있을 수 있습니다. 버전 차이에 의해 설명 될 수있는 한 - -


또 다른 가능성

은 9.1에서만 사용할 수있는 기능을 사용하여 트랜잭션에 나중에 오류를 유발하고, 당신은 그 오류를 감지하지 않는 것입니다 . 이전 INSERT이 성공했지만 이후의 명령문이 실패 할 때 전체 트랜잭션이 롤백됩니다. 다시 한 번 보려는 서버 로그를 검사하십시오.


또 다른 일반적인 원인은 삽입 여부를 테스트 할 때 연결하는 스크립트가 아닌 다른 데이터베이스에 연결하고 있다는 것입니다. SELECT 삽입 후 스크립트에서 삽입 된 것으로 예상되는 행을 시도하십시오. 또한 관리 도구 (귀하의 경우에는 phpPgAdmin 인 것처럼 보임)를 통해 더미 테이블을 생성 한 다음 스크립트가 더미 테이블을 볼 수 있는지 테스트 할 가치가 있습니다.

+0

나는'postgresql.conf'에 접근 할 수 없습니다. phpPgAdmin에서 ALTER 문을 실행하면 'Permission Denied'가 발생합니다. 트랜잭션에서 INSERT 문을 래핑하려고했으나 변경 사항이 없습니다 (자세한 내용은 수정 된 질문 참조). phpPgAdmin에서 SQL INSERT 문을 실행하면 작동합니다. INSERT는 PHP 스크립트의 유일한 SQL입니다. 제발 다른 제안있어? – Polly

+0

@Polly 앞에서 말했듯이,'INSERT' 다음에'SELECT'을 시도해 보면 그 스크립트의 실행이 삽입 된 직후에 새로운 데이터를 볼 수 있는지 알 수 있습니다. 'permission denied'에 관해서는 데이터베이스 소유자 (데이터베이스 레벨 사용자) 또는 수퍼 유저 또는 사용자 (사용자 레벨 사용자)로 실행하지 않는다고 추측합니다 –

+0

@Polly 또한 : ** 당신은 당신의 스크립트와 당신의 테스트를 가지고 다른 데이터베이스에 연결할 수 있습니까? ** 업데이트 된 답변을보십시오. –

관련 문제