无法制作表格

时间:2013-01-03 14:03:06

标签: php sql postgresql heroku

我最近创建了一个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)
)');

?>

3 个答案:

答案 0 :(得分:5)

int(8)在PostgreSQL中没有意义,其中int是32位整数(又名int4)而bigint是64位整数(又名int8)。

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

答案 1 :(得分:3)

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

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

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

    CREATE TABLE IF NOT EXISTS "elb" (
      "id" int(8),
      "user" varchar(128),
      ...

答案 2 :(得分:1)

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

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

; This directive controls whether or not and where PHP will output errors,
; notices and warnings too. Error output is very useful during development, but
; it could be very dangerous in production environments. Depending on the code
; which is triggering the error, sensitive information could potentially leak
; out of your application such as database usernames and passwords or worse.
; It's recommended that errors be logged on production servers rather than
; having the errors sent to STDOUT.
; Possible Values:
;   Off = Do not display any errors
;   stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
;   On or stdout = Display errors to STDOUT
; Default Value: On
; Development Value: On
; Production Value: Off
; http://php.net/display-errors

display_errors = Off

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

ini_set('display_errors', 'On');

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

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