私の考えは、親クラスを作成することでした。Db_objectと私は子クラスで使用できるいくつかのメソッドを入れました。私は、最初の子クラスユーザーを作り、すべてのメソッドをテストし、それらはすべてうまくいきましたが、私は他のクラス(写真)クラスで同じメソッドを使用しようとすると、私はcreate()
、update()
& delete()
を使用することはできません。2番目の子クラスで親クラスメソッドを使用できません
私はプログラミングが初めてで経験は豊富です。
Db_object(親):
<?php
class Db_object
{
public static function find_all()
{
return static::find_by_query("SELECT * FROM " . static::$db_table . " ");
}
public static function find_by_id($user_id)
{
global $database;
$test_array = array();
$the_result_array = static::find_by_query("SELECT * FROM " . static::$db_table . " WHERE id=$user_id LIMIT 1");
return !empty($the_result_array) ? array_shift($the_result_array) : $test_array;
}
public static function find_by_query($sql)
{
global $database;
$result_set = $database->query($sql);
//We created an empty array, so that we can store values in it
$the_object_array = array();
/*if($result_set === FALSE)
{
die("Error: " . mysqli_error());
}
if (!empty($result_set))
{*/
// We use while loop to fetch the database table
while($row = mysqli_fetch_array($result_set))
{
$the_object_array[] = static::instantiation($row);
}
/*}*/
return $the_object_array;
}
//instantiation method loops through the databse record & assign those to object properties.
public static function instantiation($the_record)
{
$calling_class = get_called_class();
$the_object = new $calling_class;
foreach ($the_record as $the_attribute => $value)
{
if($the_object->has_the_attribute($the_attribute))
{
$the_object->$the_attribute = $value;
}
}
return $the_object;
}
private function has_the_attribute($the_attribute)
{
$object_properties = get_object_vars($this);
return array_key_exists($the_attribute, $object_properties);
}
//Method to get all the properties.
protected function properties()
{
$properties = array();
foreach (static::$db_table_fields as $db_field)
{
if (property_exists($this, $db_field))
{
$properties[$db_field] = $this->$db_field;
}
}
return $properties;
}
//We are looping through protected static $db_table_fields.
protected function clean_properties()
{
global $database;
$clean_properties = array();
foreach($this->properties() as $key => $value)
{
$clean_properties[$key] = $database->escape_string($value);
}
return $clean_properties;
}
public function save()
{
return isset($this->id) ? $this->update() : $this->create();
}
public function create()
{
global $database;
$properties = $this->clean_properties();
$sql = "INSERT INTO " . static::$db_table . "(" . implode(",", array_keys($properties)) . ")";
$sql .= "VALUES ('" . implode("','", array_values($properties)) . "')";
if ($database->query($sql))
{
//This method is responsible for pulling up the last query, then assigmimg the id to the object.
$this->id = $database->the_insert_id();
return true;
}
else
{
return false;
}
}
public function update()
{
global $database;
$properties = $this->clean_properties();
$property_pairs = array();
foreach ($properties as $key => $value)
{
$property_pairs[] = "{$key}='{$value}'";
}
$sql = "UPDATE " . static::$db_table . " SET ";
$sql .= implode(", ", $property_pairs);
$sql .= " WHERE id= " . $database->escape_string($this->id);
$database->query($sql);
return (mysqli_affected_rows($database->connection) == 1) ? true : false;
}
public function delete()
{
global $database;
$sql = "DELETE FROM " . static::$db_table . " ";
$sql .= "WHERE id=" . $database->escape_string($this->id);
$sql .= " LIMIT 1";
$database->query($sql);
return (mysqli_affected_rows($database->connection) == 1) ? true : false;
}
}
?>
ユーザー(すべてが正常に動作するようです):
<?php
include ("init.php");
class User extends Db_object
{
protected static $db_table = "users";
protected static $db_table_fields = array('username', 'password', 'first_name', 'last_name');
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
public static function verify_user($username, $password)
{
global $database;
//To senatize Username & Password.
$username = $database->escape_string($username);
$password = $database->escape_string($password);
$sql = "SELECT * FROM " . self::$db_table . " WHERE ";
$sql .= "username = '{$username}' ";
$sql .= "AND password = '{$password}' ";
$sql .= "LIMIT 1";
$the_result_array = self::find_by_query($sql);
return !empty($the_result_array) ? array_shift($the_result_array) : false;
}
}
?>
写真(作成し、ここに私はこれまでやっていることです更新、削除は動作しません):
<?php
//include ("init.php");
class Photo extends Db_object
{
protected static $db_table = "photos";
protected static $db_table_fields = array('photo_id', 'title', 'description', 'file_name', 'type', 'size');
public $photo_id;
public $title;
public $description;
public $file_name;
public $type;
public $size;
}
?>
また、これはquery()
メソッドは、データベースクラスから、次のとおりです。
public function query($sql)
{
$result = mysqli_query($this->connection, $sql);
return $result;
}
私はエラーのいずれかの種類を取得できませんでした。コードに混乱がある場合は、私が説明しようとします。
あなたがエラーを取得するコードの一部を共有することができますか? – iwaduarte
私によると、このメソッドにエラーがあるはずです。 'public static function find_by_query($ sql) { グローバル$データベース; $ result_set = $ database-> query($ sql); $ the_object_array = array(); ながら($行= mysqli_fetch_array($のresult_set)) {$ the_object_array [] =静的::インスタンス($行)。 } return $ the_object_array; } ' – user8077853
私はグローバルとして' $ database'を使用しないことから始めます。私は接続を静的に注入するか、または静的にする。 – Rasclatt