I trying to use $conn
variable into a class article.
I create a configuration.php file
cnfiguration.php
try {
$conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
I agree, it's a classic way to make a database connection.
I tried to use the $conn
variable into class as I said.
class.article.php
class Article {
global $conn;
public $article_id;
function setArticle($article_id) {
$this->article_id = $article_id;
}
function getArticle($article_id){
$getArticlee = $conn->prepare("SELECT * FROM articles WHERE id = :id");
$getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
$getArticlee->execute();
return $getArticlee;
}
}
I requiring both files in executing file (show.article.php) by next order
After all of this I getting an error, an executing a show.article.php. When I remove
global $conn;
I don't have any error. But then I don't have an connecton to database.
I need some solution to include $conn
variable into a class, because this is just one class which one will need a database connection, I'll have about 10-15 class with a pdo connection.
You could place global $conn
inside the getArticle
method.
...
function getArticle($article_id){
global $conn; // not recommended
$getArticle = $conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
However, this approach is discouraged as now your Article
class has an implicit dependancy on external state and is harder to reason about and test.
A better option is to pass the PDO
object into the Article
constructor and keep it as a private property that your methods can call on.
class Article {
private $conn;
public $article_id;
...
function __construct(\PDO $conn) {
$this->conn = $conn;
}
function getArticle($article_id){
$getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
}