【发布时间】:2016-12-10 20:35:35
【问题描述】:
我知道有很多问题与我的问题类似。但我真的想不出这里的问题。我有一个名为“UsersClass”的类,它负责与用户相关的每一项任务。而我使用mysqli prepare 语句从数据库中插入或选择数据,问题是在很多情况下prepare 语句返回false。我通过每隔一段时间建立新连接解决了这个问题,但这在其他功能“2006:Mysql server has gone away”中引起了另一个问题,请参见下面的代码: 在这里和其他函数中,prepare 返回 false。
function isPostingAllowed() {
$this->setPsSelectUsers($this->_connection->prepare("Select * from userpermissions where userpermissions.UserId = ? and userpermissions.PermissionId = 1"));
$this->_psSelectUsers->bind_param('i',$this->UserId);
$this->_psSelectUsers->execute();
if ( false===$this->_psSelectUsers ) {
die('prepare() failed: ' . htmlspecialchars($this->_connection->error));}
if ($this->_psSelectUsers->fetch()){
return true;
}else{
return false;
}}
function setPsSelectUsers($stmt) {
$this->unsetPsSelectUsers();
// mysqli_close($this->_Connection);
// $this-> __construct();
$this->_psSelectUsers= $stmt;}
当我取消注释这两行时,第一个函数将起作用并且准备状态不会返回 false,但在这种情况下,以下函数将抛出错误 2006:
function checkUserAuthentication() {
$this->setPsSelectUsers($this->_connection->prepare("SELECT UserLogInName FROM Users WHERE UserLogInName=? AND UserPassword=?"));
$this->_psSelectUsers->bind_param('ss',$this->UserLogInName, $this->UserPassword);
$this->_psSelectUsers->execute();
if ($this->_psSelectUsers->fetch()){
return true;
}else{
return false;
}}
那么如何在不产生新问题的情况下解决第一个问题?
【问题讨论】:
-
这个
unsetPsSelectUsers()方法有什么作用?我怀疑这里有问题。另外,不要调用setPsSelectUsers()方法,为什么不直接这样做:$this->_psSelectUsers = $this->_connection->prepare(...);? -
@RajdeepPaul 私有函数 unsetPsSelectUsers() { if (isset($this->_psSelectUsers)) { $this->_psSelectUsers->close();未设置($this->_psSelectUsers);}
-
@RajdeepPaul 是的,我明白,但它们是相同的。 unsetPsSelectUsers() 仅取消设置 _psSelectUsers。
-
我在下面更新了我的答案。我已经解释了导致此问题的原因以及解决方案。希望这能回答您的所有疑问。
标签: php mysql mysqli prepared-statement