Postgres DB に行を挿入する PHP スクリプトがあります。テスト サーバー (Postgres 9.1) では正常に動作しますが、新しい共有ホスト (Postgres 8.4) では失敗します。
$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"
INSERT クエリの結果が true であるのに行が挿入されない場合、これはどういう意味ですか? 何が問題であり、これを解決するにはどうすればよいですか?
編集
INSERT
phpPgAdmin を使用して行を作成SELECT
し、PHP スクリプトからこれらの行を作成できます。
失敗する完全な PHP スクリプトを次に示します (完全なスクリプトに存在する POST 収集と検証が取り除かれています)。スクリプトはrest.php
単に接続変数と応答関数を保持します。この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);
?>