我目前有一个数据库调用,它在一个领域工作,但不能在另一个领域工作。
我的数据库类标记为 $database,并将$db
PDO 对象传递给数据库构造函数。
这一切都很好用。
此代码调用有效
$user_info = $database->get_user($user);
此函数称为
public function get_user($user){
$user = $this->db->quote($user);
$query = "SELECT * FROM login where username = $user";
$user = $this->db->query($query);
$user_info = $user->fetch();
return $user_info;}
这将按预期返回用户信息
另一个电话是
$user = $database->confirm($confirm);
$user_info = $database->get_user($user);
确认函数如下所示
public function confirm($confirm){
$confirm = $this->db->quote($confirm);
$query = "SELECT * FROM temp_data WHERE hash = $confirm;";
$count = $this->db->query($query);
$info = $count->fetch();
$user = $info['username'];
$user = $this->db->quote($user);
$query = "DELETE FROM temp_data WHERE username = $user;";
$this->db->exec($query);
$query = "UPDATE login SET confirm = '1' WHERE username = $user;";
$this->db->exec($query);
return $info['username'];}
此调用效果很好。
它以get_user
接受的不带引号的格式返回用户名
但是get_user
失败
我已经完成了故障排除,发现问题是get_user
中的以下行没有返回任何PDO对象或任何数据
$user = $this->db->query($query);
这是有趣的部分。我做了一个尝试捕获,PDO没有抛出PDO异常,它甚至没有抛出一般异常。错误日志中没有错误。它似乎不起作用。我已经使用 Print_r
、 get_class
和 echo
逐步完成,然后是输出结果的die;
,直到我进行第二次数据库调用为止,这一切都有效。提取返回错误,但这仅仅是因为 exec 似乎根本没有运行
我确实尝试在所有东西上使用unset()
,除了我的主数据库连接,在创建时创建并传递到我的数据库对象中
以下是运行脚本时发生的情况
- 用户单击具有随机哈希的链接
- 系统从 GET 获取哈希,然后使用该哈希从临时数据库中提取用户名。 然后,
- 它会在确认时修改用户,删除临时条目,然后返回用户名
- 然后从这里调用
get_user
.在这种情况下,它只返回用户信息以设置 twilio 子帐户。这是系统失败的地方 - 在那之后会发生什么(它确实尝试从我的测试中执行,因为我在这里收到错误)是它访问 twilio API,获取子计数 AUTH 和 SID 令牌并将其写入用户文件
- 然后,新用户将重定向到登录页面
我尝试使用关闭光标,但它不起作用。
如果有人能让我了解我遇到的问题,或者我做错了什么,我将不胜感激。我是使用PDO对象的新手,所以我确定我在某处犯了一个愚蠢的错误。
我能够从PHPFreaks IRC频道的一位好人那里得到答案。
public function get_user($user){
$stmt = $this->db->prepare('SELECT * FROM login where username = :u');
$stmt->bindValue(':u', $user);
$stmt->execute();
$user_info = $stmt->fetch();
$stmt->closeCursor();
return $user_info;
}
public function confirm($confirm){
$stmt = $this->db->prepare('SELECT * FROM temp_data WHERE hash = :h');
$stmt->bindValue(':h', $confirm);
$stmt->execute();
$info = $stmt->fetch();
$stmt->closeCursor();
$stmt = $this->db->prepare('DELETE FROM temp_data WHERE username = :u');
$stmt->bindValue(':u', $info['username']);
$stmt->execute();
$stmt = $this->db->prepare('UPDATE login SET confirm = '1' WHERE username = :u');
$stmt->bindValue(':u', $info['username']);
$stmt->execute();
return $info['username'];
}