本文作者:温文曦

超快 PHP MySQL 数据库类(Mysqli数据库封装)

温文曦 7个月前 ( 11-01 ) 1258 1条评论 百度已收录
超快 PHP MySQL 数据库类(Mysqli数据库封装)摘要: 这个轻量级数据库类是使用 PHP 编写的,并使用 MySQLi 扩展,它使用准备好的语句来正确保护查询,无需担心 SQL 注入攻击。MySQLi 扩展具有可以使用的内置准备语句,这...

这个轻量级数据库类是使用 PHP 编写的,并使用 MySQLi 扩展,它使用准备好的语句来正确保护查询,无需担心 SQL 注入攻击。

MySQLi 扩展具有可以使用的内置准备语句,这将防止 SQL 注入并防止数据库被公开,一些开发人员对如何正确使用这些方法感到困惑,因此我创建了这个易于使用的数据库类,该类将执行您的工作。

此数据库类是初学者友好且易于实现,使用本机 MySQLi 方法,您需要编写 3-7 行代码才能从数据库检索数据,通过此类,只需 1-2 行代码就可以执行,并且更易于理解


代码

创建一个新文件并命名它db.php并添加:

<?php
class db {

    protected $connection;
	protected $query;
    protected $show_errors = TRUE;
    protected $query_closed = TRUE;
	public $query_count = 0;

	public function __construct($dbhost = 'localhost', $dbuser = 'root', $dbpass = '', $dbname = '', $charset = 'utf8') {
		$this->connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
		if ($this->connection->connect_error) {
			$this->error('Failed to connect to MySQL - ' . $this->connection->connect_error);
		}
		$this->connection->set_charset($charset);
	}

    public function query($query) {
        if (!$this->query_closed) {
            $this->query->close();
        }
		if ($this->query = $this->connection->prepare($query)) {
            if (func_num_args() > 1) {
                $x = func_get_args();
                $args = array_slice($x, 1);
				$types = '';
                $args_ref = array();
                foreach ($args as $k => &$arg) {
					if (is_array($args[$k])) {
						foreach ($args[$k] as $j => &$a) {
							$types .= $this->_gettype($args[$k][$j]);
							$args_ref[] = &$a;
						}
					} else {
	                	$types .= $this->_gettype($args[$k]);
	                    $args_ref[] = &$arg;
					}
                }
				array_unshift($args_ref, $types);
                call_user_func_array(array($this->query, 'bind_param'), $args_ref);
            }
            $this->query->execute();
           	if ($this->query->errno) {
				$this->error('Unable to process MySQL query (check your params) - ' . $this->query->error);
           	}
            $this->query_closed = FALSE;
			$this->query_count++;
        } else {
            $this->error('Unable to prepare MySQL statement (check your syntax) - ' . $this->connection->error);
        }
		return $this;
    }


	public function fetchAll($callback = null) {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
        while ($this->query->fetch()) {
            $r = array();
            foreach ($row as $key => $val) {
                $r[$key] = $val;
            }
            if ($callback != null && is_callable($callback)) {
                $value = call_user_func($callback, $r);
                if ($value == 'break') break;
            } else {
                $result[] = $r;
            }
        }
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

	public function fetchArray() {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
		while ($this->query->fetch()) {
			foreach ($row as $key => $val) {
				$result[$key] = $val;
			}
		}
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

	public function close() {
		return $this->connection->close();
	}

    public function numRows() {
		$this->query->store_result();
		return $this->query->num_rows;
	}

	public function affectedRows() {
		return $this->query->affected_rows;
	}

    public function lastInsertID() {
    	return $this->connection->insert_id;
    }

    public function error($error) {
        if ($this->show_errors) {
            exit($error);
        }
    }

	private function _gettype($var) {
	    if (is_string($var)) return 's';
	    if (is_float($var)) return 'd';
	    if (is_int($var)) return 'i';
	    return 'b';
	}

}
?>




如何使用


连接到 MySQL 数据库:

include 'db.php';
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'example';
$db = new db($dbhost, $dbuser, $dbpass, $dbname);



从数据库中获取记录:

$account = $db->query('SELECT * FROM accounts WHERE username = ? AND password = ?', array('test', 'test'))->fetchArray();
echo $account['name'];



从数据库中获取多个记录:

$accounts = $db->query('SELECT * FROM accounts')->fetchAll();foreach ($accounts as $account) {
	echo $account['name'] . '<br>';}

如果不希望将结果存储在数组中(对大量数据有用),可以指定回调:

$db->query('SELECT * FROM accounts')->fetchAll(function($account) {
    echo $account['name'];});

如果需要打破循环,可以添加:

return 'break';



获取条数(行数):

$accounts = $db->query('SELECT * FROM accounts');
echo $accounts->numRows();



获取受影响的行数:

$insert = $db->query('INSERT INTO accounts (username,password,email,name) VALUES (?,?,?,?)', 'test', 'test', 'test@gmail.com', 'Test');
echo $insert->affectedRows();



获取查询总数:

echo $db->query_count;




获取最后一个插入 ID:

echo $db->lastInsertID();



关闭数据库:

$db->close();



结论

数据库类使用 MySQLi 扩展,该扩展内置于 PHP 版本 >= 5.0.0 中。如果使用 PHP 版本 5.0.0 到 5.3.0,则需要安装:mysqlnd

无需使用此类准备语句,它会自动为您执行该操作(编写更少,执行更多操作),您的查询将是安全的,只需记住确保使用html特殊字符,或您首选的转义方法。

您可以在项目中自由使用此数据库类。


文章版权及转载声明

作者:温文曦本文地址:https://www.vience.cn/blog/514.html发布于 7个月前 ( 11-01 )
文章转载或复制请以超链接形式并注明出处文曦博客

赞(4
阅读
分享

发表评论

快捷回复:

评论列表 (有 1 条评论,1258人围观)参与讨论
网友昵称:李三三
李三三 游客2021-03-30沙发 回复
香港云服务器怎么样
伴随着科技的发展,互联网资源也日益丰富起来,云计算也得到了飞速的进步,云服务器出现在站长们的面前,其中香港云服务器大受站长们的欢迎和使用。同时香港机房相对于海外云服务器来说,距离上紧靠内地,所以香港云服务器一直备受关注。本文就来说说香港云服务器优势有哪些。
香港云服务器和其他云服务器一样,也是基于云计算技术,是云计算体系中的重要组成部分。云服务器有效的解决了在vps服务和传统物理服务器中的一些问题,比如说存在的业务扩展性弱,管理难度大等问题。香港云服务器怎么样,香港云服务器优势体现在:
香港云服务器怎么样
1.线路方面。香港云服务器不存在国内电信和联通互联不互通的问题,不再为线路的选择和不畅通而烦恼。访问更方便和快捷。

2.国际业务方面。香港云服务器的带宽是国际带宽。相比国内的宽带来说,国际带宽要宽松的多。香港服务器的国际出口带宽充足,在这个全球一体化,很多企业走出国门的时代,选择香港云服务器是个非常不错的选择。

3.无需备案:这个是站长们最关注的,也是很多站长选择香港云服务器的很大的原因之一。不用备案,省去了提交和审核的很多环节,网站做好之后就可以立马上线开通。

4.很高的安全性和可靠性:香港云服务器平台内置ARP攻击防护能力和DDOS攻击防护能力,在硬件上实现了故障和安全性的隔离。香港云主机服务支持多级的备份与恢复,包括备机、系统备份与应用备份。

5.弹性扩展和性能更高:香港云主机独占硬件资源,提供独享带宽,业务单元独立,确保了云服务器的高性能。当用户对云服务器的配置需求增减时,无需重新对系统环境的搭建配置,,即可实现主机配置的平滑升级。

以上就是香港云服务器的优势介绍和分析,希望通过本文让你对香港云服务器有进一步的了解。购买云服务器就到速递网络:www.sudidc.com,运营经验丰富,性价比高,品质保障。或者联系QQ客服:1839877443 / 172475914