• 26-02-2015, 03:56:54
    #1
    Merhaba arkadaÅŸlar,

    Bildiğiniz üzere PHP'de artık mysql_* fonksiyonları yerine PDO kullanımı tavsiye ediliyor. Ben de artık PDO kullanmaya karar verdim ve çalışmaya başladım. Fakat affınıza sığınarak çok basit bir problemim var ve çözümünü arıyorum.
    Şöyle ki;

    Elimdeki bir scriptte (mysql_* fonksyionları kullandığım) , Veritabanı bağlantısını yaptığım bir conn.php, ve veritabanı sorgularımı yaptığım bir functions.php dosyam var.

    conn.php
    mysql_connect("localhost", "username", "password") or die ("Oops! Server not connected"); // Connect to the host
    mysql_select_db("database_name") or die ("Oops! DB not connected"); // select the database
    mysql_query("SET NAMES UTF8");
    
    ?>



    func.php
    
    function setUserPassword($userId, $userPassword){
            /* This function set the password of the user */
            mysql_query("UPDATE users SET password = '$userPassword' WHERE id = '$userId' ");
        }
    
        function setUserMail($userId, $userMail){
            /* This function set the e-mail address of the user */
            mysql_query("UPDATE users SET mail = '$userMail' WHERE id = '$userId' ");
        }
    
    ?>
    header.php sayfamda hem conn.php hem de functions.php sayfamı include etmiştm ve gayet güzel bir şekilde çalışıyordu fonksiyonlarım bu haldeyken.
    Şimdi conn.php sayfamda PDO kullanarak veritabanı bağlantımı yapıp, yine functions.php sayfamda veritabanı sorgularımı çalıştırmak istiyorum. Örnek olsun diye 2 adet fonksiyon yazdım fakat yaklaşık 100 tane fonksiyon var.

    conn.php
    
    $db = new PDO("mysql:host=localhost;dbname=database_name;charset=utf8", "username", "password");
    
    ?>
    functions.php
    
    $sql= "SELECT * FROM dbname WHERE ID = :tabloID";
            $query = $db->prepare($sql);
            $query->bindParam(':tabloID', $userId, PDO::PARAM_INT);
            $result = $query->execute();
    
    ?>
    Bu şekilde iki sayfayı da include ettiğimde sorgu çalışmıyor. Sanırım conn.php'de tanımladığım $db objesi functions.php deki fonksiyonların içerisinde kullanılamıyor. mysql_* kullanırken böyle bir problem de yoktu tabiki ortada. Şimdi kafam karışmış durumda, fakat illa ki birileri tecrübe etmiştir bu problemi. Bazı çözüm önerilerinde Global değişkenlerden bahsedilmiş. Çok fazla iyi değilim php'de yeni öğreniyorum. Rahat anlayabileceğim basit bir çözüm öneriniz olursa çok memnun olurum. Her sayfada yeni bir PDO objesi oluşturarak birden çok database bağlantısı açmak istemiyorum. Her öneriye açığım.

    Şimdiden teşekkürler.
  • 26-02-2015, 08:35:23
    #2
    Merhaba,

    fonksiyonların ilk satırına;

    global $db;
    satırını ekleyip, deneyebilir misiniz?

    Başarılar,
  • 26-02-2015, 21:19:17
    #3
    Tavsiye: spagetti devam etme, sonra hep böyle olur. Düşün geride 100 adet spagetti yaptığın proje olsun, php kendini güncellediğinde, birtakım fonksiyonları kullanımdan kaldırdığında, bütün projeleri tekrar düzenlemek çin işkencesi gibi olur. Oysa; MVC mantığıyla ilerlesen, ve gerekli sınıfları yazsan, bütün projelerde de sadece ilgili controller'ı ya da modeli güncellemen yeterli olur. Eğer ki composer da kullanabiliyorsan, tek tek bütün projeleri manuel güncellemeye de gerek kalmaz.
  • 26-02-2015, 23:07:41
    #4
    hddntha adlı üyeden alıntı: mesajı görüntüle
    Tavsiye: spagetti devam etme, sonra hep böyle olur. Düşün geride 100 adet spagetti yaptığın proje olsun, php kendini güncellediğinde, birtakım fonksiyonları kullanımdan kaldırdığında, bütün projeleri tekrar düzenlemek çin işkencesi gibi olur. Oysa; MVC mantığıyla ilerlesen, ve gerekli sınıfları yazsan, bütün projelerde de sadece ilgili controller'ı ya da modeli güncellemen yeterli olur. Eğer ki composer da kullanabiliyorsan, tek tek bütün projeleri manuel güncellemeye de gerek kalmaz.
    Demek istediğinizi gayet iyi anladım fakat daha önce MVC mimarisine sahip bir projede çalışmadım ve örneklerini görmedim. O yüzden şuan ne yapmam gerektiği konusunda kararsızım.


    ClubArkadas adlı üyeden alıntı: mesajı görüntüle
    Merhaba,

    fonksiyonların ilk satırına;

    global $db;
    satırını ekleyip, deneyebilir misiniz?

    Başarılar,
    Stackoverflow'da bu çözümün sağlıklı olmadığını ve yapılmamasını tavsiye etmiş büyük çoğunluk, o yüzden bu problemi bu şekilde çözmek istemiyorum. Tavsiyeniz için teşekkürler yine de.
  • 26-02-2015, 23:32:13
    #5
    PDO tum veritabanlari icin mesela sen mysql kullanacaksan mysql_ yerine mysqli de kullanabilirsin.

    Orn;
    $baglan = @new mysqli('localhost','root','pw','db');

    Seklinde bir veritabani baglantisi olusturabilirsin.

    Birde sorgu calistiralim ornek.

    $sorgu = $baglan->query("SELECT * FROM uyeler") ;



    Mobil cihazdan gönderildi.
  • 26-02-2015, 23:37:31
    #6
    GlobalError adlı üyeden alıntı: mesajı görüntüle
    PDO tum veritabanlari icin mesela sen mysql kullanacaksan mysql_ yerine mysqli de kullanabilirsin.

    Orn;
    $baglan = @new mysqli('localhost','root','pw','db');

    Seklinde bir veritabani baglantisi olusturabilirsin.

    Birde sorgu calistiralim ornek.

    $sorgu = $baglan->query("SELECT * FROM uyeler") ;



    Mobil cihazdan gönderildi.
    Üstadım sanırım problemimi yanlış anladınız. Ben diyorum ki, yazdığım bir sürü fonksiyon var veritabanı bağlantısı gereken. Şimdi ben her fonksiyonda yeni bir tane PDO objesi oluşturmadan nasıl çalıştırabilirim bu fonksiyonlarımı. Çünkü her yeni PDO objesi oluşturmak yeni bir veritabanı bağlantısı kurmak demek ve bir süre sonra bu sayı çok çok büyük değerlere gelebilir. Bunun önüne geçmek için ne yapmam gerekli onu soruyorum.
  • 27-02-2015, 00:21:12
    #7
    sylvestr adlı üyeden alıntı: mesajı görüntüle
    Üstadım sanırım problemimi yanlış anladınız. Ben diyorum ki, yazdığım bir sürü fonksiyon var veritabanı bağlantısı gereken. Şimdi ben her fonksiyonda yeni bir tane PDO objesi oluşturmadan nasıl çalıştırabilirim bu fonksiyonlarımı. Çünkü her yeni PDO objesi oluşturmak yeni bir veritabanı bağlantısı kurmak demek ve bir süre sonra bu sayı çok çok büyük değerlere gelebilir. Bunun önüne geçmek için ne yapmam gerekli onu soruyorum.
    Aldiginiz hatayi yazar misiniz hocam?

    Mobil cihazdan gönderildi.