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



我正在编写一个函数,在执行任何操作之前检查数据库中的记录,但我得到了错误Call to a member function prepare(),我不太理解。我已经奋斗了很长一段时间了,我真的很想给一些帮助

问题应该是第19行中的prepare()

<?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;

此外,看起来你没有启用完整的错误报告,否则你会在致命错误之前看到这个错误,这给了你另一条线索:

Notice: Undefined variable: conn

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

最新更新