1

我最近制作了一个 postgresql 数据库,但由于某种原因,我无法在其中制作表格。我是否可以从 php 脚本或终端创建它,我很好;但我搜索了很多地方,找不到任何有用的东西。我之前在 mysql 中做过很多工作,但 postgresql 恰好给我带来了问题。

我知道在我的 php 文件中我已正确连接到我的数据库,并且我已经运行了该脚本的多个版本,例如(在 pg_connect 之后插入):

$tsk1 = pg_query("
CREATE TABLE IF NOT EXISTS `elb` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `user` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `pass` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`_id`),
  UNIQUE KEY `_user` (`_user`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3");

我也试过

  $tsk1 = pg_query("
        CREATE TABLE IF NOT EXISTS 'elb' (
          'id' int(8),
          'user' varchar(128),
          'pass' varchar(128),
          'name' varchar(128),
         ");

我也试过这个,但得到一个 500 错误。而且我知道我已连接,因为我尝试仅更改密码中的一个字符并返回“无法连接”。

<?php
$dbconn = pg_connect("host=hostname port=portnum dbname=mydb user=myuser password=mypass sslmode=require options='--client_encoding=UTF8'") or die('Could not connect: ' . pg_last_error()); 

$sql = pg_query('CREATE TABLE "elb" (
  "id" int(8),
  "user" varchar(128),
  "pass" varchar(128),
  "name" varchar(128)
)');

?>
4

3 回答 3

5

int(8)在 PostgreSQL 中没有意义,其中int32 位整数 (aka int4) 和bigint64 位整数 (aka int8)。

如果您收集并报告了实际的数据库错误消息(应该在数据库日志文件中)而不是简单地说“500 错误”,这将更容易诊断。

于 2013-01-03T14:42:54.520 回答
3

MySQL 可能是唯一使用反引号 ( `) 作为名称分隔符的 DBMS。因此,如果您确定要连接到 PostgreSQL 数据库,则需要删除脚本中的所有反引号。

CREATE TABLE 语句之后的ENGINE=...,DEFAULT CHARSET=...和其他选项也很可能是特定于 MySQL 的,应该删除。

如果您需要在查询中分隔名称,请使用双引号 ( "):

    CREATE TABLE IF NOT EXISTS "elb" (
      "id" int(8),
      "user" varchar(128),
      ...
于 2013-01-03T14:06:51.563 回答
1

您遇到的元问题是您没有阅读从 PostgreSQL 服务器返回的错误消息。如果你不先解决这个问题,你在使用 PHP/PG 编程时就无法高效。

您的 PHP 环境可能已display_errors设置为关闭。这是生产的推荐值。来自 php.ini:

; 该指令控制 PHP 是否以及在何处输出错误,
; 通知和警告。错误输出在开发过程中非常有用,但是
; 在生产环境中可能非常危险。取决于代码
; 这是触发错误,敏感信息可能会泄漏
; 超出您的应用程序,例如数据库用户名和密码或更糟。
; 建议将错误记录在生产服务器上,而不是
; 将错误发送到 STDOUT。
; 可能的值:
; Off = 不显示任何错误
; stderr = 向 STDERR 显示错误(仅影响 CGI/CLI 二进制文件!)
; On 或 stdout = 向 STDOUT 显示错误
; 默认值:开
; 开发价值:开
; 产值:关闭
; http://php.net/display-errors

display_errors = 关闭

假设您无法更改不是服务器管理员的情况,您应该能够在开发时将其动态设置为 On in,方法是在脚本的开头添加:

ini_set('display_errors', 'On');

之后,PG 错误应在发生时自动显示在页面上。

如果编写生产质量代码,您需要检查每次pg_query调用的结果,并在FALSE使用pg_last_error函数获取错误消息并根据上下文将其输出到日志或页面中时。

于 2013-01-04T17:12:59.737 回答