標籤:

寫了一個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開發 |