Ve burada ben yine buradayım! ;)
Im (iyi, im hala planlama aşamasında) i diğer geliştirici (CMS yapar, drupal, joomla, vb) şekilde theyr kendi eklentileri / modülleri yazmak imkanı verecek bir web uygulaması geliştirme.
Benim sorunum i birçok nedenden (ilk veri bütünlüğü) için, veri tabanları ile etkileşim için yazdığı yöntemleri kullanmak için force geliştiriciler zorunda olmasıdır. Ben gizli veritabanı yapısını korumak için dansçılara gerek yok, ama bu çok mümkün olmadığını, takdir olduğunu.
Yani, kısacası, benim hedeftir:
- Keep 'protected' and not accessible from outskimlike my classes the database connection;
- Mümkünse (ama 1 noktasında bir sonucu olmalı) gerçek bir veritabanı yapısı gizli tutmak;
Eklentileri / modules davranış Drupal kanca gibi uygulanacaktır.
Yani, benim şimdiki durumun bir kısa örnek:
<?php
// File dbclass.php
class DbHandler{
/*
* As simply as i could ;)
*/
private $dbLink;
public function __construct(){
$this->dbLink = pg_connect("host=127.0.0.1 user=myuser password=mypassword dbname=mydatabase");
}
public function __destruct(){
pg_close($this->dbLink);
unset($this->dbLink);
}
}
?>
ve modül çağrı:
<?php
// An general situation
require('dbclass.php');
/*
* The DbHandler consctruct function open a database connection.
*/
$init = new DbHandler();
/*
* [..i'll do something here..]
*/
/*
* Lets say this is inskimlike a function/hook of an enabled module;
* This is the behavior i want to avokimlik!
* How to keep the database connection 'within' my
* DbHandler object's instance?
* p.s: in real life i do use prepared stmt
*/
$qrUsers = pg_query('SELECT * FROM users');
if(pg_num_rows($qrUsers) != 0){
echo '<h2>Query success!</h2>';
//do something
}else{
echo '<h2>Query Fail!</h2>';
}
//Actual Output: Query Success! [...]
//Deskimlikered output: Warning: pg_query() [function.pg-query]: No PostgreSQL link opened yet in /var/www-lighttpd/dbtest.php on line xx Query Fail!
?>
Ben geliştirici doğrudan bir sorguyu yürütmek için çalışırsanız, başarısız olur, ve ben yayınlanmıştır örnekte, o (örneğin) gibi bir yöntemi kullanmak zorunda olduğunu istiyorum
$users = new User();
$users -> get_all();
Im postgresql üzerinde çalışan, ama sorun Mysql aynı olduğunu varsayalım.
Bildiğim kadarıyla ben düşünce olarak, ben bunu yapabilirim only yolu bağlantısını before tüm modülleri kanca arayın ve sonra bir kanca CRUD gerekir her zaman yenkimliken ve tekrar kapatılabilecek kapatmak için veritabanı. Ama gerçekten bu çözümü sevmediğim, alışkanlık verimli olabilir.
Birisi betters fikirleri varsa, bunları benimle paylaşın lütfen!
ps: benim ingilizce kötü, ben soru açıktır umuyoruz.
EDIT: the Oddthinking solution seem to be the best for me: the opening and immediately closing the ghost connection will prevent every next pg_* or mysql_* function call. This solution, in couple with renaming the pg_* or mysql_* functions with runkit / apd with custom names will (i think) definitely avokimlik any uncontrolled access to the DB by the modules/plugins.