2009-04-13 67 views
9

因此,我正在为我的Web应用程序设置一个安装程序,并为数据库凭证提供输入字段。我的部分验证过程包括测试数据库连接(使用PHP的PDO库)。如果连接失败,我希望能够区分错误的密码,错误的地址,不存在的数据库名称等,以便我可以引用表单上正确的输入字段。可能的PDOException错误(MySQL 5)?

Canone可以指向一个参考,概述使用PDOException返回的可能的错误代码/消息吗?

编辑:我想到这些错误代码/消息可能是特定于数据库的,并且本地数据库代码/错误可能会简单地通过。如果是这种情况,我目前只使用MySQL 5数据库。

回答

14

MySQL文档是error codes的完整参考。

从1000开始的错误代码是server errors。这些措施包括像错误:

  • 错误:1045 SQLSTATE:28000(ER_ACCESS_DENIED_ERROR) 消息:拒绝访问用户 '%s的' @ '%s' 的(使用密码:%S)

  • 错误:1049 SQLSTATE:42000(ER_BAD_DB_ERROR) 消息:未知数据库 '%s' 的

起始于2000错误码是client errors。这些措施包括像错误:

  • 错误:2005(CR_UNKNOWN_HOST)消息:未知MySQL服务器主机 '%s' 的(%d)

  • 错误:2003(CR_CONN_HOST_ERROR)消息:无法连接到在“%s”的(%d)

我不会列出所有可能的错误,因为他们已经记录在案了,我不知道你需要处理哪些MySQL服务器。例如,错误2001和2002特定于UNIX套接字连接,这可能与您的目标平台无关。

不要忘记使用PDO::errorCode()PDO::errorInfo()而不是简单的PDOException消息。


重新发表您对getCode()的评论 - 不,似乎并未以此方式予以支持。我做了一个快速测试,到var_dump() a PDOException。不幸的是,即使错误代码和SQLSTATE包含在异常消息中,它的代码也很简单“0”。

Exception::getCode()是PHP版本5.1.0的基类Exception类的一部分。这取决于相应的PDO驱动程序实现以利用此对象字段。至少对于MySQL驱动程序来说,他们显然没有。

+2

PDOException :: getCode()是否返回与PDO :: errorCode()相同的代码? – Wilco 2009-04-13 17:53:24

-7

我不知道PDO,但你可以使用mysql_error()函数返回是这样的:

  • Access denied for user youruser@yourserver
  • Unable to select database
  • ...etc

然后,您可以直接显示这些错误给用户,或玩获取列表所有可能的错误,并直接确定错误的原因。