我有一个 PHP 脚本,它在 Postgres DB 中插入一行。它在我的测试服务器(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 查询结果为真但没有插入行时,这意味着什么?可能是什么问题,我该如何解决这个问题?
编辑
我可以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);
?>