【发布时间】:2013-12-26 23:23:26
【问题描述】:
我想在检测到attack 时将某些内容记录到数据库中。类定义和 throwing 是分开的,但为了简单起见在这里加入了它们。我在想:
<?php
class Attack extends Exception {
public function __construct($message, $code = 0, Exception $previous = null, $DB, $IP) {
$STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
$STH->execute(array($IP));
parent::__construct($message, $code, $previous);
}
}
// code
if (!empty($_POST['honeypot']))
throw new Attack($IP . " submitted a filled in honeypot", 0, null, $DB, $IP);
但我也可以考虑这个更简单但更严格的方法:
<?php
class Attack extends Exception {
public function __construct($message, PDO $DB, $IP) {
$STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
$STH->execute(array($IP));
parent::__construct($message);
}
}
// code
if (!empty($_POST['honeypot']))
throw new Attack($IP . " submitted a filled in honeypot", $DB, $IP);
我什至不确定这是否有效,但还有这个:
<?php
class Attack extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
public function block ($DB, $IP) {
$STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
$STH->execute(array($IP));
}
}
// code
if (!empty($_POST['honeypot'])) {
$e = new Attack($IP . " submitted a filled in honeypot");
$e->block($DB, $IP);
throw $e;
}
我只想在检测到攻击时将 IP(可能还有其他一些数据)保存到数据库中。每种方法的优缺点是什么?你能想到其他方法吗?
在抛出异常的同时将某些内容记录到数据库中时最常用的方法是什么?
【问题讨论】:
-
在调用自定义函数的地方使用set_exception_handler 怎么样。在该自定义函数中,您可以调用全局数据库处理程序,或使用自定义静态类来查询数据库。现在您不需要扩展 Exception 类并更改项目中的整个代码...
标签: php exception pdo exception-handling cracking