2013-01-03 127 views
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) 
)'); 

?> 
+0

我尝试在我的数据库中添加一个表;但由于某种原因,当我运行脚本时,它会成功运行,但表格仍然没有生成。 –

+0

这是pg版本9.2。1 –

+0

为什么你需要使用引号?你所有的表格和列名都是理智的,不需要它们。 – Kuberchaun

回答

5

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

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

+0

所以你会建议我改变我的int到bigint或8到4;因为在MySQL中这一直工作正常,但如果这是一个postgresql的事情,我可以尝试做这件事。此外,我在我的postgres.heroku主开发网站上,他们不给我选择查找日志文件,所以我不知道如何获取这些信息给你们。 –

+0

bigint或int8等价于int(8)。 – araqnid

+0

您的客户端访问库应该允许您捕获错误并正确显示它们。我不知道PHP的详细信息,尽管直接使用低级pgsql函数可能不是最好的方法。 – araqnid

3

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

诸如ENGINE=...,DEFAULT CHARSET=...之类的事情以及CREATE TABLE语句之后的其他选项也很可能是MySQL特有的,应该删除。

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

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

这是我尝试运行的第一件事的另一个版本,但由于某种原因;这给了我一个“HTTP错误500(内部服务器错误)”,即使我知道代码看起来是正确的,并与MySQL一起工作。我只是不知道为什么我的postgresql数据库不接受它...是否有一些特殊的条件必须有?在我刚刚构建网站之前,我没有与heroku php-apps一起工作过。 –

+0

现在我的整个PHP文件都在上面(我编辑了它),但我只是没有看到错误(我试过和没有最后一个逗号) –

+0

@DevonBernard:对不起,我认为问题只在SQL ,所以我认为你会知道如何处理嵌套引号。无论如何,我认为你至少有两个选择:1)使用单引号分隔PHP字符串,这样你就可以在*字符串中使用双引号*而没有问题; 2)在PHP字符串周围使用双引号,如果这是首选样式,但是在字符串中使用双引号''''我不太熟悉PHP,所以这里有一个链接,可以更好地解释这些东西:http://www.nusphere.com/php/data_structures_php_strings1.htm。 –

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 

假如你不能改变的不是服务器管理员,你应该能够动态地将它设置为论,而你深化发展,通过在你的脚本的开头添加:

ini_set('display_errors', 'On'); 

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

如果写生产高质量的代码,你要检查每个pg_query调用的结果,而当FALSE使用pg_last_error函数来得到错误信息,并将其输出的日志或页面根据上下文。