【问题标题】:undefined method PDO lastInsertId未定义的方法 PDO lastInsertId
【发布时间】:2012-10-09 20:30:00
【问题描述】:

我有一个插入查询,我想从表中获取 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。

【问题讨论】:

    标签: php database pdo lastinsertid


    【解决方案1】:

    lastInsertIdPDO 的方法,而不是PDOStatement。因此:

    $db->lastInsertId();
    

    【讨论】:

    • 然后我收到错误:调用未定义的方法数据库::lastInsertId()
    • database 是否扩展 PDO?你用的是什么 PHP 版本?
    • 我的 PHP 版本是:5.2.12。我已将我的 PHP 数据库类放在开始帖子中。
    • 好吧,既然database 没有扩展PDO,它显然也没有lastInsertId 的方法。您需要将该调用传递给您的 $handleDB PDO 对象,或者您需要返回该对象,以便您的代码可以在其上调用 lastInsertId
    【解决方案2】:

    您从 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(); 拨打电话

    【讨论】:

    • 然后我收到错误:调用未定义的方法数据库::lastInsertId()
    • 需要直接调用新的方法:$results = $db->e​​xecuteQuery($sql); $lastid = $db->lastInsertId();
    【解决方案3】:

    您的数据库类需要通过扩展 PDO 成为 PDO 的子类

    class database extends PDO
    

    这样,PDO 中的所有方法都可用于您的子类。

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 2018-04-11
      • 2014-06-15
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多