我有一个与PHP类和错误处理有关的概念问题。下面是一个演示我的问题的基本类。
创建数据库记录的函数名为“domain_create”。此函数调用辅助函数以确保要创建的域在数据库表中不存在。
在过去,我总是使用true或false来反映函数是否找到了记录,但是这会在我的逻辑中产生一个缺陷。当domain_lu函数返回false时会插入记录,但是如果出现错误则应该执行遇到如选择失败?返回false将导致create函数相信找不到任何内容并继续创建过程..
我的问题是在这种情况下应该如何反映多个州?这种情况是否有“最佳实践”?
<?php
require_once('auth.base.class.php');
require_once('mysql.class.php');
class auth extends base
{
public function __construct()
{
parent::__construct();
}
/*
* User
*/
public function domain_create($args='')
{
if ( domain_lu($args['dname']) === FALSE )
{
return $error['Domain already in use'];
}
}
/*
* Domain
*/
private function domain_lu($dname)
{
$sql = "SELECT name FROM domain WHERE name = '$dname'";
$this->_mysql->SQLQuery($sql);
if ($this->_mysql->numRow() > 0) return true;
else return false;
}
}
?>
答案 0 :(得分:8)
您应该使用Exceptions。如果出现查询错误,则抛出异常,说明失败的原因。如果域已存在,则抛出一个异常,指出该域已存在。这是一个非常简单的例子:
public function domain_create($args='')
{
if (!$this->domain_lu($args['dname']))
throw new Exception('domain already in use');
}
private function domain_lu($dname)
{
$sql = "SELECT name FROM domain WHERE name = '$dname'";
$this->_mysql->SQLQuery($sql); // SQLQuery should throw an exception if it fails
return ($this->_mysql->numRow() > 0);
}
您应该真正创建专门的异常类,以便用户可以捕获特定的异常而不依赖于异常消息,PHP文档有更多信息。但是,只要抛出异常,基本上以这种方式做事就会从函数中拯救出来,并且只要有捕获异常的代码就返回。或者,如果它没有被捕获,PHP将终止脚本。
答案 1 :(得分:4)
您有两种选择:使用异常或定义错误常量,例如
class auth extends base
{
const E_OK = 0;
const E_NOTFOUND = 1;
const E_FAILURE = 2;
//[snip]
private function domain_lu($dname)
{
$sql = "SELECT name FROM domain WHERE name = '$dname'";
if(!$this->_mysql->SQLQuery($sql)) return self::E_FAILURE;
if ($this->_mysql->numRow() > 0) return self::E_OK;
else return self::E_NOTFOUND;
}
}
答案 2 :(得分:0)
IMO,你正在错误的地方解决这个问题。如果您需要确保数据库列不能包含重复值,则应create this column with a UNIQUE
key constraint:
UNIQUE
索引创建一个约束,使索引中的所有值必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,UNIQUE
索引允许包含NULL
的列的多个NULL
值。
数据库往返通常是应用程序中的瓶颈,因此这样做的好处是您不需要针对数据库分派两个查询(一个要检查,一个要插入)。只需运行您的查询并查看它是否成功,如果没有,请获取并返回错误或抛出相应的Exceptions
。