[Çözüldü] veritabanı bağlantısında oop kullanma

Başlatan ahmet_matematikci, 24 Ocak 2013 - 16:08:00

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

ahmet_matematikci


private function select_db(){
    $db = mysql_select_db($this->database, $this->connection);
    if($db){return true ;}else {return false;}
}

private function sql(){
 
    $sql =  mysql_query("SELECT * FROM uye_oturum");
    if($this->sql){return true ;}else {return false;}


Bu koddaki hatanın mysql_query den kaynaklandığını biliyorum ancak mysql_query nasıl oop fonksiyonu olarak yazılabilir, php manuel de ki örnekten anlayamadım..
yardımcı olursanız sevinirim
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

alquirel

Bu koddaki hatanın "mysql_query"den kaynaklandığını nereden biliyorsunuz? O satır bana sorunsuz gözüktü.

Birincisi, eğer bu "sql" fonksiyonunu tanımladığınız sınıfın dışında da kullanacaksanız "private" olarak değil "public" olarak tanımlamanız lazım fonksiyonunuzu.

Bence asıl hata şuradan kaynaklanıyor: if($this->sql) olarak kullandığınız koşul olayı çıkmaza sokmuş. Çünkü orada işaret ettiğiniz "sql", o koşulun içinde bulunduğu fonksiyonun ta kendisi. Dolayısıyla durmaksızın "sql" fonksiyonunuzu çalıştırmış olmaktasınız. Eğer bir üst satırda tanımladığınız $sql değişkeninizi kullanmak istiyorsanız bunu $this->sql olarak değil, doğrudan $sql olarak yazmanız lazım if koşulunuzun içine.

ahmet_matematikci

Php öğrenirkne bilgileri OOP üzerine kurmak için üzerinde çalıştığım projeyi önce fonksiyonlarla sonra nesnelerle yazmaya çalışıyorum.
Db sınıfım güvenlik sebebi ile private olarak tanımladım. sonra diğer dosyaya include edeceğim . Tüm dosyayı include edeceğimden sadece sınıf olarak çalışabileceğinden private kullanmamda sakınca yok galiba...(Bol laf edişim acemiliğimden bildiğimden değil affola..)
private function select_db(){
    $db = mysql_select_db($this->database, $this->connection);
    if($db){return true ;}else {return false;}
}

private function sql(){
 
    $sql =  mysql_query("SELECT * FROM uye_oturum");
    if($sql){return true ;}else {return false;}
şeklinde de çalışmadı.
sql fonksiyonunda hata görmemin sebebi bir üst fonksiyonda $this-> nesne ile çağırırken sql  fonksiyonunda nesne ile çağırmıyorum.
Belki hata bundan dolayı olabilir dedim.
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

alquirel

O halde aldığınız hatayı da aktarın ona göre konuşalım.

Bir de, eğer fonksiyonunuz burada paylaştığınız gibiyse kapatma parantezi (yani "}") yok gibi.

ahmet_matematikci

session_start();
header("content-type:text/html;charset=utf8");
include 'vt.php';
        $database = new Database();
        $database ->connect();


parantez kapamadı problen yok giris.php de 5. satırda hata var diyor. giris.php ilk 7 satırı yukarıdaki gibi

vt.php aşağıdaki gibi

<?php
header
('content-type:text/html; charset=utf-8');
session_start();
class 
Database
{
private 
$host 'localhost';
private 
$user 'root';
private 
$pass'1';
private 
$database 'performans';
private 
$connection;

private function 
__construct()
{
    if(
$this->connect())
    {
        if((
$this-> select_db())){}
    } else {
        echo 
'hata: vt baglanilmadi';
        exit();
    }
}

private function 
connect(){
    
$this-> connection = @mysql_connect($this->host$this->user$this->pass);
    if(
$this->connection) {return true ;}else {return false;}
}

private function 
select_db(){
    
$db mysql_select_db($this->database$this->connection);
    if(
$db){return true ;}else {return false;}
}

private function 
sql(){
  
    
$sql =  mysql_query("SELECT * FROM uye_oturum");
    if(
$sql){return true ;}else {return false;}
}

private function 
close(){
    
$this->connection  = @mysql_close($this->connection);
    if(
$this->connection){return true ;}else {return false;}
}

function 
__destruct(){
    
$this->close();
}
}
?>
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

alquirel

Alıntı yapılan: alquirel - 26 Ocak 2013 - 05:39:51
Birincisi, eğer bu "sql" fonksiyonunu tanımladığınız sınıfın dışında da kullanacaksanız "private" olarak değil "public" olarak tanımlamanız lazım fonksiyonunuzu.

Demiştim. Aynısı __construct fonksiyonu için de geçerli. Daha doğrusu sınıfınıza ait herhangi bir fonksiyonu "$database->fonksiyon()" olarak kullanmak istiyorsanız private olarak tanımlamamanız gerekir.

Bir diğer nokta, __construct fonksiyonunun içinde "connect" fonksiyonunu çalıştırıyorsunuz, tekrar ayrıca çağırmanıza gerek yok. Hoş, onu da private yaptığınız için giris.php dosyanızdaki son satır gereksiz kalmış.

http://php.net/manual/tr/language.oop5.visibility.php

ahmet_matematikci

Hocam elinize dilinize sağlık. Haklısınız private i public yapınca düzeldi.
Aslında anlamadığım şu kitaplar da sql bağlantı ve işlemler için private tanımla diyor ve örneklerde öyle gösteriyor.
Ama uygulamada public yapınca ya kadar çalışmadı.
Ben nerede yanlış yapıyorum yada anlayamıyorum.
En son Serdar ÇAKIR ın PHP izle öğren kitabı sayfa 132 de
Resmi php db sınıfı diye  tanımlarken
private $server, $user,$pass;
diye tanımlanmış.

Şu an çalışan (@alquirel yardımı ile )  oop ile yazılmış vt sınıfı mıda ekleyeyim.
<?php
header
('content-type:text/html; charset=utf-8');
session_start();
class 
Database
{

private 
$host 'localhost';
private 
$user 'root';
private 
$pass'1';
private 
$database 'performans';
public 
$connection;

public function 
__construct()
{
    if(
$this->connect())
    {
        if((
$this-> select_db())){}
    } else {
        echo 
'hata: vt baglanilmadi';
        exit();
    }
}

public function 
connect(){
    
$this-> connection = @mysql_connect($this->host$this->user$this->pass);
    if(
$this->connection) {return true ;}else {return false;}
}

public function 
select_db(){
    
$db mysql_select_db($this->database$this->connection);
    if(
$db){return true ;}else {return false;}
}

public function 
close(){
    
$this->connection  = @mysql_close($this->connection);
    if(
$this->connection){return true ;}else {return false;}
}

function 
__destruct(){
    
$this->close();
}
}
?>
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

alquirel

Mesela burada "connect", "select_db", "close" fonksiyonlarını public değil private olarak tanımlayabilirsin. Çünkü bu üçünü sınıfın dışında değil içinde kullanıyorsun sadece.

Bir de sana şöyle bir tavsiyem olacak. "echo" fonksiyonunu kullanarak hata ayıklama yapabilirsin. Mesela echo "1" koyduğunda bir satır arasına, eğer ekrana "1" basabiliyorsa kodun, demek ki o satıra kadar olan kısımda sorun yok. Ne zaman ki ekrana "1" basamadın, demek ki o satırdan önce bir yerlerde sorun var demektir.

Sınıfları iyice kavradıktan sonra sınıflarla uğraşmak zevkli oluyor PHP'de. (diğer dillerde de muhtemelen böyledir, ama bilmediğim için PHP bencilliği yapıyorum şu an :) )

Sorun çözüldüyse: cozuldukonusu

ct

İnternette kullanılan hazır veritabanı sınıflarını inceleyebilirsiniz. Projelerde kendi yazdıklarımızdan çok test edilmiş ve daha güzel tasarlanmış sınıfları kullanmak genellikle daha iyi sonuç verecektir.

http://stackoverflow.com/questions/1218714/useful-php-database-class

ahmet_matematikci

Konuyu çözüldü olarak işaretlememe sebebim bazı kısımları anlamamış olmam idi @alquirel hocam ona da cevap verdi.
@ct hocam aslında hazır db sınıfları (PHP sınıfları-kütüphaneleri)araştırdım ama çok farklı sayıda ve şekilde hazır sınıflar var. Hazır sınıfların mantığını anlamaya çalışıyorum.
Geçmişte PEAR sınıfı varmış düzenli ve güvenilir acaba php 5 sınıfına desteği sürüyor mu?
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

alicilin

Her class kendi içerisinde çalışabilir olmalıdır. Oop nin temel niteliklerinden birisi budur. O ne demek derseniz şöyle açıklayayım.

Sizin classınız şansınıza çalışıyor :)

private function select_db(){
    $db = mysql_select_db($this->database, $this->connection);
    if($db){return true ;}else {return false;}
}

private function sql(){
  
    $sql =  mysql_query("SELECT * FROM uye_oturum");
    if($sql){return true ;}else {return false;}

Php mysql fonksiyonları arka planda resource tipinde bilgi tutarlar. Bu yüzden mysql_select_db ile db seçimi yaptıktan sonra query çalıştırabiliyorsunuz. Eğerki bu durum olmasaydı; Mysql_select_db işleminin resource çıktısını kendiniz bir yere depolamanız, (yani değişkene) ve bu resource trü değişenin taşıdğı değer üzerinden query fonksiyonunda kullanmanız gerekliydi. Şu anda yukarıda alıntı yaptığım şekilde kullanımın Oop ile uzaktan yakından alakası yok. Neden derseniz, sadece Fonksiyonları kopyalamıssınız. Farkındaysanız, fonksiyonları birbiri ile bağlayan ortak bir değer yok. Yine arka plandaki resource çıktılarını alıp kullanıyorlar. Bunun yerine class içinde
ikitane private değişken tanımlayıp Birisinde query'lerin resource değerlerini, diğerinde ise connection (bağlantı) nın resource id sini tutsaydınız. mantıklı olurdu.
<Developer/>