ASP.NET C# C/C++ Genel HTML/CSS Java JS/Ajax PHP XML Forum

Bir Web Sayfasının Başlığını Çekme

Bir Web Sayfasının Başlığını Çekme

Merhaba arkadaşlar,

Bu makale ile bir web adresinin ... tagları arasındaki kısmı nasıl çekeceğimizi göreceğiz. Projelerinizde belki kullanma isteği duyarsınız. Üyelerinize girilen sayfanın başlığını göstermek istersiniz belki..

Hemen başlayalım.. Öncelikle bir fonksiyon oluşturalım ve bu fonksiyon bizim başlık çeken fonksiyonumuz olsun..

<?php

/**
 * @author oralunal
 * @copyright 2011
 */

/**
 * baslikCek()
 * 
 * @param mixed $url
 * @return
 */
function baslikCek($url){
    $icerik = file_get_contents($url); // Sayfa içeriğini alalım
    $kalip = "|<[s]*title[s]*-->([^<]+)<[s]*/[s]*title[s]*>|Ui";
    if(preg_match($kalip, $icerik, $match)){ //Arama yapalım varsa değeri yoksa false return edelim
        return $match[1]; 
    }else{ 
        return false; 
    }
}

?>

Yukarıdaki fonksiyonumuz $url ile yollanan web sayfasını açıyor. İçerisinde title taglarını arıyor. Eğer title tagları mevcutsa arasındaki değeri döndürüyor. Eğer bağlandığı web sayfasında title tagı mevcut değilse false dönüyor. Kullanımı da aşağıdaki gibidir:

<?php

/**
 * @author oralunal
 * @copyright 2011
 */

$url    = 'http://www.trkodlama.com';
$baslik = baslikCek($url);

echo ""$baslik"";

?>

Yukarıdaki scriptin ekran çıktısı aşağıdaki gibi olacaktır:
TR Kodlama - Güncel Programlama Makaleleri

Kolay gelsin,




jQuery ile Div'i Ortalama

jQuery ile Div\'i Ortalama

Merhaba arkadaşlar,

Bugün jQuery kullanarak bir div elementini sayfanın nasıl ortasına yerleştireceğinizi anlatıyorum.

Bu makalede jQuery'nin width() ve height() fonksiyonlarından faydalanıyoruz. Lafı fazla uzatmayalım. Öncelikle bir index.html adlı dosya oluşturalım. Daha sonra bu dosyanın içine aşağıdaki kodu ekleyelim:

<html>
<head>
<script type="text/javascript" src="jQuery.js"></script>
<script>$(document).ready(function(){
    var blok = $('#orta');
    var yuk = $j(window).height();
    var gen = $j(document).width();
    var sT = window.scrollY;
    $('#orta').css({
        left : gen/2 - (blok.width() / 2),
        top : sT + yuk/2 - (blok.height() / 2)
    });
});
</script>
<style>
body{
    background-color: #0000CC;
}
#orta{
    position: absolute;
    width: 250px;
    height: 250px;
    background-color: #CC0000;
}
</style>
</head>
<body>
    <div id="orta">Bu Blok Sayfayı Tam Ortalayacaktır</div>
<body>
</html>

Burada tam olarak şunu yaptık. yuk değişkenine geçerli pencerenin yüksekliğini atadık. #orta adlı bloğun top değerini bulduğumuz yuk değerinin yarısından #orta adlı bloğun yarısını çıkararak bulduğumuz değeri atadık. Bu sayede sayanın dikey olarak tam ortasına yerleştirmiş oluyoruz. Aynı mantıkla yatay olarak yerleştirdik.

Herkesin problemi var genelde bu sayfa ortalama ile ilgili. Bende paylaşmak istedim sizinle. Umarım anlatabilmişimdir.

Kolay gelsin,





Gönderdiğiniz E-Posta Okundu mu?

Gönderdiğiniz E-Posta Okundu mu?

Merhaba arkadaşlar,

Bir süredir tembelliğim ve işlerimin yoğunluğu nedeniyle bir paylaşımda bulunamadım. Ama faydalı bir makale ile tekrar buradayım.

Bu makale ile PHP ve .htaccess kullanarak gönderdiğiniz epostaların okunup okunmadığını nasıl kontrol edebileceğinizi anlatıyorum. Öncelikle 'eposta' adlı bir klasör oluşturalım. Bu makalede ben '/resimler/eposta/' dizinini kullanıyorum. Bu klasörün içinde yeni bir .htaccess dosyası oluşturun. AllowOverride ayarınızın All olarak ayarlı olduğundan emin olun.

.htaccess dosyanıza aşağıdaki kodu ekleyin:

RewriteEngine On
ReWriteRule ^resim(.*?)-d{4}.png$ takip.php?x=$1 [L]

Sonraki adım da 1x1 piksel boyutlarında takip.png adlı bir dosyası oluşturun ve bunu da aynı klasörün içine atın. Bu resim epostanızın içinde açılacaktır.

Daha sonra takip.php adlı bir dosya daha oluşturun. Bu dosyada gönderdiğinizin epostanın okundu işlemini yapacağız.

<?php
$takipId = $_REQUEST['x'];
// $takipId ile epostanın gönderildiği kişinin Id'sini çekiyoruz.
// Veritabanında bu kişiyi bulup okudu sütununu 1 olarak değiştiriyoruz
// Veritabanı işleminin mantığını anlattım sadece
 
header('Content-Type:image/png');
echo file_get_contents('takip.png'); 
?>

Eposta yollarken aşağıdaki HTML kodu epostanızın sonuna ekleyin. Bu sayede ID'si 1234 olan kullanıcı epostayı açtığında ve o resim yüklendiğinde veritabanında okundu olarak işaretlenecektir. htaccess ile çalışan scriptimizi çok basit bir şekilde maskeledik.

<img src='http://www.trkodlama.com/resimler/email/resim1234.png'>

Yararlı olur diye düşündüm, kolay gelsin..



Fatal error: Cannot redeclare function Hatası

Fatal error: Cannot redeclare function Hatası

Merhaba arkadaşlar,

Sıkıcı bir günün ardından PHP programlamaya yeni başlayanların hep başına gelen bir hatadan bahsediyorum.

Fatal error: Cannot redeclare function

Bu hata ile bende zamanında çok karşılaşıyordum. Düzensiz bir template sistemim olurdu. Template dosyamın içinde bir fonksiyon oluştururdum. Fakat aynı fonksiyonu asıl işlemlerimi yaptığım sayfada da tanımlıyordum. Bu şekilde iki farklı yerde aynı adla iki fonksiyon tanımlayınca PHP'nin kafası karışıyor ve hata veriyor. Şimdi örnek bir fonksiyon yazalım:

<?php
function foo($deger) {
 return $deger;
}
?>

Bildiğiniz gibi programcı insan biraz tembel ve üşengeçtir. Bu nedenle bu fonksiyon var mı yok mu diye kontrole etmek yerine basit bir fonksiyon ise tekrar yazar template dosyasında. İşte bu noktada basit bir kontrolle bu işlemi hata almadan atlatabiliriz:

<?php
if(!function_exists('foo')){
    function foo($deger) {
         return $deger;
    }
}
?>

function_exists() fonksiyonu böyle bir fonksiyon var mı yok mu diye kontrol etmemizi sağlar. Eğer bu isimle bir fonksiyon tanımlı değilse yeni fonksiyonumuzu tanımlamamıza imkan verir.

Yeni yeni uğraşanlar için güzel bir makale oldu bence, kolay gelsin.



Mod Rewrite ile RFI Ataklarını Engelleme

Mod Rewrite ile RFI Ataklarını Engelleme

Merhaba arkadaşlar,

Bugün size web sitenize RFI(Remote File Inclusion) ataklarından nasıl korunabileceğiniz göstereceğim. Öncelikle RFI atak neymiş kısaca bir anlatalım.

RFI atak uzaktan dosya dahil etmektir. PHP scriptlerde bulunan bir açıktır. Web sitesine uzaktan bir dosya eklemenizi sağlar. Değişkenlerinizin tanımlı olmadığı yerlerde yani değişkenleriniz boş olduğu anda buralarda RFI açıklar meydana gelir. RFI atağı ile o değişkene uzaktan eklenen dosyanın değeri atanır. Bu işlemin file upload işlemleriyle alakası yoktur. Shell dosyaları ile yapılır.

Şimdi http://, https:// veya ftp:// için yapılan sorgu satırlarımızı kontrol edelim:

RewriteCond %{QUERY_STRING} (.*)(http|https|ftp)://(.*)

Eğer bu rewrite koşulunu .htaccess dosyanızda kullanıyorsunuz bütün benzer istekleri aşağıdaki komutlar ile engelleyelim:

RewriteRule ^(.+)$ - [F]

Eğer vHost'unuza erişim izniniz varsa bu denemleri kayıt altına alabilirsiniz:

&ltIfModule mod_rewrite.c>

   RewriteEngine on
   RewriteCond %{QUERY_STRING} (.*)(http|https|ftp)://(.*)
   RewriteRule ^(.+)$ - [env=rfi:true]
</IfModule>
CustomLog /kayitlarinizin/tutuldugu/dizin/rfi.log combined env=rfi

Aynı zamanda yukarıdaki rewrite komutlarından kaynaklanan istekleride engelleyebilirsiniz:

Deny from env=rfi

Umarım kimsenin başına gelmeden tedbirinizi almış olursunuz. Kolay gelsin,



PHP ile XML Dosyayı İşlemek

PHP ile XML Dosyayı İşlemek

XML(Extensible Markup Language) bilgilerinizi dallandırılmış halde saklamak için kullanılır. Genellikle uygulamalar arasında bilgi paylaşımı yapmak için kullanılır aynı zamanda RSS beslemeleride XML ile yapılmaktadır.

PHP 5'in ortaya çıkmasıya XML işleme desteği muhteşem bir şekilde arttı. Bu makale ile bizde PHP ile XML dökümanı işleme, değiştirme ve XML döküman oluşturma işlemlerini öğrenmiş olacağız. Makalenin en altında RSS beslemelerinin nasıl yapıldığını göreceğiz ve aynı zamanda basit bir RSS besleme okuyucusu hazırlamış olacağız.

Bu makaleyi tam anlamıyla kavrayabilmek için nesne tabanlı programlamaya hakim olmanız gerekiyor. Ayrıca XPath terimini biraz araştırmanız da fayda var. Çünkü bu makalede kullanacağız fakat olmasada olurlardan. O zaman başlayalım...

Parsing XML

PHP 5 SimpleXML isimli kullanımı basit olan bir sınıfa sahiptir.

Bu makale boyunca makaleler.xml adlı bir dosya oluşturdum ve trkodlama.com'da seçilmiş rastgele bir kaç makaleyi ekledim

<?xml version="1.0"?>
<makaleler>
  <makale id="1">
    <baslik>PHP Dersleri 1</baslik>
    <giris>Echo komutu</giris>
  </makale>
  <makale id="2">
    <baslik>PHP Dersleri 2</baslik>
    <giris>Degiskenler</giris>
  </makale>
  <makale id="3">
    <baslik>PHP Dersleri 3</baslik>
    <giris>Kendi fonksiyonumuzu olusturalim</giris>
  </makale>
</makaleler>

Şimdi PHP dosyamız ile XML dosyasını iki türlü işleme alabiliriz. Ya içeriği komple çekeriz ya da dosyanın yerini gösteririz:

<?php
// İçeriği çekelim
$veri = file_get_contents('makaleler.xml');
$makaleler = SimpleXMLElement($veri);
//-------------------
// Dosyanın yerini gösteririz
$makaleler = SimpleXMLElement('makaleler.xml', null, true);
?>

Eğer makaleler.xml dosyası kendi sunucunuzda bulunuyorsa file_get_content() kullanamaya hiç gerek yoktur. file_get_contents() fonksiyonu ile çağırma işlemini sadece farklı web sunucularından XML dosya çekmek zorundaysak kullanmamız en temizi ve güzeli olurdur.

Dosyayı yüklemenin bir başka yöntemi ise simplexml_load_file() fonksiyonunu kullanmaktır. Bunu da şu şekilde gerçekleştirebiliriz:

$makaleler = simplexml_load_file('makaleler.xml');

Şimdi XML dosyamızdaki verileri HTML tabloya yazdıralım

<?php
// SimpleXML
$makaleler = new SimpleXMLElement('makaleler.xml', null, true);

echo <<<EOF
<table>
        <tr>
				<th>ID</th>
                <th>Başlık</th>
                <th>Giriş</th>
        </tr>

EOF;
foreach($makaleler as $makale)
{
        echo <<<EOF
        <tr>
                <td>{$makale['id']}</td>
                <td>{$makale->baslik}</td>
                <td>{$makale->giris}</td>
        </tr>

EOF;
}
echo '</table>';
?>

Bu işlemin HTML çıktısı aşağıdaki gibi olacaktır:

<table>
        <tr>
                <th>ID</th>
                <th>Başlık</th>
                <th>Giriş</th>
        </tr>
        <tr>
				<td>1</td>
                <td>PHP Dersleri 1</td>
                <td>Echo komutu</td>
        </tr>
        <tr>
                <td>2</td>
                <td>PHP Dersleri 2</td>
                <td>Degiskenler</td>
        </tr>
        <tr>
                <td>3</td>
                <td>PHP Dersleri 3</td>
                <td>Kendi fonksiyonumuzu olusturalim</td>
        </tr>
</table>

Peki siz makalelerden sadece ikinci makalenin başlığını çekmek istiyorsunuz. O zaman şöyle yaparız(dizilerde sayma işleminin 0'dan başladığını hatırlayın)

echo $makaleler->makale[1]->baslik;

Aynı makalenin ID'sini şu şekilde çekiyoruz:

echo $makaleler->makale[1]['id'];

XPath

Aynı zamanda Xpath sorgularını da çalıştırabilirsiniz. SimpleXMLElement::xpath() methodunu kullanarak çalışırlar. Eğer bütün makalelerin başlıklarını çekmek istersek aşağıdaki gibi birşey yapabiliriz:

<?php
$basliklar = $makaleler->xpath('makale/baslik');
foreach($basliklar as $baslik)
{
        echo $baslik.PHP_EOL;
}
?>

Ya da bütün ID'leri çekmek için:

<?php
$id = $makaleler->xpath('makale/@id');
foreach($id as $id)
{
        echo $id.PHP_EOL;
}
?>

RSS Beslemelerini İşleme

Şimdi www.trkodlama.com/rss.php adresinden verileri alalım:

<?php
$rss = new SimpleXMLElement('http://www.trkodlama.com/rss.php', null, true);

echo "<h1><a href='{$rss->channel->link}'>{$rss->channel->title}</a></h1>".PHP_EOL.'<hr />'.PHP_EOL;

foreach($rss->xpath('channel/item') as $item)
{
        echo <<<EOF
<h2><a href='{$item->link}'>{$item->title}</a></h2>
<div>Gönderilme Zamanı: {$item->pubDate}</div>
{$item->description}
<hr />

EOF;
}
?>

Bu size sayfanın başında söylediğim RSS besleme okuyucumuz. Bu okuyucumuzu daha da geliştirmek için biraz AJAX kullanın ve arayüzü şık bir hale getirin.

Gördüğünüz gibi XML bilgiyi işleme XML dosyanın yapısını bildikten sonra SimpleXML ile oldukça basit. Peki yapısını bilmediğiniz bir XML'i işleme almak için ne yapmalısınız? O zaman aşağıdaki işlemleri inceleyin. Fakat hala makaleler.xml dosyamızı kullanmaya devam edeceğiz.

<?php
function isle(SimpleXMLElement $element, $level = 0)
{
        $indent     = str_repeat("t", $level);
        
        $deger      = trim((string) $element);  // değeri çek ve başlangıç-bitiş arasındaki bütün boşlukları sil
        $parametreler = $element->attributes();   // bütün parametreleri çek
        $children   = $element->children();     // children(türkçe ne olarak söylenir bilmiyorum)'ları çek
        
        echo "{$indent}Parsing '{$element->getName()}'...".PHP_EOL;
        if(count($children) == 0 && !empty($deger)) // Değer doluysa ve children'ı yoksa göster
        {
                echo "{$indent}Değer: {$element}".PHP_EOL;
        }
        
        // parametre var ise göster
        if(count($parametreler) > 0)
        {
                echo $indent.''deki '.count($parametreler).' parametre:'.PHP_EOL;
                foreach($parametreler as $parametre)
                {
                        echo "{$indent}- {$parametre->getName()}: {$parametre}".PHP_EOL;
                }
        }
        
        if(count($children))
        {
                echo $indent.''deki '.count($children).' children:'.PHP_EOL;
                foreach($children as $child)
                {
                        isle($child, $level+1);
                }
        }
        
        echo $indent.PHP_EOL; // daha temiz hale getirmek için
}

$xml = new SimpleXMLElement('makaleler.xml', null, true);

isle($xml);
?>

Not: Eğer bunu bir tarayıcıda çalıştırmak isterseniz header('Content-type: text/plain'); kodunu ekrana herhangi bir çıktı vermeden önce kullanmalısınız. Böylece tarayıcı bunun sadece bir text olduğunu ve HTML içermediğini anlayacaktır.

Aslında SimpleXML'den çok daha güçlü bir XML işleyicimiz var. Adı da PHP DOM fakat buna şimdi değinmiyorum. Çünkü bende çok iyi bilmiyorum. PHP DOM'u iyice sindirdikten sonra sizler sunarım.

Umarım faydalı ve akıcı bir anlatım olmuştur. Sorularını forumdan, iletişim formundan veya yorum olarak sorabilirsiniz.

Kolay gelsin,











RSSTwitter

En son yazılanlardan ilk senin haberin olsun


Valid HTML 5 Valid CSS!

Güncel Programlama Makaleleri by TR Kodlama © 2009 is licensed under a Creative Commons Alıntı-TicariOlmayan 3.0 Unported License.