Google PHP API ile Real Time Analytics Bilgilerini Almak

Merhaba arkadaşlar, Google’ın bize sunmuş olduğu beta olarak kullandığımız PHP API’yi kullanarak real time analytics bilgilerini nasıl alacağımızı öğreneceğiz. Hadi başlayalım.

1. Adım (Proje oluşturmak)

Öncelikle https://console.cloud.google.com adresine giriyoruz ve yeni proje oluştur diyerek bir isim belirleyip projemizi oluşturuyoruz.

Daha sonra sol menüden Kitaplık bölümüne giriyoruz. İlgili link: https://console.cloud.google.com/apis/library

Analytics diye aratıp Analytics API’yı buluyoruz ve içine girip aktif et diyoruz.

Aktif ettikten sonra yine sol menüden tekrardan Kimlik bilgileri kısmına giriyoruz. İlgili link: https://console.cloud.google.com/apis/credentials

Burada bir tane “Hizmet hesabı anahtarı” oluşturuyoruz.

Açılan sayfada yeni hizmet hesabı deyip bir hesap adı belirleyin. Ve alttaki anahtar türünün json olduğundan emin olun. Diğerlerine dokunmanıza gerek yok. Oluştur deyin, çıkan uyarıda da yine rolsüz oluştur deyin. Oluşturma işlemi bittiğinde bir json dosyası indirilecek otomatik olarak. Onu saklayın, çünkü google’ın cloud servislerine bağlanmak için onu kullanacaksınız.

Şimdi sol menüden IAM ve yönetici > Hizmet hesapları kısmına girin. Orada bir e-posta adresi göreceksiniz. Bu az önce hizmet hesabı oluştururken oluşan e-posta adresimiz. Onu kopyalayın ve bir sonraki adıma geçin.

2. Adım (Analytics Ayarları)

Şimdi Google Analytics’e girelim. Sol altta Admin ya da ayarlar simgesi var ona tıklayalım. Burada bir önceki adımda kopyaladığımız e-posta adresini üyeler kısmından eklememiz gerekiyor. Ayarlara girdiğinizde, view altındaki “User Management” kısmına tıklayın.

Ve buradan sağ üstteki + butonuna basıp add new user diyoruz. açılan sayfada kopyaladığımız e-posta adresini girip add diyoruz hepsi bu.

Son olarak hangi analytics hesabını kullanacaksanız, yine ayarlar bölümünde view altındaki “View Settings’e girin ve oradaki View ID’nizi kopyalayın, lazım olacak ????

3. Adım (Google PHP API Kurulumu & Kullanımı)

Google’ın beta olarak yayınladığı PHP API linki aşağıdadır.
https://github.com/googleapis/google-api-php-client

Şimdi zaten github sayfasında da anlatılıyor. Ya Composer ile kurun ya da son release edilen versiyonunu indirin diyor. Buna göre istediğiniz şekilde indirebilirsiniz. Her iki yoldada bir adet vendor klasörünüz olacak ve bunun içindeki autoload.php’yi sayfamıza dahil edeceğiz. Ayrıca json dosyası olarak indirdiğimiz dosyayıda projenize dahil edin. Şimdi gelelim asıl işi yapan kodlarımıza;

require __DIR__ . '/vendor/autoload.php';

$viewId = 'XXXX'; // sizin kopyaladığınız analytics id'niz

$client = new Google_Client();
$client->setAuthConfig(__DIR__ . '/sizindosyaniz.json');
$client->setScopes([
    'https://www.googleapis.com/auth/analytics.readonly'
]);

$analytics = new Google_Service_Analytics($client);

$result = $analytics->data_realtime->get(
    'ga:' . $viewId,
    'rt:activeVisitors',
    [
        'dimensions' => 'rt:pagePath,rt:country,rt:city,rt:longitude,rt:latitude'
    ]
);

$arr = [
    'online' => $result->getTotalResults(),
    'data' => $result->getRows()
];

echo json_encode($arr);

Bunun sonucunda aşağıdaki gibi bir sonuç elde edeceksiniz.

Artık istek attığınız zaman, anlık olarak o zamana ait güncel bilgileri çekebilirsiniz. Tabi PHP kullandığımız için sayfa yenilemeden anlık bilgileri güncelleme vs. yapamıyoruz. Ama en basit yöntem olan polling ajax yöntemini kullanabiliriz. Yani her 2-3 sn’de bir istek yapıp yeni bilgileri ekrana yazdırabiliriz. Bunun için şu şekilde bir kod yeterli;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script>
        function getRealtimeData() {
            $.post('realtime-analytics.php', {}, function (response) {
                $('#online-users').text(response.online);
                $('#online-users-data').html('');
                $.each(response.data, function (key, val) {
                    $('#online-users-data').append('<li>' +
                        'Sayfa: ' + (val[0]) + ' <br> ' +
                        'Lokasyon: ' + (val[1] + '/' + val[2]) + '<br>' +
                        'Kaç Kişi: ' + (val[5]) +
                        '</li>');
                });
                console.log('çalıştı!');
            }, 'json');
        }

        getRealtimeData();
        setInterval(getRealtimeData, 1000);
    </script>
</head>
<body>

<div id="realtime-data">
    <h3>
        Online <span id="online-users"></span> kişi var
    </h3>
    <ul id="online-users-data"></ul>
</div>

</body>
</html>

Burada ben php işlemi yaptığım dosyamın adını realtime-analytics.phpolarak belirledim, siz kendinize göre düzeltirsiniz.

Hepsi bu kadar, umarım açıklayıcı olmuştur ????

PHP ile T.C. Kimlik No Doğrulama

Devletin bize verdiği SOAP servisi sayesinde, T.C. Kimlik Numarasının gerçekten doğru olup olmadığını kontrol edebiliyoruz. Bunuda PHP’de aşağıdaki şekilde kullanıyoruz. Burada dikkat edilmesi gereken gönderilen ad ve soyad’ın büyük harflerle yazılmasıdır. Aksi taktirde doğrulama işlemi çalışmamaktadır. Eğer bu TCKimlikNoDogrula metodu nereden çıktı, TCKimlikNoDogrulaResult property’sini nasıl elde ettik derseniz SoapClientile bağlandığımız yerden aldık bu bilgileri. Yani kafadan oluşturmadık ????

$client = new SoapClient("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL");
try {
    $result = $client->TCKimlikNoDogrula([
        'TCKimlikNo' => '5555555555',
        'Ad' => 'TAYFUN',
        'Soyad' => 'ERBİLEN',
        'DogumYili' => '1993'
    ]);
    if ($result->TCKimlikNoDogrulaResult) {
        echo 'T.C. Kimlik No Doğru';
    } else {
        echo 'T.C. Kimlik No Hatalı';
    }
} catch (Exception $e) {
    echo $e->faultstring;
}

Sıfırdan HTML Dersleri [Videolu]

Merhaba arkadaşlar, youtube kanalımda bir seriye başladım. Ve sıfırdan HTML dersleri paylaşıyorum. Html’i kullansakta ne kadar iyi bildiğimiz tartışılır, bu yüzden bilin ya da bilmeyin bu dersler mutlaka size bir şeyler katacaktır. Umarım yeni başlayanlar için faydalı, bilenler için ufuk açıcı dersler olur. Şimdiden hepinize iyi seyirler ????

Gulp ile İşlerinizi Kolaylaştırın

Merhaba arkadaşlar, front-end çalışmalarında gulp kullandığım şu dönemde bilmeyenler için bir makale yazmaya karar verdim. Öncelikle ne nedir bundan başlayalım ve neden kullanmamız gerek anlayalım.

Gulp nedir?

Gulp, geliştirme yaparken iş akışımızı yavaşlatan işlemleri otomatik yapmamızı sağlayan bir araçtır.

Gulp hangi durumlarda kullanılır?

CSS, HTML, JavaScript ya da Resim dosyalarınızla ilgili işlemler için kullanılabilir.

Ben kısaca CSS’de SASS ve LESS dosyalarımı çalıştırdım, minify ettim, tek dosya haline getirdim. Görselleri sıkıştırarak daha küçük boyut haline getirdim. HTML’leri herhangi bir template engine sisteminde otomatik çıkarttım. Javascript’te minify edip tüm js dosyalarını tek bir js dosyasına çevirdim. Ve bunları yaparken gulp dosyamı ayarladıktann sonra hiçbir şey yapmadım ????

Gulp nasıl kurulur?

Gulp, çalışması için node.js ve npm’in kurulu olması gerek. Öncelikle node.js’i sisteminize kurun. Daha sonra şu komutu çalıştırın;

npm install gulp-cli -g
npm install gulp -D

Burada -D aynı zamanda –save-dev değerine eşittir.

Gulp nasıl kullanılır?

Öncelikle dizininizde gulpfile.js adında bir dosya oluşturun. Gulp ile ilgili işlemleri bu dosya içinde yapacağız. Ancak gulp’ı tek başına kullanmak yetmiyor, başka paketlerde indirmeliyiz. Örneğin;

  • sass compiler için – gulp-sass
  • css minify için – gulp-csso
  • dosyaları birleştirmek için – gulp-concat
  • css’de tarayıcı versiyonuna göre prefix ekletmek için – gulp-autoprefixer
  • resim dosyalarını sıkıştırmak için – gulp-imagemin
  • javascript dosyalarını minify etmek için – gulp-uglify
  • dosyaları silmek için – del
  • html’i sıkıştırmak için – gulp-htmlmin
  • belli bir sırayla taskları başlatmak için – run-seqeuence
  • anlık olarak değişiklikleri görmek için – browser-sync

Bu paketleri tek tek isimleriyle şu şekilde kurabilirsiniz;

npm install --save-dev paket_adi

Burada --save-dev dememizin sebebi, bu paketlere sadece geliştirirken ihtiyacımız var, production’da ihtiyacımız olmadığından bu şekilde kuruyoruz.

Şimdi paketleri kurmadan önce bir tane package.json dosyası oluşturalım. Bunun için şu komutu çalıştıralım;

npm init

Daha sonra enter – enter diyerek sonuna kadar gidelim ve dosyamız oluşmuş olacak. Dosya oluştuktan sonra şunun gibi bir şe yolacak içeriği;

{
  "name": "erbilen-test",
  "version": "1.0.0",
  "description": "",
  "main": "gulpfile.js",
  "dependencies": {
    "gulp": "^3.9.1"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Şimdi bunu neden oluşturduk birazdan anlayacağız. Dilerseniz artık paketleri kurabilirsiniz. Ya da package.json dosyanızı şu şekilde değiştirip;

{
  "name": "frontend",
  "version": "1.0.0",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {},
  "devDependencies": {
    "browser-sync": "^2.26.3",
    "del": "^3.0.0",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^6.0.0",
    "gulp-concat": "^2.6.1",
    "gulp-csso": "^3.0.1",
    "gulp-htmlmin": "^5.0.1",
    "gulp-imagemin": "^4.1.0",
    "gulp-sass": "^4.0.2",
    "gulp-uglify": "^3.0.1",
    "run-sequence": "^2.2.1"
  }
}

Şu komutu çalıştırırsanız otomatik paketler kurulacaktır;

npm install

Paketlerin kurulması biraz zaman alır, kurulduğunda çalıştığınız dizine node_modules diye bir klasör gelecek. Tüm paketler bunun içinde yer alıyor.

Son olarak çalıştığımız klasör içerisinde dist ve src adında 2 klasör oluşturalım. dist burada projenin son hali, src ise sizin çalıştığınız versiyon olacak. Yani production ürünümüz dist içerisinde yer alacak.

Artık gulp’ı ve diğer paketleri beraberinde kullanmaya hazırız. Öncelikle kullanacağımız paketleri sayfamıza dahil edelim. gulpfile.js dosyamız şu şekilde olacak;

const gulp = require('gulp');
const browserSync = require('browser-sync').create();
const sass = require('gulp-sass');
const minifyCSS = require('gulp-csso');
const minifyImg = require('gulp-imagemin');
const minifyJS = require('gulp-uglify');
const minifyHTML = require('gulp-htmlmin');
const concat = require('gulp-concat');
const autoprefixer = require('gulp-autoprefixer');
const del = require('del');
const runSequence = require('run-sequence');

Ve artık tasklarımızı yazmaya başlayalım. Gulp’ta bir task oluşturmanın yolu şudur;

gulp.task('task_adi', () => {
    // işlemler
});

Bunu baz alarak browser-sync için ilk taskımızı oluşturalım.

gulp.task('browser-sync', () => {
    browserSync.init({
        server: {
            baseDir: "dist"
        }
    });
});

Burada baseDir yolunu dist olarak belirledik. Çünkü projemizin son hali orada yer alacak. Ve browser-sync bu klasörü bize serve ederek src altında herhangi bir html’de değişiklik olduğunda sayfayı reload edecek. Burada dikkat etmemiz gereken şey src/*.html yerine src/**/*.html yazmış olmamız. Bu src altındaki .html ile biten ve src altında herhangi bir klasör içinde .html ile biten tüm html dosyaları için geçerli olsun demek.

Şimdide CSS için taskımızı oluşturalım;

gulp.task('css', () => {
    return gulp.src('src/scss/**/*.scss')
        .pipe(sass({
            outputStyle: 'nested',
            precision: 10,
            includePaths: ['.']
        }).on('error', sass.logError))
        .pipe(minifyCSS())
        .pipe(autoprefixer())
        .pipe(concat('app.min.css'))
        .pipe(gulp.dest('dist/css'))
        .pipe(browserSync.stream());
});

Bu taskta sass’ı kullandık, minify ettik, prefixleri eklettik, concat ile tek dosyada birleştirip adını app.min.css koyduk, dest kısmına dist içindeki css klasörüne eklenecek dedik ve son olarak browser-sync kullandık. Bunuda watch ile işlem yaptığımızda anlayacaksınız.

Şimdide JS için taskımızı oluşturalım;

gulp.task('js', () => {
    return gulp.src('src/js/**/*.js')
        .pipe(concat('app.min.js'))
        .pipe(minifyJS())
        .pipe(gulp.dest('dist/js'))
        .pipe(browserSync.stream());
});

Bu taskta yine javascript dosyalarının yolunu belirttikten sonra concat ile tek dosya haline getirdik, uglify ile minift ettik ve dist içindeki js klasörüne çıkarttık. CSS’te olduğu gibi bunda da browser-sync işlemi yaptık.

Şimdide HTML için taskımızı oluşturalım;

gulp.task('html', () => {
    gulp.src('src/**/*.html')
        .pipe(minifyHTML({
            collapseWhitespace: true,
            removeComments: true
        }))
        .pipe(gulp.dest('dist'))
        .pipe(browserSync.stream());
});

Bu taskta da yine html dosyalarının yolunu belirttik, minify ettik ve dist içerisine çıkarttık. HTML’i minify etmek zorunda değilsiniz tabi, ben öyle can sıkıntısına ettim o ayrı ????

Şimdide resimler için taskımızı oluşturalım;

gulp.task('img', () => {
    gulp.src('src/img/**/*')
        .pipe(minifyImg())
        .pipe(gulp.dest('dist/img'));
});

Bu taskta da yine resimlerin yolunu belirttik, minify ettik ve dist içindeki img klasörüne çıkarttık.

Şimdi ne olacak?

Şimdi tasklarımızı oluşturduk. Son 3 taskımız kaldı, bunlardan ilki gulp çalıştığında dist altındaki ilgili dosyaları silmesi için. İkincisi watch ile dosyaları izleyip bir değişiklik olduğunda ilgili taskları yeniden çalıştırmak için, ve son olarak runSequence kullanarak tasklarımızı sırayla çalıştırmak için;

gulp.task('delete', () => del(['dist/css', 'dist/js', 'dist/img', 'dist/**/*.html']));

gulp.task('watch', () => {
    gulp.watch("src/scss/**/*.scss", ['css']);
    gulp.watch("src/js/**/*.js", ['js']);
    gulp.watch("src/img/**/*", ['img']);
    gulp.watch("src/**/*.html", ['html']);
});

gulp.task('default', () => {
    runSequence(
        'delete',
        'html',
        'css',
        'js',
        'img',
        'browser-sync',
        'watch'
    );
});

İlk taskta css, js, img ve .html dosyalarını sildik. Burada ben özellikle belirttim hangileri olacağını, bazen font dosyası vs. atıyoruz dist içine oda silinmesin diye.

İkinci taskta gulp’ın watch özelliğini kullandık. Buda ilgili dosyaları izleyip bir değişiklik olduğunda belirlediğimiz taskları çalıştırmamızı sağlıyor. Hatırlarsanız css, js tasklarında browser-sync ile ilgili bir kod yazmıştık. İşte burada watch ile izlenip değişiklik olduğunda o task çalıştığında browser-sync’de sayfayı otomatik yenileyip değişiklikleri görmemizi sağlayacak.

Son taskımızın adı default, normalde gulp’ı çalıştırırken task adı belirtilmez ise otomatik olarak default taskı çalıştırılır. Bu yüzden adını bu şekilde koyduk. Bu taskta ise sırasıyla tasklarımız çalıştırıyoruz, yani önce delete taskı çalışıp dist içindeki herşeyi silecek, sonra html taskı çalışıp dist içine html dosyalarını atacak, daha sonra css, js, img. Ondan sonra browser-sync bize bir sunucu oluşturup dosyaları canlı olarak izlememize olanacak sağlayacak. Ve son olarak watch taskıda değişiklikleri takip edecek. Artık gulp’ı çalıştırmak için şunu yazmamız yeterli;

gulp

Sonuç şöyle olacak;

MacBooks-MacBook-Pro-2:frontend tayfunerbilen$ gulp
[00:18:12] Using gulpfile /Applications/MAMP/htdocs/frontend/gulpfile.js
[00:18:12] Starting 'default'...
[00:18:12] Starting 'delete'...
[00:18:12] Finished 'default' after 7.77 ms
[00:18:12] Finished 'delete' after 37 ms
[00:18:12] Starting 'html'...
[00:18:12] Finished 'html' after 16 ms
[00:18:12] Starting 'css'...
[00:18:12] Finished 'css' after 451 ms
[00:18:12] Starting 'js'...
[00:18:13] Finished 'js' after 1.4 s
[00:18:13] Starting 'img'...
[00:18:13] Finished 'img' after 1.55 ms
[00:18:13] Starting 'browser-sync'...
[00:18:14] Finished 'browser-sync' after 41 ms
[00:18:14] Starting 'watch'...
[00:18:14] Finished 'watch' after 178 ms
[Browsersync] Access URLs:
 -------------------------------------
       Local: http://localhost:3000
    External: http://192.168.1.21:3000
 -------------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 -------------------------------------
[Browsersync] Serving files from: ./dist/
[00:18:44] gulp-imagemin: Minified 65 images (saved 200 kB - 5.9%)

Şimdi gördüğünüz gibi http://localhost:3000 üzerinden artık projemize ulaşabiliriz. Hatta http://192.168.1.21:3000 üzerinden aynı wifi’ye bağlı diğer cihazlardanda ulaşabiliriz. Böylece bir değişiklik olduğunda tüm cihazlardan aynı anda görebileceğiz.

Son hali

Yazdığım kodların son halini github sayfamda paylaştım. Eğer git kurulu ise;

git clone https://github.com/tayfunerbilen/frontend-gulp.git

diyerek indirebilirsiniz. Ya da şu linkten;
https://github.com/tayfunerbilen/frontend-gulp indirebilirsiniz.

İndirdikten sonra;

npm install
gulp

şeklinde kurup çalıştırabilirsiniz. Hepsi bu kadar ???? Kolaylıklar dilerim.

PHP Multi Process Asenkron Dosya Çalıştırma

Şimdi bildiğiniz gibi PHP’de kodların hepsi execute olduktan sonra sayfada gösterilir. Yani hepsi bitmeden işlem sonuçlanmaz. Bazı durumlar vardır ki, bunun böyle olmasını istemezsiniz. Örnek vermek gerekirse, bir e-posta bülten listeniz olsun. Ve bir konu paylaştıktan sonra atıyorum 5000 kişilik listeye e-posta göndereceksiniz.

Eğer bunu postu paylaşır paylaşmaz yaparsanız mailler gönderilene kadar sayfada bir bekleme süresi olacak. Ancak bizim istediğimiz, bunu arkaplan’da çalıştırarak göndermek. Aslında bunun için çok basit bir şey yazacağız. Öncelikle mailleri gönderecek php dosyasını oluşturalım. Örneğin send-email.php olsun.

<?php

sleep(5); // 5 sn sonra çalış

$postId = $argv[1];
// .. mail gönderme işlemleri vs.

?>

Şimdi postu yayınladıktan sonra şu kodu çalıştırmamız yeterli olacak;

exec('php -f send-email.php -- "5" > /dev/null 2>&1 &');

Burada tabi doğru dosya yolunu vermek önemli. Bu şekilde kodumuz çalıştığında send-email.php’deki 5 saniye bekleme kısmı mevcut sayfaya yansımayacaktır. Biz konumuzu oluşturmuş ve beklemeden işlem yapmaya devam ederken arkaplanda mailler gitmeye devam edecektir. Ayrıca dikkat ettiyseniz send-email.php’ye parametre gönderdik exec() komutu içinde. Gelen parametreleri $argv değişkeninde tutuluyor. 0 indexli olan değer dosyanın adı o yüzden 1’den başlayarak kullanın.

Birden fazla parametre göndermek isterseniz;

exec('php -f send-email.php -- "5" "tayfun erbilen" "deneme" > /dev/null 2>&1 &');

şeklinde gönderebilirsiniz. send-email.php’de $argv[1] $argv[2] $argv[3]şeklinde değerlere ulaşabilirsiniz.

Not: exec() fonksiyonu genelde hostinglerde güvenlikten dolayı kapalı oluyor. Bu yüzden kendi sunucunuzu kullanmaya çalışın, zaten hosting nedir allah aşkına? Boşverin onları ????

Kolay gelsin.

PHP’de İfadeleri Karşılaştırmak

Bazen yönetim paneline girişleri veritabanı yerine dosyada tutuyorum. Basit bir if-else kontrolü ile giriş yaptırıyorum. Bu gibi durumlarda, kullanıcı adı ve şifre nasıl yazıldıysa aynen o şekilde yazdırmak gerekiyor. Yani büyük küçük harfe vs. duyarlı oluyor. Bu gibi durumlar için PHP’de karşılaştırma fonksiyonları var. Örneğin 2 ifadenin doğruluğunu karşılaştırıyor. Mesela;

$a = 'Tayfun';
$b = 'Tayfun';
echo strcmp($a, $b); // Çıktı: 0

Eğer sonuç 0 ise, ifadeler birbirine eşit demektir. Ancak bu örneği şöyle değiştirseydik;

$a = 'Tayfun';
$b = 'tayfun';
echo strcmp($a, $b); // Çıktı: -32

Bu durumda ifadeler birbiriyle eşleşmiyor çünkü büyük küçük harf problemi devreye giriyor. Bunu çözmek için ise strcasecmp() fonksiyonunu kullanabiliriz. Aynı örneği birde şöyle yapalım;

$a = 'Tayfun';
$b = 'tayfun';
echo strcasecmp($a, $b); // Çıktı: 0

Sonuç başarılı. Yani bu gibi durumlar için strcasecmp() fonksiyonu kullanılabilir.

strftime() Türkçe Karakter Hatası ve Çözümü [PHP]

PHP’de türkçe tarih belirlerken setlocale() ve strftime() fonksiyonlarını kullanıyoruz. Örnek vermek gerekirse;

setlocale(LC_TIME, 'tr_TR');
echo strftime('%d %B %Y'); // 28 Eyl l 2018

Ancak bu bazı sunucularda türkçe karakter hatalarına yol açıyor. Örneğin yukarıdaki çıktıda olduğu gibi.. Bu gibi durumlarda iki şey yapılabilir.

1. çözüm yolu

setlocale() fonksiyonunda 2. parametrede dil ve ülke kodu verilirken nokta ile karakter seti tanımlaması yapılabilir. Örneğin;

setlocale(LC_TIME, 'tr_TR.UTF-8');

Bu problemi ortadan kaldıracaktır.

2. çözüm yolu

srtftime() fonksiyonu utf8_encode() fonksiyonundan geçirilebilir. Örneğin;

setlocale(LC_TIME, 'tr_TR');
echo utf8_encode(strftime('%d %B %Y')); // 28 Eylül 2018

Bugün benim başıma geldi, çözümü arayıp buldum. Yarın sizinde başınıza gelirse bu şekilde halledebilirsiniz. Kolay gelsin ????

Mysql Aynı Tabloda Farklı Koşullara Göre Toplam Kayıt Sayısını Bulmak

Farkındayım başlık çok uzun oldu ???? Ancak benim işime yaradığı gibi bir gün sizinde işinize yarayabilir. Şimdi örnek vermek gerekirse, yorumlar tablonuz olsun. Yorumların bazıları onaylı, bazıları onaysız olarak kayıt edilmiş. Ve siz toplam yorum sayısını, onaylı yorum sayısını ve onay bekleyen yorum sayısını bir sorguda almak istiyorsunuz. Mantıken nasıl yaparsınız? Ya subquery kullanırsınız ya da bunun yerine SUM() fonksiyonun kullanırsınız. Hemen bir örnek verelim.

Eğer count() fonksiyonunu kullanırsak;

SELECT count(yorum_id) toplam FROM yorumlar;

Sonuç;

+--------+
| toplam |
+--------+
|  2052  |
+--------+

Şimdi SUM() fonksiyonu ile birlikte şöyle bir kullanım yapacağız. Örneğin onay 1 ise onaylı yorumları, 0 ise onaysız yorumları saydıracağız.

SELECT
    count(yorum_id) toplam,
    SUM(onay = 1) onayli_yorumlar,
    SUM(onay = 0) onaysiz_yorumlar
FROM
    yorumlar

Sonuç;

+--------+-----------------+------------------+
| toplam | onayli_yorumlar | onaysiz_yorumlar |
+--------+-----------------+------------------+
|   2052 |               1 |             2051 |
+--------+-----------------+------------------+

Son olarak, eğer birden fazla tabloyu join ile bağladıktan sonra count işlemi yaptığınızda rakamlar saçmalıyorsa DISTINCT ile benzersizleri toplamak gerekir. Ama onun kullanımı biraz daha karışık, şöyle bir kullanım gerektiriyor;

SELECT
    count(yorum_id) toplam,
    REPLACE(SUM(onay = 1) * count(DISTINCT yorum_id) / count(*), '.0000', '') onayli_yorumlar,
    REPLACE(SUM(onay = 0) * count(DISTINCT yorum_id) / count(*), '.0000', '') onaysiz_yorumlar
FROM
    yorumlar
INNER JOIN
    ...

Bu yazım bu kadardı, bir gün böyle birşeye ihtiyaç olursa zaten takıldığınız noktada yorum yazarsınız. Kolay gelsin ????

MySQL’de Trigger Kullanımı

Bu makalede sizlerle MySQL’de trigger’ların nasıl kullanıldığını ve amacını konuşacağız. Eğer MySQL’de neden trigger kullanmalıyım sorusuna cevap arıyorsanız kendinize şu soruyu sormanız gerek. Herhangi bir insert, update ya da delete işleminden sonra bir işlem yaptırmak ister miydiniz? Benim anlatacağım senaryoda, posts adında bir tablom olsun. Bu tabloda makalelerimi tutuyorum. Ve makaleyi güncellediğimde, eski versiyonunu revisions tablosuna post id’si ile birlikte kaydetmek istiyorum.

İşte tam olarak bu aşamada bir trigger yazmamız gerek tabi eğer bu işlemi mysql’de çözmek istiyorsak. Yok arkadaş ben PHP’de if ($insert) ise o zaman şuraya $db->query() yazarım diyorsan o senin ameleliğin olur, bir şey diyemem ????

Şimdi gelelim bu trigger’ları oluşturmak nasıl oluyor. Temel anlamda bir trigger’ın ihtiyacı olan syntax şudur;

DELIMITER $$
CREATE TRIGGER [trigger_adi] [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON [tablo_adi]
    FOR EACH ROW 
        BEGIN
            -- işlemler
        END$$
DELIMITER ;

Burada DELIMITER $$ ve kısımları, mevcut delimiter’ı $$ ile değiştirmemizi yarıyor. Çünkü defualt olarak ; (noktalı virgül) olduğundan biz trigger içinde herhangi bir noktalı virgül kullanınca kodlar patlıyor. Bu yüzdendir ki bir bütün olarak yorumlanması için delimiter’ı değiştirip $$ yapıyoruz ve END kısmının bitişine noktalı virgül yerine $$ koyuyoruz.

Şimdi gelelim bizim senaryoya. Tablomuz posts tablosuydu ve kolonlarımız id, title ve content olsun. Birde revisions diye bir tablom vardı aynı şekilde id, post_id, title, content, created_at kolonlarına sahip olsun. Şimdi ben posts tablosunda bir veri güncellendiğinde, eski halini revisions tablosuna kaydedecek bir trigger yazmak istiyorum. Nasıl yazarım?

DELIMITER $$
CREATE TRIGGER after_post_update AFTER UPDATE ON posts
    FOR EACH ROW 
        BEGIN
            IF NEW.title != OLD.title OR NEW.content != OLD.content THEN
                INSERT INTO revisions SET post_id = OLD.id, title = OLD.title, content = OLD.content;
            END IF;
        END$$
DELIMITER ;

Burada OLD ve NEW diye anahtarlar gördünüz. Eğer INSERT için trigger yazıyorsak sadece NEWUPDATE için yazıyorsak OLD ve NEWDELETE için yazıyorsak sadece OLD anahtarlarını kullanarak eski ve yeni değerlere ulaşabiliyoruz. Yani trigger’daki OLD.title, update olmadan önceki title değerini, NEW.title update olduktan sonraki title değerini temsil ediyor. Dolayısı ile biz trigger’da şunu yaptık, eğer eski başlık yeni başlıktan farklı ise ya da eski içerik yeni içerikten farklı ise o zaman revisions tablosuna bunu kaydet.

Mevcut trigger’ları görmek isterseniz şu komutu kullanabilirsiniz;

SHOW TRIGGERS;

Oluşturduğunuz trigger’ı kaldırmak için ise;

DROP TRIGGER [trigger_adi]