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エラーが発生しました。また、パスワードの 1 文字を変更しようとしただけで「接続できませんでした」と返されたため、接続されていることがわかります。

<?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では意味がありません。ここintで、は32ビット整数(別名int4)でありbigint、は64ビット整数(別名int8)です。

これは、単に「500エラー」と言うよりも、実際のデータベースエラーメッセージ(データベースログファイルにあるはずです)を収集して報告した方が簡単に診断できます。

于 2013-01-03T14:42:54.520 に答える
3

`バッククォート ( ) を名前の区切り記号として使用する DBMS は、おそらく MySQL だけです。そのため、PostgreSQL データベースに接続していることが確実な場合は、スクリプト内のすべてのバッククォートを削除する必要があります。

ENGINE=...、およびCREATE DEFAULT CHARSET=...TABLE ステートメントの後のその他のオプションも、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に送信します。
; 可能な値:
; オフ = エラーを表示しない
; stderr = エラーを STDERR に表示します (CGI/CLI バイナリのみに影響します!)
; On または stdout = エラーを STDOUT に表示
; デフォルト値: オン
; 開発値: オン
; 生産値: オフ
; http://php.net/display-errors

display_errors = オフ

サーバー管理者ではないことを変更できないと仮定すると、スクリプトの先頭に追加することで、開発中に動的にオンに設定できるはずです。

ini_set('display_errors', 'On');

その後、PG エラーが発生すると、ページに自動的に表示されます。

本番品質のコードを記述する場合は、各pg_query呼び出しの結果を確認し、 pg_last_errorFALSE関数を使用してエラー メッセージを取得し、コンテキストに応じてログまたはページに出力する必要があります。

于 2013-01-04T17:12:59.737 に答える