当前位置:Gxlcms > PHP教程 > 写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?

写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?

时间:2021-07-01 10:21:17 帮助过:36人阅读

回复内容:

革命尚未成功,同志仍需努力。很多的代码其实用不到。这段程序完全可以优化的很短。
你看看我之前写的一个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的 好多多余的代码

人气教程排行