我最近创建了一个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 :(得分: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函数时获取错误消息并输出根据上下文在日志或页面中。