调用未定义的方法connect :: prepare()

时间:2016-07-30 20:48:22

标签: php pdo

每当我尝试执行查询时,它会显示:

  

致命错误:调用未定义的方法connect :: prepare()

Array
(
    [nome_gal] => just a name
    [cover_gal] => DSC_0017.JPG
    [galleria] => Array
        (
            [0] => Array
                (
                    [id_foto] => 24
                    [nome_foto] => foto_9.jpg
                )

        )

)

//这是另一个页面中的require_once' connect.php';

      class connect {

            private static $instance = null;
            private $pdo;

            private function __construct() {
                try{
                    $this->pdo = new PDO('mysql:localhost=127.0.0.1;dbname=comment', 'root', '');
                } catch(PDOException $e) {
                    die($e->getMessage());
                }
            }

            public static function getInstance() {
                if(!isset(self::$instance)) {
                    self::$instance = new connect();
                }
                return self::$instance;
            }
        }

3 个答案:

答案 0 :(得分:0)

您需要$this->pdo->pdo->prepare($sql);,目前无法访问该$pdo,因为connect目前在您的班级$this->pdo中是私密的。

connect指的是您的第一个(似乎是数据库类$this->pdo),然后您再次将connect指定为您实际的PDO数据库类&#39 ;尝试访问(将此添加到您的public function __call($method, $args) { if ( method_exists($this->pdo, $method) ) { return call_user_func_array(array($this-pdo, $method), $args); } } 课程。)

您可以使用魔术方法__call将这些请求转发到父PDO类:

 function TakeValue()
 {
      var xs = document.getElementById("text").value;
      var p = document.getElementById("para");
      p.textContent = String(xs);

       // Do you want to add a p or change the text
       // document.body.appendChild(p);

      return false;
  }

答案 1 :(得分:0)

在连接中,您在$pdo属性中拥有PDO。在用户中,您已在$pdo属性中进行连接。要从用户访问PDO,您需要使用$this->pdo->pdo。这就是命名会让你感到困惑的地方。

如果你只使用这个类来维护一个PDO实例(单例模式),那么没有理由在这里使用魔术函数,只需返回getInstance()中的PDO对象而不是连接实例:

        /**
         * @return PDO
        */
        public static function getInstance() {
            if(!isset(self::$instance)) {
                self::$instance = new connect();
            }
            return self::$instance->pdo;
        }

答案 2 :(得分:0)

您必须了解面向对象编程中的封装。将变量声明为私有时,无法在类外部解析。让我说你宣布

private $pdo 

您无法在User类中看到该变量仅在连接类中可见。 在你的用户类中,你已经将$ pdo连接到实例(单例实例),但是当你在用户类中使用$ pdo时,你试图访问本机pdo而不是。 所以请使用getter / setter作为私有变量。在您的连接类中:

function getPDO(){

    return $this->pdo;
    }
    // You dont need setter because you may will not use another driver in lifecyle

因此,当您想要调用数据库驱动程序时,毫无疑问地使用此快捷方式

connect::getInstance()->getPDO();

请不要犹豫,在评论中提出任何问题。希望帮助!!!