我正在使用以下PHP MySQL数据库类。我很好奇我能做些什么才能让它更安全。到目前为止我对此感到满意,但是没有建议“使用PDO”我目前能做些什么来改善这个目标呢?
<?
class DbConnector {
public static function getInstance(){
static $instance = null;
if($instance === null){
$instance = new DbConnector();
}
return $instance;
}
var $theQuery;
var $link;
function DbConnector() {
$host = 'localhost';
$db = '';
$user = '';
$pass = '';
// connect to the db
$this->link = mysql_connect($host, $user, $pass);
mysql_select_db($db);
register_shutdown_function(array(&$this, 'close'));
}
function find($query) {
$ret = mysql_query($query, $this->link);
if (mysql_num_rows($ret) == 0)
return array();
$retArray = array();
while ($row = mysql_fetch_array($ret))
$retArray[] = $row;
return $retArray;
}
function insert($query) {
$ret = mysql_query($query, $this->link);
if (mysql_affected_rows() < 1)
return false;
return true;
}
function query($query) {
$this->theQuery = $query;
return mysql_query($query, $this->link);
}
function fetchArray($result) {
return mysql_fetch_array($result);
}
function close() {
mysql_close($this->link);
}
function exists($query) {
$ret = mysql_query($query, $this->link);
if (mysql_num_rows($ret) == 0)
return false;
}
function last_id($query) {
return mysql_insert_id($query);
}
}
?>
答案 0 :(得分:3)
如果你不想使用会自动为你转义字符串的东西,你应该至少提供一个escapeString($string)
方法(可以调用mysql_real_escape_string()
),你可以使用它来转义字符串撰写查询。
如果你想开始使用PDO(强烈推荐),那么你可能会有不同的方法,不需要包含一个转义方法。
至于一般考虑因素:
var
,而是使用public
,protected
或private
(var
自PHP 5.0起已被弃用,目前public
)的别名__construct()
方法,而不是具有类mysql_connect()
和mysql_select_db()
如果无法做到他们应该做的话,将返回false
;如果发生这种情况,你应该抛出异常,并在你使用类mysql_query()
和find()
方法中的exists()
调用可能会返回资源(例如false
)以外的内容,因此您应该在调用{{}之前检查该内容。 1}} mysql_num_rows()
,则应将其删除$theQuery
,则应将其设为私有并提供$theQuery
accssor方法getQuery()
属性设置为$link
返回的资源,则应在所有mysql_connect()
次调用中使用该属性,例如mysql_*
的调用} last_id()
私有(根据经验,所有属性都应该是私有的或受保护的,并且应该在需要时提供访问器方法 - 阅读encapsulation的概念)$link
,但在每个方法之前使用明确的public
关键字会让事情变得更清晰答案 1 :(得分:0)
好吧我也讨厌PDO,“我自己的代码是我自己的风险,而其他代码也是你自己的风险”。无论如何,如果您将使用此脚本而没有任何清洁器,我相信您会让您的数据库爆炸。你可能想在开始自己的之前先看看其他mysql数据库连接类: