"Bilgi Paylaşalım" kategorisindeki yazılar

PDO Nedir ve PDO Kullanımı

PDO sürücüsü PHP 5.1.0 sürümünden itibaren etkindir.

php.ini dosyasından aşağıdaki satırı etkin hale getirebilirsiniz.

extension=php_pdo.dll

PDO ile veritabanı bağlantısı nasıl yapılır?

try {
     $db = new PDO("mysql:host=localhost;dbname=deneme;charset=utf8", "deneme", "123");
} catch ( PDOException $e ){
     print $e->getMessage();
}

Try catch kullanmaya yavaş yavaş alışsanız iyi olacak. Try catch nesne yönetimli kod yazmak isteyen kişilerin kullandığı bir yapıdır. Try catch’i hataların raporlanmasında kullanıyoruz.

Bağlantı kodunda charset=utf8 belirttim fakat isteğe bağlı olarak aşağıdaki gibi de kullanabilirsiniz.

$db->query("SET CHARACTER SET uf8");

PDO ile select işlemi

$query = $db->query("SELECT * FROM tablo", PDO::FETCH_ASSOC);
   foreach( $query as $row ){
      echo $row['isim']."<br />";
   }

Yukarıdaki kod’da PDO::FETCH_ASSOC “Yöntemin, sonuç kümesindeki her satırının, sütun isimleriyle indislenmiş bir dizi olarak döndürüleceğini belirtir. Eğer sonuç kümesi aynı isimde birden fazla sütun içeriyorsa her sütun için tek bir değer döner.” işlemini gerçekleştirmektedir.

Eğer bu şekilde değil de tek bir satır çekecekseniz aşağıdaki kodu kullanabilirsiniz.

$query = $db->query("SELECT * FROM tablo WHERE ID = 1")->fetch(PDO::FETCH_ASSOC);
    print_r($query);

Eğer parametreyi dışarıdan alacaksanız kesinlikle aşağıdaki kodu kullanmanızı öneririm, çünkü sql injection açığına tam manasıyla bir güvenlik sağlamaktadır.

$sql= "SELECT * FROM tablo WHERE ID = :tabloID";
$query = $db->prepare($sql);
$query->bindParam(':tabloID', $tabloID, PDO::PARAM_INT);
$sonuc = $query->execute();

Tabi bu kodda integer değer aldık, peki ya string değer alsaydık? Bu sefer de bindParam kısmında aşağıdaki kodu kullanacaktık.

$query->bindParam(':isim', $isim, PDO::PARAM_STR);

PDO ile insert işlemi

Bu aşamayı yine prepare kullanarak yapacağız.

$sql = "INSERT INTO tablo (isim,yaz,) VALUES (:isim,:yazi)";
$query = $db->prepare($sql);
$sonuc = $query->execute(array(':isim'=>$isim,':yazi'=>$yazi));

PDO ile update işlemi

Yine yukarıdaki prepare ile yapacağız, fakat bu sefer değişik bir yol göstermek istiyorum.

$sql = "UPDATE tablo SET isim=?, yazi=? WHERE id=?";
$query = $db->prepare($sql);
$sonuc = $query->execute(array($isim,$yazi,$id));

PDO ile delete işlemi

insert ve update kodlarında kullandığımızın aynısı aslında, sadece örnek olsun diye ekliyorum.

$sql = "DELETE tablo WHERE id=?";
$query = $db->prepare($sql);
$sonuc = $query->execute(array($id));

PDO sonuç kontrolü

Yukarıdaki kodlarda $query->execute kısmına bir değişkene atadım, sizde if ile aşağıdaki gibi işlemin başarılı olup olmadığını görebilirsiniz.

if($sonuc)
   echo "Execute işlemi başarılı.";

PDO bağlantı sonlandırma

İşimiz bittiğinde bağlantılarımızı sonlandırmamız lazım. Bunun için de aşağıdaki kodu kullanabilirsiniz.

$db = null;

PDO count_row işlemi

Tüm verilerin kaç tane olduğunu saymak için aşağıdaki kodu kullanırız.

$toplam = $query->rowCount();

Ödev İçin Php Kategorili Haber Sitesi

Yakın bi akrabanın php ödevini beraber yaparken geliştirdiğimiz siteyi yeni başlayanlara yol göstermesi açısından paylaşıyorum.

Öncelikle bir index.php ve duygu.css dosyası oluşturduk.

index.php dosyası:

/*
 * Dosyalar klasöründen baglanti.php dosyasını
 * olduğu gibi bu sayfaya ekliyorum
 * baglanti.php dosyasında veritabanı bilgileri yer almaktadır.
 */
require_once 'dosyalar/baglanti.php';
?><!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>Duygu</title>
    <link href="duygu.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <?php
    include 'dosyalar/ust.php';
    ?>
    <table cellpadding="4" cellspacing="0" class="ustmenutable">
        <tr>
            <td id="altkisimtd" >
                <table>
                    <tr>
                        <td id="sitesol" valign="top">
                            <?php
                            include 'dosyalar/sol.php';
                            ?>
                        </td>
                        <td id="sitesag" valign="top">
                            <div class="ortahaberler">
                                <?php
                                $sonuc = mysql_query("select * from haberler order by id desc Limit 0,5");
                                $habersay = mysql_num_rows($sonuc); //Haberleri sayar
                                if ($habersay != 0) {
                                    while ($oku = mysql_fetch_array($sonuc)) {
                                        echo "<h1><a href='yazi.php?id=" . $oku["id"] . "'>" . $oku["baslik"] . "</a></h1>";
                                        echo "<div class='habericerik'>" . substr($oku["yazi"], 0, 255) . "... <a href='yazi.php?id=" . $oku["id"] . "'>Devamını Oku</a></div>";
                                    }
                                } else {
                                    echo "<li>Hic haber yok!</li>";
                                }
                                ?>
                            </div>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
    <?php
    include_once 'dosyalar/alt.php';
</body>
</html>

Duygu.css dosyasının içeriği:

body{
    font-family: arial;
    font-size: 10pt;
    background-color: #993300;
    color: #ffffff;
}
a{
    color: #993300;
    text-decoration: none; //Alt çizgiyi kaldır
}
a:hover{
    color: #7c0000;
    text-decoration: underline; //altını çizer
}
.ustmenutd a{
    font-weight: bold;
    font-size: 12pt;
    color: #ffffff;
}
.ustmenutd a:hover{
    color: #bdbdbd;
}
.ustmenutable{
    width: 900px;
}
.ustmenutd{
    width: 170px;
    background-color: #468b28;
    color: #ffffff;
    text-align: center;
}
.ustmenutd:hover{
    background-color: #224114;
}
#altkisimtd{
    background-color: #ffffff;
    color:#000000;
}
#sitesol{
    width: 300px;
    border-right: 1px solid #000000; //hücrenin sağına çizgi çekmek için
    vertical-align: baseline; //yazıları yukarda tutmak için
}
#sitesag{
    padding-left: 10px;
    width: 590px;
    vertical-align: baseline; //yazıları yukarda tutmak için
}
h1{
    font-size: 13pt;
    margin-top: 6px; //Tepeden 6 pixel boşluk bıraktık
}
.ortahaberler{
    border-bottom: 1px dotted #525252;
}
.habericerik{
    padding-bottom: 5px;
}

Demo

Diğer tüm dosyalar için tıklayınız.

Php Recursive ile Sonsuz Alt Kategori

Elimizde aşağıdaki gibi bi dizi var ve biz bunu recursive ile derin kategori haline getirmek istiyoruz.

Kendi kendisini doğrudan veya dolaylı olarak çağıran fonksiyonlara özyineli (recursive) fonksiyonlar adı verilir.

Derin kategori yani sonsuz alt kategori mantığına göre çalışma yapmak için, bir tane ekstra sütun oluşturuyoruz tablomuza ve bunun adına üst diyoruz, bu sütunda üst kategorinin id’sini yayınlıyoruz.

Array
(
    [5] => Array
        (
            [id] => 5
            [isim] => Citroen
            [ust] => 0
            [altkategori] => Array
                (
                    [6] => Array
                        (
                            [id] => 6
                            [isim] => Citroen Jumper
                            [ust] => 5
                            [altkategori] => Array
                                (
                                    [7] => Array
                                        (
                                            [id] => 7
                                            [isim] => Citroen Jumpy
                                            [ust] => 6
                                            [altkategori] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [8] => Array
                        (
                            [id] => 8
                            [isim] => Berlingo
                            [ust] => 5
                            [altkategori] => Array
                                (
                                )

                        )

                    [9] => Array
                        (
                            [id] => 9
                            [isim] => C1
                            [ust] => 5
                            [altkategori] => Array
                                (
                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 1
            [isim] => Peugeot
            [ust] => 0
            [altkategori] => Array
                (
                    [4] => Array
                        (
                            [id] => 4
                            [isim] => Peugeot Boxer
                            [ust] => 1
                            [altkategori] => Array
                                (
                                )

                        )

                    [2] => Array
                        (
                            [id] => 2
                            [isim] => Peugeot Partner
                            [ust] => 1
                            [altkategori] => Array
                                (
                                )

                        )

                    [3] => Array
                        (
                            [id] => 3
                            [isim] => Peugeot Partner Tepee
                            [ust] => 1
                            [altkategori] => Array
                                (
                                )

                        )

                )

        )

)

Şimdi de bu döngüyü yayınlamaya geçiyoruz.

                echo rec($kategoriler);

                function rec($kategoriler) {
                    $sonuc = "<ul>\n";
                    foreach ($kategoriler as $goster) {
                        $sonuc .= '<li><a href="' . site_url('kategori/' . $goster["id"] . '/' . sef_link($goster["isim"]) . '.html') . '">';
                        $sonuc .= '' . $goster["isim"] . '</a></li>';
                        $sonuc .= "\n";
                        if (!empty($goster["altkategori"]))
                            $sonuc .= rec($goster["altkategori"]);
                    }
                    $sonuc .= "</ul>\n";
                    return $sonuc;
                }

Düzenleme 1:
Şimdi bunu bir de select option içerisinde nasıl döndüreceğimize bakalım.

                            function rec($kategoriler, $ust, $tire) {
                                foreach ($kategoriler as $goster) {
                                    if ($goster["ust"] == 0) {
                                        $tire = 0;
                                    }
                                    if ($ust != $goster["ust"]) {
                                        $ust = $goster["ust"];
                                        $tire++;
                                    }
                                    $sonuc .= '<option>' . str_repeat('--', $tire) . $goster["isim"] . '</option>';
                                    $sonuc .= "\n";
                                    if (!empty($goster["altkategori"]))
                                        $sonuc .= rec($goster["altkategori"], $ust, $tire);
                                }
                                $sonuc .= "\n";
                                return $sonuc;
                            }

Yukarıdaki kod içerisinde üst kategorisi arttıkça tire işareti koyduk, kodu detaylı incelediğinizde ayrımı kolayca yapabileceksiniz.

Codeigniter Parser stdClass Sorunu

Codeigniter parser library kullanırken aldığım hatanın çözümünü sizinle de paylaşmak istiyorum.

Parser yaparken stdclass string ifadeye çevrilmediği için arıza veriyor. Devamını oku »

Mysql Left Join ile Count ve SUM Kullanmak

Başlık çok acayip oldu ama yapmak istediğimizden kısaca bahsedebilirim.

İki tane tablom var birinde firmalar diğerinde verilen servisler. Firmalara ait servisler giriliyor, bana lazım her firmaya ne kadar servis verilmiş ve toplam ne kadar servis vermişim.
Servisleri count ile saydırdım, tarih ve saat farklı sütunlardaydı CONCAT ile birleştirdim, TIMESTAMPDIFF ile dakika olarak farkı aldım, SUM ile de tüm dakikaları topladım, COALESCE ile toplam değer NULL ise 0 yazdırdım.
GROUP BY ile gruplayarak sadece firmalara göre işlem yaptırdım. 

Öyle işte…

İşte o kod:

SELECT
COUNT(servis.firmaid) as servissayisi, 
COALESCE(SUM(TIMESTAMPDIFF(MINUTE, CONCAT(servis.giristarih," ",servis.girissaat), CONCAT(servis.cikistarih," ",servis.cikissaat))),0) as toplamsure,
firma.id as firmaaid, firma.isim,firma.yetkili,firma.telefon1,firma.telefon2,firma.ilce,firma.sehir
FROM firma LEFT JOIN servis ON firma.id=servis.firmaid
GROUP BY firma.id
ORDER BY servissayisi DESC

edit: COALESCE(sum(…),0) ile NULL değeri 0 olarak yazdırdım.

MongoDB ve PHP Tarih işlemleri

Belirli bir formatta tarih gösterme;

date('d M Y h:i:s', $obj["tarih"]->sec)

Tarih Aralığına Göre İçerik Çekme

$dbhost = 'localhost';
$dbname = 'newDB';
$m = new Mongo("mongodb://$dbhost");
$con = $m->$dbname->yazi;

$baslama 	= new MongoDate(strtotime("2013-05-25 00:00:00"));
$bitis 		= new MongoDate(strtotime("2013-05-27 00:00:00"));

$goster = $con->find(array("tarih" => array('$gt' => $baslama, '$lte' => $bitis)));
	foreach($goster as $obj){
		echo date('d M Y h:i:s', $obj["tarih"]->sec) ."
";
		}

Detaylı olarak php.net üzerinden inceleyebilirsiniz http://us1.php.net/manual/en/class.mongodate.php

MongoDB ve PHP ile Basit Form İşlemi

Standart PHP kodları çok fazla bi değişiklik yok, örneği detaylı incelediğinizde daha iyi anlayacaksınız.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>MongoDB ile Form</title>
</head>
<body>
<?php
	//Bağlantıyı Açalım
	$dbhost = 'localhost';
	$dbname = 'newDB';
	$m = new Mongo("mongodb://$dbhost");
	$con = $m->$dbname->yazi;
if($_GET["sayfa"]=="kaydet"){
		$icerik = array(
			'isim'	=> $_POST["baslik"],
			'ilk'	=> $_POST["yazi"],
			'tarih'	=> new MongoDate()
		);
	$con->save($icerik);
	echo "eklendi <br />";
}
?>

<form id="form1" name="form1" method="post" action="?sayfa=kaydet">
  Başlık: <input type="text" name="baslik" value="" /><br />
  Yazı <textarea name="yazi" cols="25" rows="4"></textarea><br />
  <input name="yolla" value="Gönder" type="submit" />
</form>
<?php
$goster = $con->count();
echo "Toplam ".$goster." tane içerik mevcut";
?>
</body>
</html>

MongoDB ve PHP ile ilk işlemler

MongoDB windows kurulumunu gerçekleştirdikten sonra php ile ilk bağlantımızı yapmaya geldi sıra.

Öncelikle sql ile mongoDB arasındaki temel farklılıkları aşağıdaki tablodan inceleyiniz.

SQL MongoDB
Database db
Table Collection
Row Document
Column Field

Localhost MongoDB Bağlantısı

$dbhost = 'localhost';
$m = new Mongo("mongodb://$dbhost");

Bu işlemi yaptıktan sonra collection’a nasıl bağlanacağımızı aşağıdaki kod’dan inceleyelim.

$con = $m->$dbname->yazi; // yazı ismindeki collection'a bağlandık

Şimdi de find() ile collection içindeki tüm verilere ulaştık ve dizi olarak dönen sonuçları foreach döngüsü ile ekrana yazdırdık.

$cursor = $con->find();
foreach($cursor as $obj){
	echo $obj["isim"];
	}

MongoDB PHP Yeni Document Eklemek

Array olarak field’lar içine eklenecek verileri belirledikten sonra collection bağlantısı yaptığımız ifadeye save() methodu ile gönderiyoruz.

$icerik = array(
	'baslik' => 'MongoDB',
	'yazi' => 'buraya yazı detayları gelecek',
	'tags' => array('etiket 1','etiket 2')
);
$con->save($icerik);

MongoDB PHP Delete işlemi

delete from yazi where baslik = “MongoDB”

sorgusunun mongodb ile kullanım şekli aşağıdaki gibidir.

$icerik = array(
	'baslik' => 'MongoDB'
);
$con->remove($icerik);

MongoDB PHP koşula göre veri çağırma

SELECT * From yazi WHERE baslik = “MongoDB” order by name ASC Limit 10

Yukarıdaki sorgunun çevrilmiş hali aşağıdadır.

$icerik = array(
	'baslik' => 'MongoDB'
);
$con->find($icerik)->sort(array("name" => 1))->limit(10);

MongoDB PHP Update İşlemi

UPDATE users SET baslik = ‘Yeni Başlık’ WHERE _id = 18

$icerik = array(
	'$set' => array('baslik' => 'Yeni Başlık')
);
$kosul= array(
	'_id' => 18
);
$con->update($kosul,$icerik);

Genel olarak PHP ile MongoDB kullanım sözcükleri bunlar, daha detaylı incelemek için ww.php.net üzerindeki örnekleri ve detayları inceleyebilirsiniz.

Benim blog’da amacım sizin ilk adımı atmanızdır. Hatalarım varsa bildirirseniz sevinirim. Hatalarınızı yorum kısmından sorabilirsiniz.

Görüşmek üzere.

MongoDB ve PHP Kurulumu

MongoDB‘yi bilgisayarımıza kurduktan sonra localhost üzerinde nasıl mongoDB ‘ye ulaşacağımıza bakabiliriz.

Buradan istediğimiz sürümü indiriyoruz, indirdiklerimiz arasından işletimiz sistemimize en uygun olanı seçip “\PHP\ext” içine yüklüyoruz.

php.ini dosyasının en altına da aşağıdaki satırı ekleyip kaydediyoruz.

extension=php_mongo.dll

Localhost üzerinde “$m = new Mongo();” class’ını çalıştırarak kurulup kurulmadığını çözebilirsiniz.

Eğer çalışmazsa php.exe dosyasını çalıştırın hatayı söyleyecektir, onu çözersiniz zaten 😉

Kurulum bu kadar basit.

MongoDB Nedir? Windows MongoDB Kurulumu Nasıl Yapılır?

MongoDB performanslı olduğundan dolayı son zamanlarda çok duyduğum bir veritabanı. Duymuşken biraz inceleyelim dedim, windows üzerinde denemeler yapmaya başladım, daha sonra ise PHP uygulamalarımın bazılarında (performansa ihtiyaç duyacağını düşündüklerimi) bu veritabanını kullanacağım.

mongodb

MongoDB nedir diye soracak olursanız; ilişkisel veritabanları çok fazla veride afallamaya başlıyor, MongoDB ile bu sıkıntılardan kurtulacağınız vaadediliyor. MongoDB verileri JSON formatında tutuyor ve buna göre işlemler yapıyor, c++ ile geliştirilmiş olması da notlarım arasında. Unutmadan full text search ve indexleme özelliğine de sahip.

http://www.mongodb.org/downloads

Yukarıdaki adresten işletim sistemimize en uygun olanı indiriyoruz.

Daha sonra bunu c:\mongodb dizinine çıkartalım, içine “data” ve “logs” ismiyle iki tane daha klasör oluşturalım.

Şimdi bir cmd dosyası açalım ve c:\mongodb\bin klasörüne gidip aşağıdaki komutu çalıştıralım, bu komut aynı zamanda yeni bir servis oluşturacaktır.

mongod --logpath c:\mongodb\logs\mongo.log --dbpath c:\mongodb\data\db --directoryperdb --install

net start MongoDB” komutu ile servisi çalıştırabilirsiniz.

Bu işlemi de yaptıktan sonra yeni bir cmd dosyası daha açıyoruz ve mongo shell üzerinde çalışmaya başlıyoruz.

c:\mongodb\bin dizinine gittikten sonra mongo.exe yazarak shell ‘i çalıştırıyoruz.

Localhost üzerinden http://localhost:28017 yazarak mongodb’nin çalıştığını görebilirsiniz.

MongoDB için sizlere MongoVUE programını öneririm, kullanışlı programdır.

İlerleyen zamanlarda mongoDB ve PHP kodlarını ve örnek uygulamalarını da paylaşmaya çalışacağım inşallah.

Görüşmek üzere

« Eski Yazılar

Kategoriler