欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-30 17:27:20
...

回复内容:

革命尚未成功,同志仍需努力。很多的代码其实用不到。这段程序完全可以优化的很短。
你看看我之前写的一个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的 好多多余的代码写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?
  • 专题推荐