寫了一個php程式,希望可以最佳化運行效率和安全(防注入),歡迎各種招數飛來?

來源:互聯網
上載者:User

回複內容:

革命尚未成功,同志仍需努力。很多的代碼其實用不到。這段程式完全可以最佳化的很短。
你看看我之前寫的一個DB類。參考一下。都互相學習學習。

我中間的scalar和find方法還有一些問題。請能人幫忙解答一下。還有就是之前的插入,更新,刪除都是用的數組,這個讓我給成用原生sql了。也可以改成數組。
請幫忙看看,批評指正一下。
/** * MySQL資料庫類 使用的是PDO */class DB{/** * 資料庫執行個體 */private static $db_instance;/** * 儲存錯誤訊息 */private static $_error;/** * 禁止複製 為了單例模式 */private function __clone(){}/** * 防止還原序列化 為了單例模式 */private function __wakeup(){}/** * 防止執行個體化 */private function __construct(){}/** * 資料庫執行個體化 這裡如果執行個體化失敗會產生一個錯誤,我沒有去進行捕獲。 */private static function getInstance(){if (empty(self::$db_instance)) {$config = Config::get('db');self::$db_instance = new \PDO('mysql:host='. $config['host'] .';dbname=' . $config['database'] . ';port=' . $config['port'], $config['username'], $config['password'], array(\PDO::MYSQL_ATTR_INIT_COMMAND => '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;}}?>
那我不客氣了。

從頭到尾都是辣雞。

好大一個洞,隨時被人爆。用 prepared statement 吧兄弟

->arrays() 這個方法從命名到實現都很 orz ,別人在調用這個方法的時候心情大概跟吃了大便差不多。

串連方法沒有處理好重入, 導致 conn 對象重複建立也是醉。

參數初始化放到建構函式裡去啊,依賴全域變數什麼鬼。

類名醜爆。
$this->result = mysql_query("$query",$this->conn);  
建議題主去看看Yii framework或者laravel它們的資料庫封裝是怎麼做的,你寫的這些方法只能認為是來黑php的好多多餘的代碼
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.