我已经被这个错误困扰好几天了,但我找不到解决它的方法。我尝试过实现
- 单例数据库对象
- 查询后关闭我的连接
- 尝试持久连接
- 将最大连接数设置为 250(本地)
- 将最大用户连接数设置为 250(本地)
其他人也遇到过这种情况吗?
<小时/>奇怪的是我的本地服务器上的错误消息是连接失败:SQLSTATE[08004] [1040]
但行仍然是插入并且数据库查询工作。
在生产服务器上,错误消息变为连接失败:SQLSTATE[42000] [1203]用户 db_admin 已拥有超过 'max_user_connections' 事件连接
我知道最大连接数设置为 15,但是我咨询了支持人员,他们说发生此错误时我没有连接。
在我做出所有选择之后,有人可以检查我的代码以确保其中没有可能导致这些错误的错误吗?
class MyPDO extends PDO{
const DB_HOST='localhost';
const DB_PORT='3306';
const DB_NAME='db_name';
const DB_USER='db_admin';
const DB_PASS='SECRET';
public function __construct(){
parent::__construct('mysql:host='.MyPDO::DB_HOST.';port='.MyPDO::DB_PORT.';dbname='.MyPDO::DB_NAME,
MyPDO::DB_USER,MyPDO::DB_PASS);
try{
$this->db = new MyPDO();
$this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}catch(PDOException $e){
//always catching the connection errors
echo 'Connection failed: ' . $e->getMessage();
}
}
public function query($query){
$args = func_get_args();
array_shift($args);
//check inputs
var_dump($args);
$reponse = parent::prepare($query);
$reponse->execute($args);
return $reponse;
}
}
这是插入查询
function InsertUserToSql()
{
$ret = $this->db->query("INSERT INTO CD_USERS (email,username,password,fname,lname,dob,gender) VALUES
(?,?,?,?,?,?,?)",$this->Email,$this->Username,$this->Password,$this->Fname,
$this->Lname,$this->Birthday,$this->Gender);
if($ret){
echo "insert success";
return $this->db->lastInsertId();
}
$this->db = null;
}
最佳答案
不要扩展PDO
,事实上,永远不要扩展不属于您的对象。扩展 PDO
对于最终使用你的代码的人来说很烦人,它完全没有意义(你想做什么?改进清晰且众所周知的 PDO API?或者创建一个适合的对象你当前的需求更好 - 这意味着:创建一个你将无法再次使用的对象,这违背了 OOP 的要点)? I've been over quite a few reasons why you shouldn't extend from PDO
here ,也许值得一看。
您的实际问题:
不要在类自己的构造函数中创建类的新实例!
在 MyPDO
构造函数中创建新的 MyPDO
将再次调用 MyPDO
构造函数,这将创建 MyPDO 的新实例
,这将再次调用 MyPDO
构造函数,这将创建 MyPDO
的新实例,该实例将再次调用 MyPDO
构造函数,这将...
这就是无限递归在起作用。
这样想:如果有人告诉你:
“如果您将右脚移到左脚前面,则必须再次将右脚移到左脚前面”
然后,那个固定行走的虐待狂疯子会指导你(用枪指着):
“现在将右脚放在左脚前面”
您需要多长时间才能完成您的Grand ecart(或拆分),并且无法再进一步。这就是您的代码中发生的情况。
而且,稍微偏离主题,如果您遇到问题,并尝试使用 PHP 中的单例来解决它,那么您就会引入一个新问题......
关于php - 是什么原因导致DB PDO连接失败: SQLSTATE[08004] [1040] Too many connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623557/