Zaman zaman veritabanına bağlanmayla ilgili sorular görüyorum.
Çoğu cevap benim yaptığım yol değil, ya da cevapları doğru alamayabilirim. Neyse; Bunu hiç düşünmedim çünkü benim için işe yarıyor.
Ama işte çılgınca bir düşünce; Belki bunu tamamen yanlış yapıyorum ve eğer durum buysa; PHP ve PDO kullanarak bir MySQL veritabanına nasıl düzgün şekilde bağlanacağımı ve onu kolay erişilebilir hale getirmeyi gerçekten bilmek istiyorum.
İşte bunu nasıl yapıyorum:
Öncelikle, işte benim dosya yapım (soyulmuş) :
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
En üstte var require('initialize/load.initialize.php');
.
load.initialize.php
# site configurations
require('configure.php');
# connect to database
require('root/somewhere/connect.php'); // this file is placed outside of public_html for better security.
# include classes
foreach (glob('assets/classes/*.class.php') as $class_filename){
include($class_filename);
}
# include functions
foreach (glob('assets/functions/*.func.php') as $func_filename){
include($func_filename);
}
# handle sessions
require('sessions.php');
Sınıfları dahil etmenin daha iyi veya daha doğru bir yolu olduğunu biliyorum ama ne olduğunu hatırlayamıyorum. Henüz incelemeye vaktim olmadı, ama bence bir şeydi autoload
. bunun gibi bir şey...
configure.php
Burada temel olarak bazı php.ini -properties'i geçersiz kılıyorum ve site için başka bir global konfigürasyon yapıyorum
connect.php
Bağlantıyı bir sınıfa koydum, böylece diğer sınıflar bunu genişletebilir ...
class connect_pdo
{
protected $dbh;
public function __construct()
{
try {
$db_host = ' '; // hostname
$db_name = ' '; // databasename
$db_user = ' '; // username
$user_pw = ' '; // password
$con = new PDO('mysql:host='.$db_host.'; dbname='.$db_name, $db_user, $user_pw);
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$con->exec("SET CHARACTER SET utf8"); // return all sql requests as UTF-8
}
catch (PDOException $err) {
echo "harmless error message if the connection fails";
$err->getMessage() . "<br/>";
file_put_contents('PDOErrors.txt',$err, FILE_APPEND); // write some details to an error-log outside public_html
die(); // terminate connection
}
}
public function dbh()
{
return $this->dbh;
}
}
# put database handler into a var for easier access
$con = new connect_pdo();
$con = $con->dbh();
//
Burada, son zamanlarda OOP öğrenmeye başladığımdan ve mysql yerine PDO kullanmaya başladığımdan bu yana büyük gelişme için yer olduğuna inanıyorum.
Bu yüzden yeni başlayanlara yönelik birkaç öğreticiyi takip ettim ve farklı şeyler denedim ...
sessions.php
Normal oturumları işlemenin yanı sıra, bazı sınıfları aşağıdaki gibi bir oturumda başlatıyorum:
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
Bu şekilde bu sınıf her yerde mevcuttur. Bu iyi bir uygulama olmayabilir (?) ...
Her neyse, bu yaklaşımın her yerden yapmama izin verdiği şey:
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
Benim İçinde sqlQuery
- sınıfta , extends
benim connect_pdo
- sınıfta , ben olarak adlandırılan bir kamu fonksiyonu var getAreaName
benim veritabanına isteği işler.
Bence oldukça temiz.
Bir cazibe gibi çalışıyor
Yani temelde böyle yapıyorum.
Ayrıca, ne zaman bir sınıf içinde olmayan DB'mden bir şey almam gerektiğinde, buna benzer bir şey yapıyorum:
$id = 123;
$sql = 'SELECT whatever FROM MyTable WHERE id = :id';
$qry = $con->prepare($sql);
$qry -> bindParam(':id', $id, PDO::PARAM_INT);
$qry -> execute();
$get = $qry->fetch(PDO::FETCH_ASSOC);
Bağlantıyı connect_pdo.php içindeki bir değişkene koyduğum için , sadece ona atıfta bulundum ve gitmekte fayda var. İşe yarıyor. Beklediğim sonuçları alıyorum ...
Ama bundan bağımsız olarak; Buradan uzaklaşırsam bana söylerseniz çok sevinirim. Bunun yerine ne yapmalıyım, iyileştirmek için değiştirebileceğim veya değiştirmem gereken alanlar vb ...
Öğrenmeye hevesliyim ...