【问题标题】:Can't Make Table不能做表
【发布时间】:2012-12-17 21:41:24
【问题描述】:

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

?>

【问题讨论】:

  • 我尝试在我的数据库中添加一个表;但由于某种原因,当我运行脚本时,它运行成功,但仍然没有制作表格。
  • 这是 pg 版本 9.2.1
  • 为什么需要使用引号?您所有的表名和列名都是合理的,不需要它们。
  • 我试过有没有,所以我只是想我会发布那些;我已经为此代码尝试了 10 多种不同的格式,但都没有奏效。所以我不确定是什么导致它不起作用。
  • 当您说未创建表时,这是什么意思。您是否从 elb 中选择 *?您在什么架构中创建它?检查上下文。

标签: php sql postgresql heroku


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是我尝试运行的第一件事的另一个版本,但出于某种原因;这给了我一个“HTTP 错误 500(内部服务器错误)”,即使我知道代码看起来正确并且可以与 mysql 一起使用。我只是不知道为什么我的 postgresql 数据库不接受它......是否有一些必须具备的特殊条件?在我建立网站之前,我没有使用 heroku php-apps。
  • 现在我的整个 php 文件都在上面(我在其中编辑过),但我只是没有看到错误。(我尝试了有无最后一个逗号)
  • @DevonBernard:抱歉,我以为问题只出在 SQL 中,所以我假设您知道如何处理嵌套引号。无论如何,我认为您至少有两个选择:1)使用单引号来分隔 PHP 字符串,这样您就可以使用双引号 in 字符串而不会出现问题; 2) 在 PHP 字符串周围使用双引号,如果这是首选样式,然后在字符串内使用 \" 作为双引号。我不太精通 PHP,所以这里有一个链接可以更好地解释这些事情:nusphere.com/php/data_structures_php_strings1.htm.
  • @AndriyM 我尝试在整个查询中使用单引号以在我的 php 脚本中使用它,但它仍然不起作用。您是否认为这可能是主机问题并且他们不允许我从用户端文件创建表?如前所述,我对 Heroku 完全陌生,所以我不知道他们对这类东西的规则。
  • @araqnid 在他们的回答中建议的内容可能是目前的问题。最后一个想法:可能需要关闭;doesn't seem to be required 由 PostgreSQL 本身提供,但我不知道您可能已安装的其他潜在中间件,这些中间件可能会初步解析发送到数据库服务器的所有查询,并且取决于始终存在 ;,所以您如果没有其他帮助,可以试试那个。
【解决方案2】:

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

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

【讨论】:

  • 那么您是否建议我将我的 int 更改为 bigint 或将 8 更改为 4;因为在 mysql 中这总是工作得很好,但如果这是一个 postgresql 的东西,我可以尝试让它工作。我也在我的 postgres.heroku 主开发站点上,他们没有给我查找日志文件的选项,所以我不知道如何为你们获取这些信息。
  • bigintint8 等价于 int(8)
  • 您的客户端访问库应该允许您捕获错误并正确显示它们。我不知道 PHP 的细节,虽然直接使用低级 pgsql 函数可能不是最好的方法。
【解决方案3】:

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

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

;该指令控制 PHP 是否以及在何处输出错误, ;通知和警告。错误输出在开发过程中非常有用,但是 ;在生产环境中可能非常危险。取决于代码 ;这是触发错误,敏感信息可能会泄漏 ;超出您的应用程序,例如数据库用户名和密码或更糟。 ;建议将错误记录在生产服务器上,而不是 ;将错误发送到 STDOUT。 ;可能的值: ; Off = 不显示任何错误 ; stderr = 向 STDERR 显示错误(仅影响 CGI/CLI 二进制文件!) ; On 或 stdout = 向 STDOUT 显示错误 ;默认值:开 ;开发价值:开 ;产值:关闭 ; http://php.net/display-errors display_errors = 关闭

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

ini_set('display_errors', 'On');

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

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

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多