寫了一個php程序,希望可以優化運行效率和安全(防注入),歡迎各種招數飛來?
/*
common_db.php*/class config_db_mysql{ var $localhost = NULL;var $user = NULL;
var $password = NULL; var $db = NULL; var $conn = NULL; var $query = NULL; var $key_v = NULL; var $values_v = NULL; private function conn_mysql(){ global $_config_db;$this-&>localhost = $_config_db[host];
$this-&>user = $_config_db[user]; $this-&>password = $_config_db[password]; $this-&>db = $_config_db[db]; $this-&>conn = mysql_connect($this-&>localhost,$this-&>user,$this-&>password); mysql_query("set names utf8"); mysql_select_db($this-&>db, $this-&>conn); } public function query($query){ $this-&>conn_mysql();$this-&>result = mysql_query("$query",$this-&>conn);
} public function insert($table,$into = array(),$values = array()){ $this-&>arrays($into); $query = insert into .$table.(.$this-&>key_v.) values(.$this-&>values_v.); $this-&>query($query); echo $query; } public function arrays($arrays){ if(!is_array($arrays)){return JDUN -- Database
No Array!; } foreach($arrays as $key =&> $values){ if(!$this-&>key_v){ $this-&>key_v = $this-&>key_v..$key.; $this-&>values_v = $this-&>values_v..$values.; }else{ $this-&>key_v = $this-&>key_v.,.$key.; $this-&>values_v = $this-&>values_v.,.$values.;}
} }}$db = new config_db_mysql();$db-&>insert(table,array(1=&>3,2=&>4));print_r($db-&>conn.$db-&>key_v.$db-&>values_v);?&>
那我不客氣了。
從頭到尾都是辣雞。
好大一個洞,隨時被人爆。用 prepared statement 吧兄弟
-&>arrays() 這個方法從命名到實現都很 orz ,別人在調用這個方法的時候心情大概跟吃了大便差不多。
連接方法沒有處理好重入, 導致 conn 對象重複創建也是醉。
參數初始化放到構造函數里去啊,依賴全局變數什麼鬼。
類名丑爆。革命尚未成功,同志仍需努力。很多的代碼其實用不到。這段程序完全可以優化的很短。
你看看我之前寫的一個DB類。參考一下。都互相學習學習。我中間的scalar和find方法還有一些問題。請能人幫忙解答一下。還有就是之前的插入,更新,刪除都是用的數組,這個讓我給成用原生sql了。也可以改成數組。請幫忙看看,批評指正一下。& set names . $config[charset], PDO::ATTR_TIMEOUT =&> $config[timeout]));
}
return self::$db_instance;
}
/**
* 查詢標量數據
* @param string $sql 執行的sql語句
* @param string $params 需要替換$sql中的問號 如果沒有?,則為空數組
*/
public static function scalar($sql, $params = []){
$data = self::selectQuery(scalar, $sql, $params);
if (!empty($data[0])) {
return $data[0];
}else{
return ;
}
}
/**
* 查詢單列數據
* @param string $sql 執行的sql語句
* @param string $params 需要替換$sql中的問號 如果沒有?,則為空數組
*/
public static function column($sql, $params = []){
return self::selectQuery(column, $sql, $params);
}
/**
* 查詢一行記錄
*/
public static function find($sql, $params = []){
$result = self::selectQuery(find, $sql, $params);
if (empty($result[0])) {
return [];
}
return $result;
}
/**
* 查詢多行記錄
*/
public static function all($sql, $params = []){
return self::selectQuery(all, $sql, $params);
}
/**
* 查詢數據
*/
private static function selectQuery($type, $sql, $params){
self::getInstance();
$instanceStatement = self::$db_instance-&>prepare($sql);
$result = $instanceStatement-&>execute($params);
if ($result === false) {
self::$_error = $instanceStatement-&>errorInfo();
return false;
}else{
self::$_error = null;
switch ($type) {
case column: //獲取指定的一列數據
case scalar: return $instanceStatement-&>fetchAll(PDO::FETCH_COLUMN); break; //獲取指定的一行數據
case find: //獲取執行的一行數據
case all: //獲取全部數據
default: return $instanceStatement-&>fetchAll(PDO::FETCH_ASSOC);
break;
}
}
}
/**
* 插入單行數據數據
* @param string $sql 執行的sql語句
* @param array $params 需要插入的參數;
*/
public function insert($sql, $params = []){
return self::executeQuery(insert, $sql, $params);
}
/**
* 更新數據
*/
public function update($sql, $params = []){
return self::executeQuery(update, $sql, $params);
}
/**
* 更新數據數據
* @param string $type insert update delete
* @param string $sql 執行的sql語句
* @param array $params 需要替換?的數據 格式[field1, field2, ...];
*/
private function executeQuery($type, $sql, $params){
self::getInstance();
//初始化
$instanceStatement = self::$db_instance-&>prepare($sql);
$result = $instanceStatement-&>execute($params);
if ($result === false) {
$this-&>_error = $instanceStatement-&>errorInfo();
return false;
}else{
$this-&>_error = ; //清除上次的錯誤信息
if ($type == insert) {
return $this-&>db-&>lastInsertId() + $instanceStatement-&>rowCount() - 1; //測試性質 (不一定正確,風險極高)
}else{
return $instanceStatement-&>rowCount();
}
}
}
/**
* 獲取錯誤消息
*/
public static function error(){
return self::$_error;
}
/**
* 消除實例
*/
public static function clear(){
self::$db_instance = null;
}
}
?&>
建議題主去看看Yii framework或者laravel它們的資料庫封裝是怎麼做的,你寫的這些方法只能認為是來黑php的
推薦閱讀:
※如何寫一個 PHP URL 路由?
※為什麼面試時經常問到 PHP 設計模式?PHP 設計模式有什麼用?
※Windows 下基於 IIS 伺服器的 PHP 環境怎麼搭建?
※php如何進階?
※如何利用PHP構建個人小型博客?
TAG:PHP開發 |