2013-01-03 176 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函數來得到錯誤信息,並將其輸出的日誌或頁面根據上下文。