写了一个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的
好多多余的代码声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论