generated from teknasyon-bootcamp/homework4
-
Notifications
You must be signed in to change notification settings - Fork 3
/
db.class.php
161 lines (124 loc) · 4.42 KB
/
db.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
require_once "post.class.php";
class DB
{
private static $tableColumns = "";
private static $tableValueParams = "";
private static $tableSetParams = "";
private static $tableName = "";
// Connect the database and set tableName
public static function connect()
{
// Create the pdo object
try {
$pdo = new PDO('mysql:host=mariadb;dbname=blog', 'root', 'root');
} catch (\PDOException $ex) {
exit("Veritabanına bağlanırken bir hata ile karşılaşıldı. {$ex->getMessage()}");
}
//Define table name the will be using on queries
if (static::$tableName) {
// That means there is a custom tableName property variable on Model
self::$tableName = static::$tableName;
} else {
// That means that there isn't customization. It will be apply default table naming
self::$tableName = strtolower(static::class) . 's';
}
return $pdo;
}
/**
* Fetch all record as function's model the invoked
*
* Example : This function returns the Post model array if run like Post::All()
* Example : This function returns the User model array if run like User::All()
*
* @return static::class
* */
public static function All()
{
$query = self::connect()->query("Select * from " . self::$tableName . "");
return $query->fetchAll(PDO::FETCH_CLASS, static::class);
}
/**
* Get child class object by id
*
* Return null if the record doesn't exist.
*
* @param int $id
* @return static::object|null
*
*/
public static function find(int $id): static | null
{
$query = "SELECT * FROM " . self::$tableName . " WHERE id=:id";
//Prepare query and bind variables
$namedQuery = self::connect()->prepare($query);
$namedQuery->bindValue(':id', $id);
$namedQuery->execute();
// Get record as static::object
$result = $namedQuery->fetchObject(static::class);
$result = $result ?: null;
return $result;
}
/**
* Creates some part of SQL Queries
*
* @return Array
*/
public function serialize(): array
{
// Get properties of static class as array
$properties = get_object_vars($this);
$totalProperties = count($properties);
$propertiesCounter = 0;
foreach ($properties as $columnName => $value) {
// Ex : VALUES (:value1,:value2,:value3)
self::$tableValueParams .= ":" . $columnName;
// Ex : tableName (:column1,:column2,:column3)
self::$tableColumns .= $columnName;
// Ex : SET column1 = :value1, column2 = :value2, column3 = :value3
self::$tableSetParams .= "$columnName=:$columnName";
$propertiesCounter++;
// Don't add semicolon if this is last value of array
if ($propertiesCounter < $totalProperties) {
self::$tableSetParams .= ',';
self::$tableValueParams .= ',';
self::$tableColumns .= ',';
}
}
return $properties;
}
// Create the record
public function create()
{
// Serialize parts of the query
$properties = $this->serialize();
$namedQuery = self::connect()->prepare("INSERT INTO " . self::$tableName . "(" . self::$tableColumns . ") VALUES(" . self::$tableValueParams . ")");
// Bind params
foreach ($properties as $param => $value) {
$namedQuery->bindValue(":$param", $value);
}
$namedQuery->execute();
}
public function update()
{
// Serialize parts of the query
$properties = $this->serialize();
$query = "UPDATE " . self::$tableName . " SET " . self::$tableSetParams . " WHERE id=:id";
$namedQuery = self::connect()->prepare($query);
// Bind params
foreach ($properties as $param => $value) {
$namedQuery->bindValue(":$param", $value);
}
$namedQuery->execute();
}
public function delete()
{
// Connect the database
self::connect();
$query = "DELETE FROM " . self::$tableName . " WHERE id=:id";
$namedQuery = self::connect()->prepare($query);
// Bind id param
$namedQuery->bindValue(":id", $this->id);
$namedQuery->execute();
}
}