我是php的新手,我最近收到了一些错误。请参阅下面的代码。
我收到一些错误,说在不在对象上下文中时使用$ this 。
这是index.php
<?php
require_once ('setting.php');
try{
$sql = "CREATE TABLE users (
user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
account VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
)";
$result = $this->db->getConnection()->execute($sql);
}catch(Exception $e){
echo " " . $e->message();
}
?>
我将此名称命名为.php
<?php
abstract class PDORepository{
const USERNAME="xxxx";
const PASSWORD="";
const HOST="xxxxxx";
const DB="xxxxx";
private function getConnection(){
$username = self::USERNAME;
$password = self::PASSWORD;
$host = self::HOST;
$db = self::DB;
$connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
return $connection;
}
protected function queryList($sql, $args){
$connection = $this->getConnection();
$stmt = $connection->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
?>
我应该怎么做才能访问该类PDORepository。我在这里找到了一些关于使用抽象类的讨论。但它与此并不相似。谢谢您的帮助!新手在这里!
答案 0 :(得分:1)
第一个问题,你无法实例化一个抽象类,你必须有一个扩展抽象类的“具体”类。所以我会创建一个扩展UserRepository
的<{1}}类:
PDORepository
现在,在你的userrepository中,我们将把你的代码放在index.php中,既然你现在在一个对象里面做的事情,你可以使用<?php //pdorepository.php
abstract class PDORepository{
const USERNAME="xxxx";
const PASSWORD="";
const HOST="xxxxxx";
const DB="xxxxx";
private $conn;
private function getConnection(){
if (!$this->conn) {
$username = self::USERNAME;
$password = self::PASSWORD;
$host = self::HOST;
$db = self::DB;
$this->conn = new PDO("mysql:dbname=$db;host=$host", $username, $password);
}
return $this->connection;
}
protected function execute($sql, $args = null) {
return $this->getConnection()->prepare($sql)->execute($args);
}
}
?>
而不会出现错误:
$this
现在,通过这两个类,您可以实例化<?php //userrepository.php
require_once 'pdorepository.php';
class UserRepository extends PDORepository{
public function init() {
$sql = "CREATE TABLE users (
user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
account VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
)";
try {
$this->execute($sql);
} catch(Exception $e){
echo " " . $e->message();
}
}
?>
的实例,然后可以在其上调用方法:
UserRepository
答案 1 :(得分:-1)
我很欣赏Dave的答案,它正确地解释了正确的架构,但不幸的是,特定的代码是不可行的,因为它在OP中存在很多问题。
为了使其正确,我们需要3个文件:
pdo.php 我们将在其中创建一个PDO类的实例:
<?php
$user = 'root';
$pass = '';
$dsn = "mysql:dbname=test;host=localhost;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => FALSE,
);
$pdo = new PDO($dsn, $user, $pass, $opt);
<强> pdorepository.php 强>
<?php
abstract class PDORepository
{
protected $pdo;
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
protected function _sql($sql, $args = null)
{
if (!$args) {
return $this->pdo->query($sql);
}
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
<强> userrepository.php 强>
<?php
require_once 'pdorepository.php';
class UserRepository extends PDORepository
{
public function init()
{
$sql = "CREATE TABLE users (
user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
account VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL
)";
$this->_sql($sql);
}
}
最后是我们的申请文件:
<?php
require_once 'pdo.php';
require_once 'userrepository.php';
$repository = new UserRepository($pdo);
$repository->init();
此处数据库连接仅一次,这非常重要。还修复了很多小问题。这是工作和可用的代码。