我主要的目的:是查看mysqli->lastInsertId 是否是安全的;先上代码:
DB.class.php文件如下:
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/2/27
* Time: 8:21
* 单例模式
*/
class DB
{
private static $instance; // 类实例
private static $db; // db object private static $dbconfig = array(); //数据库配置 public static $lastInsertId = 0; //最后影响的id public $result; /**
* DB constructor.
* @param $dbconfig
*/
private function __construct($dbconfig)
{
self::$dbconfig = $dbconfig;
} public static function getInstance($dbconfig){
if (!self::$instance instanceof self){
self::$instance = new self($dbconfig);
self::connect();
self::charset();
}
return self::$instance;
} private static function connect(){
try{
self::$db = new mysqli(self::$dbconfig['host'], self::$dbconfig['username'], self::$dbconfig['password'], self::$dbconfig['database']);
}catch (Exception $e)
{
p($e->getMessage());
}
} private static function charset(){
self::$db->set_charset('utf8');
}
/**
* @param $sql 先写固定的,测试用
*/
public function insert(){
self::$lastInsertId++;
return true;
}
private function __clone()
{ }
}index.php 文件如下:<?phprequire('config.php'); //数据库配置信息
require('./DB.class.php');$db = DB::getInstance($config);$db->insert();echo (DB::$lastInsertId);sleep(10); // 延时10秒,为了在另外一个连接访问数据库$db->insert();
echo (DB::$lastInsertId);通过访问index.php , 创建了DB类的实例$db, 我不明白的是,这个类实例应该是在内存的某个地方,变化的可以是对象里面的属性值,那如果在高并发的时候,是否DB::$lastInsertId会出现问题,就是说:第一个用户访问$db->insert(),设置lastInsertId值,然后要使用这个值的时候,是否会是另外一个用户所设置的值呢?
我按照上面的方法测试了几次,都不会出现我说的问题,不知道是我哪里理解错了,还是php服务按客户连接的标识来区分的,
或者在单列模式中,创建的对象只有一个,但对象的属性是每个连接都去创建一份
DB.class.php文件如下:
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/2/27
* Time: 8:21
* 单例模式
*/
class DB
{
private static $instance; // 类实例
private static $db; // db object private static $dbconfig = array(); //数据库配置 public static $lastInsertId = 0; //最后影响的id public $result; /**
* DB constructor.
* @param $dbconfig
*/
private function __construct($dbconfig)
{
self::$dbconfig = $dbconfig;
} public static function getInstance($dbconfig){
if (!self::$instance instanceof self){
self::$instance = new self($dbconfig);
self::connect();
self::charset();
}
return self::$instance;
} private static function connect(){
try{
self::$db = new mysqli(self::$dbconfig['host'], self::$dbconfig['username'], self::$dbconfig['password'], self::$dbconfig['database']);
}catch (Exception $e)
{
p($e->getMessage());
}
} private static function charset(){
self::$db->set_charset('utf8');
}
/**
* @param $sql 先写固定的,测试用
*/
public function insert(){
self::$lastInsertId++;
return true;
}
private function __clone()
{ }
}index.php 文件如下:<?phprequire('config.php'); //数据库配置信息
require('./DB.class.php');$db = DB::getInstance($config);$db->insert();echo (DB::$lastInsertId);sleep(10); // 延时10秒,为了在另外一个连接访问数据库$db->insert();
echo (DB::$lastInsertId);通过访问index.php , 创建了DB类的实例$db, 我不明白的是,这个类实例应该是在内存的某个地方,变化的可以是对象里面的属性值,那如果在高并发的时候,是否DB::$lastInsertId会出现问题,就是说:第一个用户访问$db->insert(),设置lastInsertId值,然后要使用这个值的时候,是否会是另外一个用户所设置的值呢?
我按照上面的方法测试了几次,都不会出现我说的问题,不知道是我哪里理解错了,还是php服务按客户连接的标识来区分的,
或者在单列模式中,创建的对象只有一个,但对象的属性是每个连接都去创建一份
如果是通过web服务器执行的,也可能出问题,没上面的问题大。没有绝对的安全