Anket Kodları - Cookie.

İyi Günler

Sitemde kullandığım bir anket kodlaması var. Gayet güzel ve basit gözüken bir sistem. Her yeni oluşturulan anket bir poll id si alıyor. Oylama yapılınca bir cookie gönderiliyor, bu cookide anladığım kadarıyla pollid(anketkimliği) ve oylama saati ve dilenirse ip numarası saklanıyor. Oylamadan sonra eğerki multivote(çoklu oy atma) kapalı ise saklanan verilere göre kişinin tekrar oy atması engelleniyor. Ama tabi sırf o id deki anket için.

Bugüne kadar birçok kodlama diliyle ufak tefek çalıştım. c++, visual basic, action script. Ve hemen hemen hepsi birbiriyle çok benzer kodlamalara sahip oluyor. Ama bu php deki birçok komutu ilkkez görüyorum. Bu sebepten inanın 1 haftadır 2 paragraflık kodu anlamak için çok uğraştım ama başaramadım.

İstediğim şu, sitemde 5 tane anket olsun. Ama eğer bir üye, ya da ziyaretci, bir ankete oy kullanırsa, diğer anketlere oy kullanamasın.

Şimdi bu anketler cookie göndermesine rağmen, bir yerde bu cookie yi geri okuduğunda cookie deki id ile , o anki anketin id sini karşılaştırıyor olmalı. Her anket için ayrı cookie ya da aynı cookide ayrı yerde barındırılıyor olmalı.

Ama bir türlü çözemedim ki kodlara bakınca sanki insanın dilinin ucuna gelmesi gibi, gözünün önünde birşey.

Yardımcı olursanız çok sevinirim, lütfen doğruluğundan emin olmasanız dahi birşey yazın, ben denemesini yaparım, şuan çok çaresizim.

Kodları veriyorum (kod içinde çok karışık göründüğü için renk değiştirerek veriyorum)


/*------------------------------------------------------------------------------
Check if user already voted for that poll
------------------------------------------------------------------------------*/
function checkVote($poll, $email = null) {


    $database = JFactory::getDBO();
    $my = JFactory::getUser();
   
    $conf = new pollxtConfig();
    $conf->pollid = $poll->id;
    $conf->load();
    $result = "";
    //check date and time
        $now = date("Y-m-d");
        $nowtime = date("H:i:s");

    if (
        ($poll->datefrom > $now && $poll->datefrom != "0000-00-00")
    OR ($poll->datefrom == $now AND $poll->timefrom < $nowtime)
    OR ($poll->dateto < $now && $poll->dateto != "0000-00-00")   
    OR ($poll->dateto == $now AND $poll->timeto < $nowtime)
        )
        return true;


    $cookiename = "voted$poll->id";
    $vcookie = JRequest::getVar($cookiename, '0', 'COOKIE');

    $scookie = false;

    $now = strtotime(date("Y-m-d G:i:s"));

    //cookie check
    if ($conf-> ;seccookie==1 && $vcookie != 0) {
        if (!$poll->multivote)
            $scookie = true;
        elseif ((strtotime($vcookie)+ $poll->lag*60) > $now)
            $scookie = true;
    }

    $ip = $conf->ip;

    if (!$my->id && $poll->logon) return true;

    if (!$my->id)
        $logonQuery = "AND p.logon=0";
    else
        $logonQuery = "";

    $where = "";
    $id = intval ($poll->id);
   
    //
    if ($my->id) $uname = $my->username;
    elseif ($email) $uname = $email;
    else $uname = null;
   
    // if logged on check username else check IP
    if (($uname) and $conf->secuname and $conf->secip) {
        $where = " AND (d.user = \"".$uname."\" OR d.ip = \"".$ip."\" )";
    }
    elseif ($conf->secip) $where = " AND d.ip = \"".$ip."\"";
    elseif (($uname) and $conf->secuname) $where = " AND d.user = \"".$uname."\"";

    if (!$where=="") {
        $query = "SELECT d.*
        FROM #__pollsxt_questions AS q
       LEFT  JOIN #__pollsxt_options AS o ON o.quid = q.id
      LEFT JOIN #__pollxt_data AS d ON d.optid = o.id
   WHERE q.pollid =\"".$id."\"".$where."ORDER BY d.datu DESC
                                                                                                                                      LIMIT 1";

        $database->setQuery($query);

        $result = $database->loadObject();
        echo $database->getErrorMsg();
    }
    $sip = false;
    if (isset($result->datu)) {   
        if (!$poll->multivote )
            $sip = true;
        elseif (strtotime($result->datu)+ $poll->lag*60 > $now)
            $sip = true;
    }

    return ($scookie or $sip);
}

Diğer bir dosyada ise şu kodlar mevcut ama bir kısmının başında */ var nedense, bu kodları geçersiz (okunmayan kılmalı) yinede yazıyorum

// get IP
        $ip = $frontend->conf->ip;
   
        // get the selection
        $voteArray = $frontend->data->votes;
        $poll = $frontend->poll;
        // Plugin check
        $plugin = new configPlugin($poll->id);
        if ($message = $plugin->checkVote($frontend->plug)) {
            $frontend->error = true;
            $frontend->message = $message;
            return;
        }

        // Poll exists (visible for user)?
        if (!$poll->load($frontend->data->pollid)) {
            $frontend->error = true;
            $frontend->message = JText::_('POLLXT_NOT_AUTH');
            return;
        }
       
        // check for email
        if ($poll->email == "1" && !$my->id) {
            $email = $frontend->data->email;           
        }
        else $email = null;
       
        // already voted?
/*        $cookiename = "voted$poll->id";
        $vcookie = JRequest::getVar($cookiename, '0', 'COOKIE');
        $now = strtotime(date("Y-m-d G:i:s"));

        $voted = checkVote($poll, $email);
        if (!$poll->multivote == 1) {
            if ($voted || ((strtotime($vcookie)+ $poll->lag*60) > $now)) {
                $frontend->error = true;
                $frontend->message = JText::_('POLLXT_ALREADY_VOTE');
                return;
            }
        }
*/

        // already voted?
        $voted = checkVote($poll, $email);
       
        if ($voted )  {
               $frontend->error = true;
            $frontend->message = JText::_('POLLXT_ALREADY_VOTE');
            return;
        }
   
        // something selected?
        // empty text fields of type 5 do not count
       
        foreach ($voteArray as $v) {
            $query = "SELECT quid FROM #__pollsxt_options WHERE id = '$v'";
            $database->setQuery($query);
            $quid = $database->loadResult();
            $query = "SELECT type FROM #__pollsxt_questions WHERE id = '$quid'";
            $database->setQuery($query);
            $type = $database->loadResult();
            if ($type <> "5") {
                $selArray[] = $v;
            }
            else {
                foreach ($frontend->data->texts as $t) {
                    if ($t[0] == $v && $t[1] != "") {
                        $selArray[] = $v;
                    }
                }
            }
           
        }
       
       
        if (!isset($selArray) || count($selArray)==0) {
            $frontend->error = true;
            $frontend->message = JText::_('POLLXT_NO_SELECTION');
            return;
        }
   
        $voteid = array ();
        $i = 0;
        foreach ($voteArray as $v) {
            $voteid[$i] = $v;
            $i ++;
        }

        $now = $now = date("Y-m-d G:i:s");
   
        $user = $frontend->conf->user;

2010-08-29 13:39:11 Edit:2010-08-29 22:38:23

öncelikle böyle sıkıştığınız durumlarda var_dump() fonksiyonu kullanışlıdır. herhangi bir değişkene debug yapar.

php kodları aslında C++ ya çok benzer. bence daha çok değişken isimleri yabancı olduğu için şaşırmış olabilirsiniz. Kodlarda çok fazla Class çağrısı var. daha önce class kullanmadıysanız oda sorun olur.

şu kadarını söyleyebilirim: kontrolü maviyle gösterdiğim satırdaki fonksiyon yapıyor.


        $voted = checkVote($poll, $email);
       
        if ($voted > 0)  {
             $frontend->error = true;
            $frontend->message = JText::_('POLLXT_ALREADY_VOTE');
            return;
        }

Her programcı birgün Php yi tadacaktır
2010-08-29 19:08:46

İlgilenip cevap yazdığınız için çok teşekkür ederim. Koca internet dünyasında anlayıpta ilgilenen insan bulamamıştım 1 haftadır.

Php de debug olayını bilmiyordum. Aslında kodları daha iyi anlamaya yardımcı olabilir diye düşünüyorum.

Class çağrıları ile -> ile yapılan çağrıları kastediyorsanız evet ne yazıkki hiçbir bilgim yok. Zaten bu kodlarda en çok aklımı karıştıranda onlar oldu.

Mesela $frontend->data->pollid , frontend le başlıyor, poll id ile bitiyor. Sanırım sınıf üyelerini alt klasör olayı gibi çağırıyor. Yani system32 mesela, hangi system32 programfiles ın altındaki windows un elemanı system32 gibi.

Check vote ile kontrol eden bir fonskiyon, sonrasında eğerki voted ise diyor. Burada voted işleminde sanırım iş bitiyor ama çözemedim. 

Bu arada kodları editlediğim haliyle paste yapmışım. Şimdi düzelttim. O iki kısımdada sadece if voted yazıyordu. Ben if voted >0 olarak deneme yapmıştım. Ama hiçbir değişiklik olmamıştı.

2010-08-29 22:39:34

Edit:

phpkodlari.com © 2009 Herkes Php öğrenecek
Eglence ve Oyun: Gamikro