Nu har jag suttit och pillat lite mer med klasser osv. Måste faktiskt erkänna att jag i några fall fortfarande inte förstår riktigt fördelen med OO PHP... :r Känn ibland så mkt enklare att köra som förr. Men som sagt, jag vill lära mig att förstå :)
I alla fall, jag har (mha wF) lyckats få ihop en klass som sköter databashanteringen. Den ser typ ut så här:
abstract class db
{
private static $dsn = 'mysql:host=localhost;dbname=xxx';
private static $username = 'xxx';
private static $password = 'xxx';
private static $instance = null;
//////////////////////////////////////////////////////
// Anslut till db
private static function connect()
{
try
{
self::$instance = new PDO(self::$dsn, self::$username, self::$password);
self::$instance -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$instance -> setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
self::$instance -> setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
self::$instance -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$sql = "SET SESSION sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE'";
self::$instance -> query($sql);
}
catch(PDOException $e)
{
echo 'Database connection failed<br />';
echo $e -> getMessage();
exit();
}
catch(Exception $e)
{
echo $e -> getMessage();
exit();
}
}
//////////////////////////////////////////////////////
// Skapa en anslutning
public static function get_instance()
{
if (! isset(self::$instance))
{
self::connect();
}
return self::$instance;
}
//////////////////////////////////////////////////////
// Avsluta db
public static function disconnect()
{
self::$instance = null;
}
//////////////////////////////////////////////////////
// Kör fråga
public static function query($query_type, $sql, $arguments)
{
$db = self::get_instance();
$stmt = $db -> prepare($sql);
$stmt -> execute($arguments);
// Fetch
if ( $query_type == 'fetch' )
{
return $stmt -> fetch();
}
// FetchAll
elseif ( $query_type == 'fetchAll' )
{
return $stmt -> fetchAll();
}
// No fetching
else
{
return void;
}
}
}
För att göra en query i databasen gör jag helt enkelt så här:
$sql = '
SELECT *
FROM user
';
$result = db_handler::query('fetchAll', $sql, array());
return $result;
Själv är jag rätt nöjd, det funkar mkt bra. Ser det bra ut i era ögon?
Nu försöker jag bygga fler klasser, t.ex. en klass för användarna på min sajt. Jag kallar den User.
Efter lite funderande över vad jag behöver har jag kommit fram till följande:
class User
{
private $stmt;
private $arguments;
private $result;
//////////////////////////////////////////////////////
// Hämta alla användare
public function get_all_users()
{
$sql = '
SELECT *
FROM user
';
$result = db::query('fetchAll', $sql, array());
return $result;
}
//////////////////////////////////////////////////////
// Hämta en användare mha id
// $arguments: user_id
public function get_username($arguments)
{
$sql = '
SELECT *
FROM user
WHERE id = ?
';
$result = db::query('fetch', $sql, $arguments);
return $result['username'];
}
//////////////////////////////////////////////////////
// Radera en användare
public function delete_user(id)
{
$sql = '
DELETE
FROM user
WHERE id = ?
';
db::query('', $sql, array($user_id));
return void;
}
//////////////////////////////////////////////////////
// Lägg till en användare
public function add_user()
{
$sql = '
INSERT
INTO user (username, psw)
VALUES (?, ?)
';
$arguments = array($_POST['username'], $_POST['psw']);
db::query('', $sql, $arguments);
return void;
}
}
För att t.ex. hämta alla användare gör jag alltså så här:
$users = new User;
$users->get_all_users();
foreach ($users as $user)
{
echo $user['username'];
}
Detta funkar ju också bra, men jag förstår verkligen inte varför detta inte lika gärna kan ligga i vanliga funktioner...
Kan inte någon guida mig rätt och på något enkelt sätt rätta mig och förklara. Ta gärna med exempel på hur jag ska göra och förstå!
Tack för ert tålamod, jag vill verkligen! :bire