Nasıl düzgün PDO bağlantı kurmak için
Zaman zaman sorular veritabanına bağlanma ile ilgili görüyorum.
En cevapları benim gibi değil, ya da sadece doğru cevaplar alamayabilirim. Her neyse; benim işime gelir çünkü bunu hiç düşünmedim.
Ama işte çılgın bir düşünce; Belki de yaptığımın yanlış, ve eğer olay buysa, ben o gerçekten bilmek nasıl düzgün bir şekilde bağlamak için bir MySQL veritabanı kullanarak PHP ve PDO ve yapmak kolay accesable.
Yapıyorum işte nasıl:
Öncelikle, burada benim filestructure(soyunmuş):
/ tarayıcınıza
index.php
/ başlatılamıyor
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
Çok üstünde, require('initialize/load.initialize.php');
var.
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');
Daha iyi, daha doğru, sınıfları dahil etmek için bir yol var biliyorum, ama ne olduğunu hatırlayamıyorum. Henüz içine bakmak için zaman kazanılmış değil, ama autoload
ile bir şey olduğunu düşünüyorum. böyle bir şey...
configure.php
Burada ben temelde sadece bazı geçersiz kılarphp.ını-özellikleri ve site için diğer bazı genel yapılandırma
connect.php
Diğer sınıflardan bir sınıf üzerine bağlantı koydumuzanırbu bir...
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 geçenlerde OOP öğrenme ve mysql yerine PDO kullanmaya başladığı günden bu yana büyük gelişme var.
Sadece yeni başlayanlar tutoraials bir kaç izledim ve farklı şeyler denedik
sessions.php
Düzenli seanslar handeling yanında, ben de böyle birkaç ders bir oturum başlatılamıyor:
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
Bu sayede bu sınıf her yerde avalible. Bu iyi bir uygulama olmayabilir(?)...
Her neyse, bu yaklaşım beni her yerde: yapmak için izin verir
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
İçinde benim sqlQuery
-sınıfextends
connect_pdo
- ., ^em>sınıfBenim veritabanı isteği işleyen bir kamu fonksiyonu getAreaName
aradım.
Gayet güzel bence.
Bir cazibe gibi çalışır
Bunu nasıl yaptığımı temelde.
Bir sınıf nemli ortamda değil benim DB bir şeyler getir ama ne zaman ihtiyacım olsa da, ben sadece buna benzer bir şey yapın:
$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);
Sience *connect_pdo.php* ben sadece atıfta zorunda olduğum içinde bir değişken içine bağlantı koydum. Çalışıyor. Beklenen sonuç
Ama ne olursa olsun, eğer siz eğer burada olursam bana söyleyebilirse memnun olurum. İnstad, alanları ben ne yapmam gerektiğini veya iyileştirme vb değiştirin
Öğrenmek için sabırsızlanıyorum...
CEVAP
Amaç
Gördüğüm kadarıyla, bu durumda amacı iki yönlüdür:
- ve veritabanı başına tek/yeniden kullanılabilir bir bağlantı oluşturun
- bağlantısı düzgün ayarlanmış olduğundan emin olun
Çözüm
PDO bağlantısı ile baş etmek için bir anonim işlev ve fabrika desen de tavsiye ederim. Olur bu gibi görünüyor :
$provider = function()
{
$instance = new PDO('mysql:......;charset=utf8', 'username', 'password');
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
$factory = new StructureFactory( $provider );
Daha sonra aynı dosya içinde farklı bir dosya ya da:
$something = $factory->create('Something');
$foobar = $factory->create('Foobar');
Fabrikanın kendisi bu gibi görünmelidir:
class StructureFactory
{
protected $provider = null;
protected $connection = null;
public function __construct( callable $provider )
{
$this->provider = $provider;
}
public function create( $name)
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}
}
Bu şekilde bağlantısı gerekir sadece oluşturulur emin kılan merkezi bir yapıya izin vermez. Ayrıca birim test ve bakım süreci çok daha kolay olur.
Bu durumda sağlayıcı bir yere bootstrap aşamada tespit edilebilir. Bu yaklaşım ayrıca DB bağlanmak için kullandığınız yapılandırma tanımlamak, nerede açık bir yer verecek.
Bu bir olduğunu unutmayınson derece örnek basitleştirilmiş. Ayrıca aşağıdaki iki video izlerken yarar olabilir:
Ayrıca, güçlü PDO (kötü öğretici çevrimiçi bir günlük var) kullanımı hakkında a proper tutorial okumasını tavsiye ederim.
Nasıl düzgün-derleme bilgileri Haskell...
Nasıl bir bağlantı gibi davranan bir H...
Nasıl düzgün Excel, birlikte çalışabil...
Bu uygulama geliştiricileri Facebook G...
Nasıl app store üzerinde uygulamalar i...