【问题标题】:PHP call to undefined method - pdo instantiationPHP 调用未定义的方法 - pdo 实例化
【发布时间】:2023-03-03 05:15:21
【问题描述】:

我最近开始复兴一个旧的 PHP4.# 网站。在这样做的过程中,我一直试图弄清楚到 PDO 的转换。在对 PDO 结构进行了这么多不同的尝试之后,我迷路了,我的代码越来越疯狂。我认为问题在于我没有正确实例化 pdo 类,但使用几种不同的方法都失败了。

致命错误:未捕获错误:调用 /home/folder/database/insert.php:36 中未定义的方法 DBInsert::__construct()

mysqlhelper.php

<?php

class MySQLHelper
{
    private $link;
    private $db;
    private $user;
    private $pass;
    var $pdo;

    public function __construct()
    {
        $host = 'localhost';
        $db   = 'dbname';
        $user = 'username';
        $pass = 'supersecret';
        $port = '1111';
                
        $options = [
            \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::ATTR_EMULATE_PREPARES   => false,
        ];
                
        try {
             $dsn = "mysql:host=$host;dbname=$db;port=$port";
             $this->pdo = new PDO($dsn, $user, $pass, $options);
             return $this->pdo;
        } catch (\PDOException $e) {
             throw new \PDOException($e->getMessage(), (int)$e->getCode());
             echo "Connection failed";
        }
        
    }


    function __destruct() 
    {
        // Closing connection
        $this->pdo = null;
    }
    
    public function query($query)
    {
        // Performing SQL query
        $result = $this->pdo->query($query) or die('Query failed: ' . mysql_error());
        return $result;
    }

插入.php

    <?php
    include "../helpers/mysqlhelper.php";
    
    class DBInsert
    {
        private $helper;
        private $nations;
        private $nations_updated;
        private $stagedslots;
        private $stagednations_new; // nations that need to be inserted
        private $stagednations_old; // nations that need to be updated
        var $pdo;
    
    //this function was previously called __construct() prior to my 11/22/20 updates
        function somethingelse()
        {
            $this->helper = new MySQLHelper();
            $this->stagedslots = array();
            $this->nations_updated = array();
            $this->nations = array();
    
            $q = "SELECT * FROM `nations`";
            $result = $this->helper->query($q);
            $result = $this->helper->getResultArray($result);
            foreach ($result as $val)
            {
                $this->nations[$val["id"]] = $val;
            }
        }
    
        public function clearSlots()
        {
            $sql = "DELETE FROM `slots`;";
            $object = new MySQLHelper;
            $object->__construct();
line 36     $stmt = $this->__construct()->prepare($sql);
            $stmt->execute();
        }

对于第 36 行,我也尝试过 $stmt = $this->pdo->prepare($sql);这也会产生错误。

感谢任何建议。

【问题讨论】:

  • "//这个函数以前叫__contruct()" 是叫__contruct()还是__construct()
  • 不确定var $pdo; 在 PHP 中是否有效
  • @kerbh0lz 有效,但不推荐。
  • @Martin 感谢您的信息
  • var $pdo 在这种情况下正在做public $pdo 的工作,这就是它通常的写法。

标签: php pdo instantiation


【解决方案1】:
 $object = new MySQLHelper;
            $object->__construct();
            $stmt = $this->__construct()->prepare($sql);

你在这里写了三遍同样的东西:

您创建了一个新对象$object,然后您不需要调用__construct,因为通过创建该对象,它已经自动调用了构造函数。

    $sql = "DELETE FROM `slots`;";
    $object = new MySQLHelper; //automaticcally calls the constructor
    $stmt = $object->prepare($sql);
    $stmt->execute();
    $stmt->close(); // close connection. 

READ THIS

【讨论】:

  • 感谢您的澄清。我已经尝试了很多方法,最终导致了多余的混乱,从而导致了帖子。我进行了调整以清理重复并更新了错误:致命错误:未捕获的错误:调用 /home/folder/database/insert.php:35 中未定义的方法 MySQLHelper::prepare() 我需要制作对象行类似于: $object = new $this->MySQLHelper 猜猜我不明白它是否没有从 mysqlhelper.php 到达类,或者 MySQLHelper 类不喜欢准备函数。
  • 是的,我已经在该指南中待了几天了。只是没有完全理解。再次感谢。
猜你喜欢
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
相关资源
最近更新 更多