我不确定在向最终用户提供READABLE反馈时最好使用哪种方法。我读过一些论坛,但并没有真正明白(或者我没有理解)
我想在插入/更新失败,成功时以及提供自定义反馈时(例如检查项目是否存在)提供反馈。
在INSERT,UPDATE,DELETE,DROP等上,查询返回TRUE或FALSE。 因此,我的结果属性 $ this-> query_result 应始终为true或false。
我的问题:
我添加了代码以查看我正在做什么(做错了)
这些是我用来连接/查询数据库的函数:
public function connect()
{
if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd))) {
die("Error connecting to DB by user = " . $this->username);
}
$this->db = mysql_select_db($this->dbname,$this->conn)
or die("Unable to connect to database " . $this->dbname);
}
private function query($sql)
{
$this->query_result = mysql_query($sql, $this->conn)or die("Unable to query local database <b>". mysql_error()."</b><br>$sql");
if (!$this->query_result){
die("database query failed.");
} else {
return $this->query_result;
}
}
这是我的问题:我正在提供有关数据访问层(DAL)的反馈,请参阅例如这样:
public function addNewPerson($formData)
{
$sql = "INSERT INTO my_table(`name`, `email`, `www`)";
$sql .= " VALUES('".
$formData['name']."','".
$formData['email']."','".
$formData['www']."','");
$this->query($sql);
return $this->query_result;
}
通过返回文本字符串,返回结果将始终为true。 根据我的阅读,我应该有一个处理错误/反馈的功能。
这就是我目前在模板中提供的反馈:
if (isset($_POST['form_submit']))
{
if (isset($_POST['person_submit'])) {
$formData = $sl->getFormData();
$result = $myDB->addNewPerson($formData);
if ($result == true)
{
echo '<script type="text/javascript" language="JavaScript">
jQuery("#contentArea .messageWindow1").show(500);
jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow1").hide(500); });
</script>';
} else {
echo '<script type="text/javascript" language="JavaScript">
jQuery("#contentArea .messageWindow2").show(500);
jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow2").hide(500); });
</script>';
}
}
}
<div id="contentArea">
<div class="messageWindow1"> <span class="msg"><?php echo $labelResult ?></span></div>
<div class="messageWindow2"> <span class="msg"><?php echo $labelResult ?></span></div>
</div>
答案 0 :(得分:4)
我会使用PHP5的内置异常处理来捕获错误和可能的验证错误。例如:
class DatabaseException extends Exception {}
class ValidatorException extends Exception {}
public function connect()
{
if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd))) {
throw new DatabaseException("Error connecting to DB by user = " . $this->username);
}
if(!($this->db = mysql_select_db($this->dbname,$this->conn))) {
throw new DatabaseException("Unable to connect to database " . $this->dbname);
}
}
//....
public function addNewPerson($formData)
{
$sql = "INSERT INTO my_table(`name`, `email`, `www`)";
$sql .= " VALUES('".
$formData['name']."','".
$formData['email']."','".
$formData['www']."','");
//If less than 2 characters, do not insert data.
if (strlen($formData['name']) < 2)
throw new ValidatorException( "Person not saved. Name field was to short or empty.");
//If person already exists
if($this->isPersonInList($formData['name']))
throw new ValidatorException( "Person already exists!");
//Process query
$this->query($sql);
return $this->query_result;
}
在调用脚本中
try {
$formData = $sl->getFormData();
$result = $myDB->addNewPerson($formData);
} catch (DatabaseException $e) {
// display $e->getMessage()
} catch (ValidatorException $e) {
//display $e->getMessage()
}
用脚本指出其他一些事情。
$arr = 'Shoan'; var_dump(isset($arr[10])); //false var_dump(isset($arr[2])); //true
答案 1 :(得分:2)
只有一个提示:在编写OO时应该使用异常。例如,您可以为不同的错误反馈引入不同的例外。
class ValidationException extends Exception
{}
class DatabaseExceptionextends Exception
{}
throw ValidationException("Person not saved. Name field was to short or empty.");
throw DatabaseException("database query failed.");
然后你捕获所有这些异常,并根据异常的类型做出不同的反应。
try {
// ...
}
catch (ValidationException $e) {
// ...
}
catch (DatabaseExceptionextends $e) {
// ...
}
答案 2 :(得分:0)
您可以在addNewPerson()中的错误消息的开头添加一个特殊字符。调用脚本将使用字符串函数来检测特殊字符(以便它知道存在错误)并删除该字符,以便在没有它的情况下显示消息。你觉得这会对你想要的东西起作用吗?
答案 3 :(得分:0)
必须回答我自己的示例才能显示代码段。 接受Shoan的建议,我试图扩展DAL以使用PDO(类DAL扩展PDO )。但那给了我空白的屏幕。这是我的DAL课程。
class DAL {
protected $username;
protected $pwd;
protected $host;
protected $dbname;
private $conn;
private $db;
private $query_result;
public function __construct($cfg_file = 'nf.config')
{
$config = parse_ini_file($cfg_file);
$this->username = $config['db_user'];
$this->pwd = $config['db_password'];
$this->host = $config['db_host'];
$this->dbname = $config['db_name'];
}
public function connect()
{
($this->conn = mysql_connect($this->host, $this->username, $this->pwd))
or die("Error connecting to DB by user = " . $this->username);
$this->db = mysql_select_db($this->dbname,$this->conn)
or die("Unable to connect to database " . $this->dbname);
}
private function query($sql)
{
$this->query_result = mysql_query($sql, $this->conn)
or die("Unable to query local database <b>". mysql_error()."</b><br>$sql");
if ($this->query_result){
return $this->query_result;
}
}
public function getSomeData()
{
$sql ="SELECT * FROM myTable";
//Process query
$this->query($sql);
return $this->query_result;
}
}
所以在我的代码中,我只是这样做:
$ myDB = new DAL();
$ myDB-&GT;连接();
$ result = $ myDB-&gt; getSomeData();
但是一旦我添加' extends PDO ',我的页面就会变成空白。我也无法使用任何try / catch / throw - 这一切都给了我错误信息。