ZipMaster – Php İle Klasörleri Ve Dosyaları Ziplemek

Php ile uğraşan bir çok kişi, Php‘deki zip kütüphanesinin klasör altındaki klasörlerin arşivlemediğini öğrenmiştir. İnternette bunu yapabilmek için bir çok yöntem mevcut ama karışık ve dağınık halde bulunuyor. Ben de kendi sunucumda sitelerin ve projelerin yedeklenmesini otomatik hale getirmek için bir klasör altındaki dosya ve klasörlerin tamamını arşivleyip zip dosyası oluşturan bir script oluşturdum. Umarım herkesin işine yarar.

ZipMaster github üzerinde bulunmaktadır. Geliştirmek isteyenlerin forklayıp ve pull request göndermesi yeterlidir. Aşağıda ve github üzerinde örnek kullanımı bulabilirsiniz;

<?php

include 'ZipMaster.php';

$zip = new ZipMaster\ZipMaster('backup/test.zip', 'test_folder');
$zip->archive();

Mysqlexport – Veritabanını Php İle Dışarı Aktarmak

İster programcı olun ister web sitesi olan herhangi birisi, herkesin başına gelmiştir; veritabanlarınızı yedeklemek istersiniz ama paylaşımlı hosting kullanırsınız ve hosting firmasından kaynaklı problemler ile veritabanınızı ya da veritabanlarınızı dışarıya aktarıp yedeklemek imkansız hale gelir. Böyle bir sorunuz olmasa bile benim gibi kendi sunucunuzu yönetebilirsiniz ve birçok veritabanınızı elle yedeklemek size zor gelir. Tüm veritabanlarınızı otomatik olarak yedekleyecek bir sisteminiz olsun istersiniz.

Zaten programcı dediğiniz tembel olur, tembel kalabilmek için her şeyi otomatikleştiren veya kolaylaştıran insanlardır. Programı çalıştırdığı esnada kahve makinesinin kahve oluşturmaya başlaması ve tam onun yanına geldiği esnada kahve oluşturmayı bitirmesi için kod yazan sistem yöneticileri gördü bu dünya. İşte ben böyle insanları takdir ederim.

Ben de sunucumdaki veritabanlarını otomatik olarak yedeklemesi için bir php sınıfı oluşturdum. Cronjob oluşturarak bu dertten kurtulacağım. Siz de isterseniz benim gibi otomatik yedekleme için kullanın, isterseniz web üzerinden gireceğiniz bir şifre ile yedekleyen özel sayfa oluşturun.

Oluşturduğum mysqlexport projesine https://github.com/erhankilic/mysqlexport adresinden oluşabilirsiniz.

Aşağıdaki örnek kullanım ile istediğiniz gibi veritabanlarınızı yedekleyebilirsiniz. Yalnız tüm veritabanlarına erişim yetkisi olan bir kullanıcı ile yapmalısınız. Aksi takdirde hangi veritabanına yetkisi varsa sadece onu yedekleyecektir.

Kullanım Basamakları;

  1. Öncelikle include ile sınıfımızı programımıza dahil ediyoruz.
  2. Bir değişkene oluşturduğumuz yeni sınıfı atıyoruz. İlk parametrede yedeklenecek yerin yolunu yazıyoruz. Daha sonra sırasıyla veritabanı bağlantı adresini (genelde localhost olur), kullanıcı adını ve kullanıcı şifresini parametreler olarak yazıyoruz.
  3. Bundan sonra iki seçeneğimiz var. İster setDatabases(array $databases) ile bir array içerisinde yedeklemek istediğimiz veritabanlarını programa tanımlıyoruz ya da getDatabases() fonksiyonu ile veritabanlarının isimlerini çekmesini sağlıyoruz.
  4. En sonunda da export() fonksiyonu ile yedekleme işlemini bitiriyoruz.
<?php
include 'Export.php';
$export = new MysqlExport\Export('backup', 'localhost', 'root', 'dev1');
$export->getDatabases();
$export->export();

importSqlWithPhp – Php ile Sql Dosyası Yükleme (Import Etme)

Bazen Phpmyadmin ya da herhangi bir veritabanı programı kullanamadığınız zamanlar olur ve Sql dosyasını veritabanına yüklemek için başka seçenekler kullanmak zorunda kalırsınız. Burada ise Php‘de hem eski mysql_query hem de yeni mysqli_query kullanarak nasıl yükleyebileceğinize dair bilgilendirme yapacağım. Dosyalara aynı zamanda Github projemden de ulaşabilirsiniz.

Her iki yöntemde de yapmanız gereken şunlardır. Sql dosyası ile oluşturacağınız php dosyasını aynı yere yükleyip site adresi üzerinden php dosyasını çalıştırmak. Sunucu üzerinden konsol komutları ile de çalıştırabilirsiniz.

$filename değişkeni dosya ismi ile güncelleyin. $mysql_host ismini ise veritabanı sunucusu ile güncelleyin. Veritabanı sunucusu farklı değilse olduğu gibi bırakabilirsiniz. $mysql_username ve $mysql_password veritabanı için oluşturduğunuz kullanıcı adı ve şifredir. $mysql_database ise veritabanı ismidir. Gerekli şekilde güncellersiniz.

Mysql_query Fonksiyonu İle

<?php

// Name of the file
$filename = 'sql.sql';
// MySQL host
$mysql_host = 'localhost';
// MySQL username
$mysql_username = 'username';
// MySQL password
$mysql_password = 'password';
// Database name
$mysql_database = 'database';

// Connect to MySQL server
mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error());
// Select database
mysql_select_db($mysql_database) or die('Error selecting MySQL database: ' . mysql_error());

// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
 if (substr($line, 0, 2) == '--' || $line == '')
 continue;

// Add this line to the current segment
 $templine .= $line;
// If it has a semicolon at the end, it's the end of the query
 if (substr(trim($line), -1, 1) == ';') {
 // Perform the query
 mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
 // Reset temp variable to empty
 $templine = '';
 }
}
echo "Tables imported successfully";
?>

Mysqli_query Class’ı İle

<?php

// Name of the file
$filename = 'sql.sql';
// MySQL host
$mysql_host = 'localhost';
// MySQL username
$mysql_username = 'username';
// MySQL password
$mysql_password = 'password';
// Database name
$mysql_database = 'database';

// Connect to MySQL server
$con = @new mysqli($mysql_host,$mysql_username,$mysql_password,$mysql_database);

// Check connection
if ($con->connect_errno)
 {
 echo "Failed to connect to MySQL: " . $con->connect_errno;
 echo "<br/>Error: " . $con->connect_error;
 }

// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
 if (substr($line, 0, 2) == '--' || $line == '')
 continue;

// Add this line to the current segment
 $templine .= $line;
// If it has a semicolon at the end, it's the end of the query
 if (substr(trim($line), -1, 1) == ';') {
 // Perform the query
 $con->query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . $con->error() . '<br /><br />');
 // Reset temp variable to empty
 $templine = '';
 }
}
echo "Tables imported successfully";
$con->close($con);

 

Php İle Haftanın Günlerini Bulmak

Merhaba arkadaşlar. Bugün, bulunduğumuz hafta dahil olmak üzere 5 haftanın günlerini tek tek bulmam gerekti. Yazdığım kodları dilediğiniz gibi kullanarak istediğiniz günleri elde edebilirsiniz. Mantığını basittir. DateTime classını bilmeniz yeterlidir.

Sadece hafta içlerini bir dizide toplamaktayım. Bunu $lastDay değişkeni cuma olarak ayarladıktan sonra döngünün başında 3 gün sonraya güncelliyorum. Böylece pazartesiyi bulmuş oluyorum ve her günü ayrı ayrı diziye giriyorum.

// Bugünü oluşturuyoruz
 $today = new DateTime();
// Bulunduğumuz haftanın başını buluyoruz.
 $monday = clone $today;
 $monday = $monday->modify(('Sunday' == $monday->format('l')) ? 'Monday last week' : 'Monday this week');
// Oluşturacağım döngüdeki $lastDay değişkenini bör önceki haftanın cuması olarak ayarlıyorum. Böylece pazartesiye güncelleyebileceğim.
 $lastDay = clone $monday;
 $lastDay = $lastDay ->modify('-3 day');
// 5 haftayı belirten dizimizi oluşturuyoruz.
 $dates = array(
  "week1" => array(),
  "week2" => array(),
  "week3" => array(),
  "week4" => array(),
  "week5" => array()
 );
// Döngümüzü başlatıyoruz. Burada $dates dizimizi foreach içerisine sokuyoruz.
foreach ($dates as $key => $date) {
// $lastDay değişkenini kullanarak haftanın ilk gününü buluyoruz.
 $firstDay = clone $lastDay;
 $firstDay = $firstDay->modify('+3 day');
// Bundan sonra her günü bir artırarak geri kalan 4 günü buluyoruz.
 $secondDay = clone $firstDay;
 $secondDay = $secondDay->modify('+1 day');
 $thirdDay = clone $secondDay;
 $thirdDay = $thirdDay->modify('+1 day');
 $forthDay = clone $thirdDay;
 $forthDay = $forthDay->modify('+1 day');
 $fifthDay = clone $forthDay;
 $fifthDay = $fifthDay->modify('+1 day');
// $lastDay değişkenini 5. gün yani cuma olarak ayarlıyoruz. Bu şekilde döngünün başında pazartesiyi bulabileceğiz.
 $lastDay = clone $fifthDay;
// $date dizisinde ilgili haftaya günleri ekliyorum. Burada ben farklı indexler kullandım. İstediğiniz gibi düzenleyebilirsiniz.
 $dates[$key] = array(
  $firstDay->format('M d D') => $firstDay->format('Y-m-d'),
  $secondDay->format('M d D') => $secondDay->format('Y-m-d'),
  $thirdDay->format('M d D') => $thirdDay->format('Y-m-d'),
  $forthDay->format('M d D') => $forthDay->format('Y-m-d'),
  $fifthDay->format('M d D') => $fifthDay->format('Y-m-d'),
 );
}

PHP ve Json

phpjsonPHP ve Json ikilisi arasındaki ilişkiyi ve Json’un PHP’de kullanımını anlatmak için öncelikle Json nedir onun üzerinde duralım.

Programlamada farklı platformlar arasında veri alışverişi ihtiyacı vardır. Mesela bir sosyal platformdan son paylaşımları çekip kendi projenizde kullanmak isteyebilirsiniz. Bu tür işlemler için platformlar arasında bir paylaşım olması lazımdır. Bu paylaşım için bazı teknolojiler geliştirilmiştir. Mesela bunlardan birisi XML teknolojisidir. Fakat XML, Javascript ile beraber iyi kullanılamamaktadır. İşte burada Json, Javascript ile uyumlu olduğundan çok tercih edilmektedir.

Json içerisindeki veriler her programlamada bulunan dizi ve obje şeklindedir.

Object

“{“ ile başlar ve “}” ile biter. İçerisine veriler “Anahtar” ve “Veri” şeklinde yazılır. Örnek;

{
 "name": "Erhan",
 "surname": "Kılıç"
}

Dizi

“[“ ile başlar ve “]” ile biter. İçerisindeki veriler sadece “Veri” şeklinde yazılır. Örnek;

[
 "Erhan", "Kılıç"
]

Json içerisinde ikisi bir arada istenildiği gibi kullanılabilir. Örnek;

{
 "tip": "kitap",
 "tur": "roman",
 "urunler": [
 {"ad": "Ihtiyar Kemanci", "yazar": "Nihat Genc"},
 {"ad": "Su Cilgin Turkler", "yazar": "Turgut Ozakman"},
 {"ad": "Kar", "yazar": "Orhan Pamuk"}
 ]
}

Json’un tercih edilmesinin en önemli sebebi Javascript’deki obje ve dizi yapısının tamamen aynı olmasıdır. Örnek olarak Javascript‘te de yapmaya çabaladığımızda siz de farkedeceksiniz.

PHP’de Json Fonksiyonları

Php’de Json ile ilgili işlemler şu şekilde yapılabilir. Kendi sitemizde Javascript ya da jQuery, AngularJs gibi kütüphanelerinde kullanmak için, başka platformlarla veri paylaşımında bulunup api oluşturmak için verileri Json formatında ekrana yazdırabiliriz. Başka bir yerden Json ile çektiğimiz veriyi php uygulamamızda kullanmak için kullanabiliriz.

Dikkat etmemiz gereken şey şudur. Eğer aşağıdaki fonksiyonları kullanmazsak bir string değer gibi algılayacağından içerideki verilere erişmek hayli zahmetli olacaktır.

json_encode()

Bu fonksiyon istediğimiz veriyi Json olarak yazdırmamızı sağlar. Örnek Kullanım;

$dizi = array(
 "tip"=> "kitap",
 "tur"=> "roman",
 "urunler"=> array(
 array("ad"=> "Ihtiyar Kemanci", "yazar"=> "Nihat Genc"),
 array("ad"=> "Su Cilgin Turkler", "yazar"=> "Turgut Ozakman"),
 array("ad"=> "Kar", "yazar"=> "Orhan Pamuk")
 )
);
$json = json_encode($dizi);
echo $json;

json_decode()

Bu fonksiyon ise bir yerden çektiğimiz Json veriyi decode ederek php yazılımımız içerisinde kullanmamızı sağlar. İçerideki verilere ise objedeki bir veriye ulaşır gibi ulaşabiliriz. Aşağıdaki örnekte Json veriyi bir string veri olarak oluşturuyorum. Çünkü dışarıdan Json veri çektiğimizde string bir veri olarak gelecektir aynı şekilde. Örnek;

$json ='{
 "tip": "kitap",
 "tur": "roman",
 "urunler": [
 {"ad": "Ihtiyar Kemanci", "yazar": "Nihat Genc"},
 {"ad": "Su Cilgin Turkler", "yazar": "Turgut Ozakman"},
 {"ad": "Kar", "yazar": "Orhan Pamuk"}
 ]
}';
$veri = json_decode($json);
echo $veri->tip;
echo $veri->tur;
foreach($veri->urunler as $urun){
 echo vardumb($urun);
 echo "<br/>";
}

Fonksiyon içerisinde ikinci bir parametre olarak true eklersek obje olarak değil direk dizi olarak kaydecektir ve erişimimiz de bu şekilde değişecektir. Örnek;

$json ='{
 "tip": "kitap",
 "tur": "roman",
 "urunler": [
 {"ad": "Ihtiyar Kemanci", "yazar": "Nihat Genc"},
 {"ad": "Su Cilgin Turkler", "yazar": "Turgut Ozakman"},
 {"ad": "Kar", "yazar": "Orhan Pamuk"}
 ]
}';
$veri = json_decode($json, true);
echo $veri[tip];
echo $veri[tur];
foreach($veri[urunler] as $urun){
 echo vardumb($urun);
 echo "<br/>";
}

PHP Kullanarak CSV Dosyası Oluşturma

PHP‘de, CSV uzantılı dosya oluşturabilmek için tanımlanmış fonksiyonlar vardır. PhpExcel gibi kütüphaneler yerine bu fonksiyonları kullanmanın bir kaç avantajı vardır. Daha az kaynak tüketir ve dolasıyla daha hızlıdır.

Öncelikle CSV dosyamızı oluşturacak fonksiyonumuzu oluşturalım.

function array_to_csv_function($array, $filename = "export.csv", $delimiter=";") {
 // Bir temp dosyası açmak yerine bellek alanı kullanıyoruz. 
 $f = fopen('php://memory', 'w');
 // Verilerimizin olduğu diziyi döngüye sokuyoruz
 foreach ($array as $line) {
 // Dizimizin içindeki her dizi, CSV dosyamızda bir satır olmaktadır.
 fputcsv($f, $line, $delimiter);
 }
 // Dosya başlangıc işaretini sıfırlıyor
 fseek($f, 0);
 // Tarayıcıya bir csv dosyası olduğunu belirtiyor
 header('Content-Type: application/csv');
 // Tarayıcıya görüntülenmek için olmadığını, kaydedilmek için olduğunu belirtiyor. 
 header('Content-Disposition: attachment; filename="'.$filename.'";');
 // Üretilen CSV tarayıcıya iletiliyor.
 fpassthru($f);
}

Bu fonksiyonumuz ile içerisine bir dizi ve dosya ismi göndererek CSV dosyasını oluşturmasını ve tarayıcıya çıktı vermesini sağlıyoruz. Kod içerisinde her bir satırı yorumlar ile açıkladım. Bu fonksiyonda geçici bir temp dosyası kullanmak yerine bellek alanı kullanmasını sağladım. Eğer geçici bir temp dosyası kullanmasını isterseniz $f = fopen(‘php://memory’, ‘w’); yerine $f = fopen(‘php://output’, ‘w’); komutunu kullanın.

Daha sonra ise ister veritabanından çekerek ya da ister json verisi olarak çekerek her bir satır dizi olacak şekilde bir dizi oluşturuyoruz ve fonksiyonumuza gönderiyoruz. Bu kadar. Örnek olarak aşağıda kod yazım.

$basliklar = array("Ad", "Soyad");
$satir1 = array("Erhan", "Kılıç");
$satir2 = array("Onur", "Bakır");

$icerik = array($basliklar, $satir1, $satir2);
array_to_csv_function($icerik, "export.csv");
// Diğer bir şekilde kullanımı
array_to_csv_function(array($basliklar, $satir1, $satir2), "export.csv");