SORU
6 Temmuz 2012, Cuma


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
6 Temmuz 2012, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • funbro1

    funbro1

    11 Aralık 2007
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011