php - "Call to a member function prepare()"背后的逻辑

标签 php mysql

我正在编写一个函数来在执行任何操作之前检查数据库中的记录,但我收到错误 Call to a member function prepare()我不太明白。我已经挣扎了很长一段时间了,我真的很感谢一些帮助

问题应该出在 prepare() 上在第 19 行

<?php
$dsn = "xxx"; // Database Source Name
$username="xxx"; // User with acress to database. Root is MySQL admin.
$password="xxx"; //The user password.

try {
  $conn = new PDO($dsn, $username, $password);
  $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
  echo "Connection failed: ".$e->getMessage();
}

//------------------------ Does the category already exist? -------------------------
function checkuser($fbid,$fbfname,$fblname,$femail) {

$sql="SELECT COUNT(*) AS subjectcount FROM Users WHERE Fuid=:Fuid";

try {
    $stmt = $conn->prepare($sql);
    $stmt->bindValue(":Fuid",$_SESSION['FBID'], PDO::PARAM_INT);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $subjectcount=$row["subjectcount"];
    } catch (PDOException $e) {
        echo "Server Error - try again!".$e->getMessage();
    }

//------------------------ If it dosn't, insert it -------------------------
if ($subjectcount==0) {

而且我很难调试,因为我不太明白这个错误的原因。

我将代码更新为

<?php
$dsn = "xxx"; // Database Source Name
$username="xxx"; // User with acress to database. Root is MySQL admin.
$password="xxx"; //The user password.

try {
  $conn = new PDO($dsn, $username, $password);
  $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
  echo "Connection failed: ".$e->getMessage();
}

//------------------------ Does the category already exist? -------------------------
function checkuser($fbid,$fbfname,$fblname,$femail) {
global $conn;
$sql="SELECT COUNT(*) AS subjectcount FROM Users WHERE Fuid=:Fuid";

try {
    $stmt = $conn->prepare($sql);
    $stmt->bindValue(":Fuid",$_SESSION['FBID'], PDO::PARAM_INT);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $subjectcount=$row["subjectcount"];
    } catch (PDOException $e) {
        echo "Server Error - try again!".$e->getMessage();
        exit;
    }

//------------------------ If it dosn't, insert it -------------------------
if ($subjectcount==0) {

最佳答案

我猜完整的错误消息是:

Fatal error: Call to a member function prepare() on a non-object

对吗?

您正在调用变量$conn的成员函数(=类实例成员的函数)prepare,该变量未在您的作用域中声明checkuser 函数,它是在外部声明的(在全局范围内)!

要将其“导入”到您的函数中以便您可以访问它,请将此行放在函数的顶部:

global $conn;

此外,您似乎没有启用完整的错误报告,否则您会在 fatal error 之前看到此错误,从而为您提供另一条线索:

Notice: Undefined variable: conn

(顺便说一句,在 catch block 中输出数据库错误消息后,您应该 exit; - 否则您将打印错误但继续其余部分,使用不存在的数据库连接!)

关于php - "Call to a member function prepare()"背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37171435/

相关文章:

php - 如何创建一个包含由其他几个表组成的 post_id 和 post_table 列的表

php - 尝试按 ASC 顺序获取结果但收到错误

php - 将数据存储在静态属性中(php)

mysql - 如果另一个子查询中不存在表别名,那么创建它们有什么意义呢?

mysql - 多条件查询的 SQL 语句,包括 3 个最近的日期

mysql - 在 MySQL 中组合插入、更新和选择

php - Symfony + Doctrine Oracle DateTime 格式问题

php - 如果用户状态为非事件状态,则阻止用户登录

mysql - 交叉连接比内连接快得多

具有整数分数的Mysql舍入特例