写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4014字,纯文字阅读大概需要6分钟。
内容图文
回复内容:
革命尚未成功,同志仍需努力。很多的代码其实用不到。这段程序完全可以优化的很短。你看看我之前写的一个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程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?全部内容,希望文章能够帮你解决写了一个php程序,希望可以优化运行效率和安全(防注入),欢迎各种招数飞来?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。