未定义的方法PDO lastInsertId。

19

我有一个插入查询,想要从表格中获取ID。我已经搜索了一些内容,发现PDO提供了lastInsertId()方法。但当我尝试使用它时,出现了PHP错误。

这是我的代码:

$db = new database();
$naam = $db->quoteQuery($_POST['naam']);
$barcode = $db->quoteQuery($_POST['barcode']);
$sql = "INSERT INTO products(name, barcode) VALUES (".$name.",".$barcode.")";
$results = $db->executeQuery($sql);
$lastid = $results->lastInsertId();

但是这会导致一个错误,就是这个:

Fatal error: Call to undefined method PDOStatement::lastInsertId() in /home/onlineweuh/domains/onlinewebapps.nl/public_html/vsb/admin/add-product.class.php on line 297

我的数据库类:

    class database 
{
    private $handleDB;
    public function __construct()
    {
        $host = ;
        $user = ;
        $database = ;
        $password = ;
        try
        {
            $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password);
        }
        catch (PDOException $e)
        {
            print_r($e);
        }

        $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

希望有人能帮我解决这个问题,我想要在插入查询时返回给定的ID。

3个回答

39

从PDO对象获取lastinsertid,而不是您的结果对象。

尝试使用$db->lastInsertId()

以下进行编辑。

您的数据库类封装了handleDB / PDO对象。由于handleDB变量是私有的,因此无法在类外部访问它。您需要将其公开化,如下所示:

class database 
{
    public $handleDB;
    public function __construct()
    {
        $host = 'removed';
        $user = 'removed';
        $database = 'removed';
        $password = 'removed';
        try
        {
            $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password);
        }
        catch (PDOException $e)
        {
            print_r($e);
        }

        $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

}

现在你可以调用$db->handleDB->lastInsertId();

或者你可以将handleDB->lastInsertId()公开为一个函数,如下:

class database 
{
    private $handleDB;
    public function __construct()
    {
        $host = 'remove';
        $user = 'removed';
        $database = 'removed';
        $password = 'removed';
        try
        {
            $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password);
        }
        catch (PDOException $e)
        {
            print_r($e);
        }

        $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

    public function lastInsertId(){
        return $this->handleDB->lastInsertId();
    }

}

您可以使用 $db->lastInsertId(); 进行调用。


然后我得到了这个错误:调用未定义的方法database::lastInsertId()。 - Marnix
你需要直接调用新方法:$results = $db->executeQuery($sql); $lastid = $db->lastInsertId(); - webcoder.co.uk

17
lastInsertIdPDO的一个方法,而不是PDOStatement的方法。因此:
$db->lastInsertId();

然后我得到了这个错误:调用未定义的方法database::lastInsertId() - Marnix
database 是否继承 PDO?你使用的 PHP 版本是什么? - deceze
我的PHP版本是:5.2.12。我已经将我的PHP数据库类放在了开始位置。 - Marnix
既然database没有扩展PDO,那么它显然也没有一个名为lastInsertId的方法。你需要将该调用传递给你的$handleDB PDO对象,或者返回该对象以便你的代码可以在其上调用lastInsertId - deceze

0
你的数据库类需要通过继承PDO来作为PDO的子类。
class database extends PDO

这样你的子类就可以使用 PDO 中的所有方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接