我在办公室运行localhost XAMPP服务器以进行测试。我正在旅行,并决定要在笔记本电脑上完成一些工作,因此我在笔记本电脑上安装了新版本的XAMPP,复制了文件,但由于某些原因,我在笔记本电脑版本上出现了不停的错误,但我没有不能在我的台式机上放单。

最大的问题之一是我的一个网站的简单登录页面。

每次尝试运行代码时,都会出现以下错误:


  调用成员函数rollback()
  在非物体上


我的代码是:

<?php
    session_start();

    if( $_SERVER['SERVER_PORT'] == 80) {
        header('Location:https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]);
        die();
    }

    try
    {
        $db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->beginTransaction();

        $sql = $db->prepare("SELECT user, pw FROM table WHERE user=? AND pw=?");
        $sql->execute(array($_POST['user'], $_POST['pw']));
        $foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();

        $rows = $sql->fetchAll();

        foreach($rows as $row) {
            $username = $row[0];
            $pw = $row[1];
        }

        $db->commit();
        $db->NULL;
    }

    catch (PDOException $e)
    {
        $db->rollback();
        echo $e->getMessage();
        exit;
    }


    if ($foundrows == 1) {

        (store stuff and exit to Page A)

    } else {

        (create error and return to login page)

    }
?>


就像我之前说过的那样,它可以在我的桌面(以及我在其他地方使用的几个实时站点)上毫无问题地运行。 H在做什么?

注意:我认为这可能是我的PHP文件的不同配置,但是我从桌面复制了php.ini文件,仍然没有运气...

最佳答案

您的代码表明$db->rollback()失败,因为尚未定义$db。让我们看一下您的代码片段:

try
{
    $db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
    [snip]
}

catch (PDOException $e)
{
    $db->rollback();
    echo $e->getMessage();
    exit;
}


我认为您的代码甚至没有超越catch块中的第一条语句,即PDO构造函数中引发了异常。要对此进行测试,请将echo $e->getMessage;移到$db->rollback()上方,或有条件地回滚:

catch (PDOException $e)
{
    if ($db) {
        $db->rollback();
    }
    echo $e->getMessage();
    exit;
}


要更一般地解决此问题,请仔细检查数据库设置-也许从一台服务器移动到另一台服务器时发生错误?

关于php - 在非对象上调用成员函数rollback(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4222557/

10-10 21:49