Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用未定义的方法PHP PDO_Php_Pdo - Fatal编程技术网

调用未定义的方法PHP PDO

调用未定义的方法PHP PDO,php,pdo,Php,Pdo,我犯了一个错误 调用未定义的方法连接::prepare() 错误源于QueryBuilder类(如下)的select4方法。调用prepare方法的第一行 理想情况下,连接类应该将PDO对象返回给QueryBuilder。 似乎我将连接对象实例传递给了QueryBuilder 私有$pdo的var_转储输出 object(QueryBuilder)#4 (1) { ["pdo":"QueryBuilder":private]=> object(Connection)#2 (0) { }

我犯了一个错误

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

错误源于QueryBuilder类(如下)的select4方法。调用prepare方法的第一行

理想情况下,连接类应该将PDO对象返回给QueryBuilder。 似乎我将连接对象实例传递给了QueryBuilder

私有$pdo的var_转储输出

object(QueryBuilder)#4 (1) { 
["pdo":"QueryBuilder":private]=> object(Connection)#2 (0) { } }
object(Connection)#2 (0) { }  
代码解释

我有一个配置类(不包括),它接受一个json文件(mysql连接信息)并返回一个数组

然后将其传递到Connection类以返回一个新的PDO对象

class Connection {

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    return new PDO($dsn, $db['user'], $db['pwd']);

  }
}
QueryBuilder类接受PDO实例并将其存储在私有变量中

class QueryBuilder {

 private $pdo;

 public function __construct($pdo) {

   $this->pdo = $pdo;

 }

 public function select4($sql) {

   $statement = $this->pdo->prepare(":sql :n");

   $statement->bindValue(n, 4, PDO::PARAM_INT);

   $statement->execute(['sql' => $sql]);

   return $statement->fetch(PDO::FETCH_CLASS);

 }

}
class Connection {

  public static $pdo;    // Added a static $pdo

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    self::$pdo = new PDO($dsn, $db['user'], $db['pwd']);    // assign PDO

  }

}

$pdo = new Connection(Config::getInstance()->get("db"));

$query = new QueryBuilder(Connection::$pdo);
调用从配置类传递数组值的连接的新实例

$pdo = new Connection(Config::getInstance()->get("db"));
调用QueryBuilder的新实例从连接传递PDO实例

$query = new QueryBuilder($pdo);

$sql_1 = 'SELECT title, synopsis FROM blog LIMIT';
$blog = $query->select4($sql_1); // triggers error 
更新:

谢谢你的评论和帮助。我更改了连接类以实现公共静态变量$pdo。我使用构造函数将PDO对象分配给静态变量

class QueryBuilder {

 private $pdo;

 public function __construct($pdo) {

   $this->pdo = $pdo;

 }

 public function select4($sql) {

   $statement = $this->pdo->prepare(":sql :n");

   $statement->bindValue(n, 4, PDO::PARAM_INT);

   $statement->execute(['sql' => $sql]);

   return $statement->fetch(PDO::FETCH_CLASS);

 }

}
class Connection {

  public static $pdo;    // Added a static $pdo

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    self::$pdo = new PDO($dsn, $db['user'], $db['pwd']);    // assign PDO

  }

}

$pdo = new Connection(Config::getInstance()->get("db"));

$query = new QueryBuilder(Connection::$pdo);
更正了select4方法中的一些小错误及其现在的工作情况。:)

理想情况下,连接类应该将PDO对象返回给QueryBuilder。似乎我将连接对象实例传递给了QueryBuilder

使用构造函数无法实现这一点,在构造函数中返回不同的对象不会影响使用
new
语句返回的内容。请参阅:

您可以尝试以下方法之一:

继承

class Connection extends PDO {

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    parent::__construct($dsn, $db['user'], $db['pwd']);
  }
}
使用:

静态方法

class Connection {

  public static function getPDO($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    return new PDO($dsn, $db['user'], $db['pwd']);
  }
}
class Connection {

  /** @var PDO */
  private $pdo;

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    $this->pdo = new PDO($dsn, $db['user'], $db['pwd']);
  }

  /**
   * Get PDO instance
   * @return PDO
   */
  public function getPDO() {
    return $this->pdo;
  }
}
使用:

Getter方法

class Connection {

  public static function getPDO($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    return new PDO($dsn, $db['user'], $db['pwd']);
  }
}
class Connection {

  /** @var PDO */
  private $pdo;

  public function __construct($db) {

    $dsn = $db['dbs'] . ':host=' . $db['host'] . ';dbname=' . $db['dbName'];

    $this->pdo = new PDO($dsn, $db['user'], $db['pwd']);
  }

  /**
   * Get PDO instance
   * @return PDO
   */
  public function getPDO() {
    return $this->pdo;
  }
}
使用:



您肯定应该看看一些mysql包装器,比如Laravel的数据库包装器:。一般来说,使用检查过的解决方案比重新设计轮子要好。

相关:对象不是这样工作的,您不会从构造函数返回任何内容:您的
$pdo
变量将是
连接的一个实例,not
PDO
@YourCommonSense:谢谢,我阅读并实现了通用选择功能。我将仔细检查我的代码的其余部分是否有新手错误:)@jeroen:我还有一个问题:我读到execute方法将所有值绑定为字符串,某些子句(如LIMIT)不接受字符串值。我碰巧从代码中删除了bindValue(),并将所有参数添加到execute()。没有错误。那么什么时候使用bindValue(),这是在你链接到的段落中说的。