Ασυμβατότητα κώδικα με PHP 5.3.13

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Ασυμβατότητα κώδικα με PHP 5.3.13

Δημοσίευση από philos » 31 Δεκ 2012 14:11

Ο ακόλουθος κώδικας προέρχεται από το βασικό τμήμα script μιας εφαρμογής που καταγράφει τους referres (δηλαδή τα sites από τα οποία γίνονται clicks προς το δικό μου site).

Από τότε όμως που αναβαθμήσαμε από PHP 5.2.x σε 5.3.13, η εφαρμογή αποθηκεύσει στη βάση δεδομένων ακόμα και τα clicks που γίνονται ΕΝΤΟΣ του ίδιου του site.
Για παράδειγμα αν προσπαθήσεις να πας στο index.php, η εφαρμογή θα το καταγράψει λες και είσαι εξωτερικός referrer. :-?
Αν δείτε τον κώδικα, υπάρχει τμήμα-σχόλιο:
// If the referrer is not the forum itself, go.

Μπορεί να βοηθήσει κάποιος στη διόρθωση του λάθους; Κάτι απλό πρέπει να είναι!

Κώδικας: Επιλογή όλων

if ($vbulletin->options['referrers_onoff'] && $_SERVER['HTTP_REFERER'])
{
    // Shorten the referrer to just the domain
    // BUG NOTE: Don't use ltrim(http://www.), it removes t,h,p from the first letters of domains for some reason. Something to do with the //
    $referrer_short = $_SERVER['HTTP_REFERER'];
    
    // Catch different prefixes
    if (strpos($referrer_short, 'https://') !== False)
    {
        $referrer_short = str_replace("https://", "", "$referrer_short");
    }
    else if (strpos($referrer_short, 'ftp://') !== False)
    {
        $referrer_short = str_replace("ftp://", "", "$referrer_short");
    }
    else if (strpos($referrer_short, 'http://') !== False)
    {
        $referrer_short = str_replace("http://", "", "$referrer_short");
    }
    if (strpos($referrer_short, 'www.') == '0')
    {
        $referrer_short = ltrim($referrer_short, "www.");
    }
    
    // Use the (almost) full referrer for writing to save doing the trimming twice
    $referrer = $referrer_short;
    
    $referrer_short = explode('/', $referrer);
    
    // Some might have a trailing / in their forum URL, some might not so do the same
    $bburl_match = $vbulletin->options['bburl'];
    
    if (strpos($bburl_match, 'https://') !== False)
    {
        $bburl_match = str_replace("https://", "", "$bburl_match");
    }
    else if (strpos($bburl_match, 'ftp://') !== False)
    {
        $bburl_match = str_replace("ftp://", "", "$bburl_match");
    }
    else if (strpos($bburl_match, 'http://') !== False)
    {
        $bburl_match = str_replace("http://", "", "$bburl_match");
    }
    if (strpos($referrer_short, 'www.') == '0')
    {
        $bburl_match = ltrim($bburl_match, "www.");
    }
    
    $bburl_match = explode('/', $bburl_match);

    // If the referrer is not the forum itself, go.
    if ($referrer_short['0'] != $bburl_match['0'])
    {
        // Trim the extraneous http://www. bit and if the URL is too long for the db entry or the admin wants it, trim the variables off the end first. 
        if (strlen($referrer) > 250 || $vbulletin->options['referrers_rtrim'])
        {
            $referrer = explode('?', $referrer);
            $referrer = $referrer['0'];
        }
        if ($vbulletin->options['referrers_rtrim_domain'])
        {
            $referrer= explode('/', $referrer);
            $referrer = $referrer['0'];
        }
        
        // Encode for the db.
        $referrer = $vbulletin->db->escape_string(urlencode(htmlspecialchars_uni($referrer)));

        // Db pullers
        $referrers_db_select = "url, count";
        $referrers_db_values = "'$referrer', 1";
        
        // Check if the referrer exists in the db.
        $this_referrer = $vbulletin->db->query_first("
            SELECT " . $referrers_db_select . "
            FROM " . TABLE_PREFIX . "referrers
            WHERE url='$referrer'
        ");

        // If this is a new referrer, add it.
        if (!$this_referrer['url'])
        {
            // Check if any of the block words are in the domain. To be server-friendly, this will only be checked at initial write.
            if ($vbulletin->options['referrers_blockwords'])
            {
                $blockwords = explode(',', $vbulletin->options['referrers_blockwords']);
                foreach ($blockwords AS $blockedwords)
                {
                    $pos = strpos($_SERVER['HTTP_REFERER'], $blockedwords);
                    if ($pos !== False)
                    {
                        $blockthis++;
                    }
                }
            }
                
            // Blockthis is empty, go.
            if (!$blockthis)
            {
                // Get the page title of the referrer
                if ($vbulletin->options['referrers_titles'])
                {
                    // Decode the URL back from the db
                    $referred = urldecode($referrer);        
                    
                    // Get the title from the referrer
                    $referrer_title = @fopen("http://" . $referred . "", r);
                    if ($referrer_title)
                    {
                        $page = '';
                        while(!feof($referrer_title))
                        {
                            $title = fgets($referrer_title, 100);
                            $page .= $title;
                        }
                        preg_match&#40;"/<title>&#40;.*&#41;<\/title>/s", $page, $title&#41;;
                        $title = $vbulletin->db->escape_string&#40;urlencode&#40;$title&#91;'1'&#93;&#41;&#41;;
                        
                        // Tack on the extra db requests
                        $referrers_db_select .= ", title";
                        $referrers_db_values .= ", '$title'";
                        
                        fclose&#40;$referrer_title&#41;;                        
                    &#125;                
                &#125;
                
                if &#40;$vbulletin->options&#91;'referrers_referrerids'&#93; && strpos&#40;$_SERVER&#91;'REQUEST_URI'&#93;, 'referrerid='&#41;&#41;
                &#123;
                    // Tack on the extra db requests
                    $referrers_db_select .= ", referrerid";
                    $referrers_db_values .= ", 1";
                &#125;
                
                $db->query_write&#40;"
                    INSERT INTO " . TABLE_PREFIX . "referrers
                        &#40;" . $referrers_db_select . "&#41;
                    VALUES
                        &#40;" . $referrers_db_values . "&#41; ON DUPLICATE KEY UPDATE count = count + 1
                "&#41;;
            &#125;
        &#125;
        // Otherwise just up the count by 1
        else
        &#123;
            $vbulletin->db->query&#40;"
                UPDATE " . TABLE_PREFIX . "referrers
                SET count = count + 1
                WHERE url = '$referrer'
            "&#41;; 
        &#125;
    &#125;
&#125;  

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ασυμβατότητα κώδικα με PHP 5.3.13

Δημοσίευση από dva_dev » 31 Δεκ 2012 20:00

Είσαι σίγουρος ότι φταίει η αναβάθμιση. Μου φαίνεται ότι αυτό το πράγμα ποτέ δεν έπαιζε σωστά και θα έλεγα ότι φταίει ο κώδικας γι αυτό, όχι η διαφορετική έκδοση της php.

Θα πρότεινα να κάνεις αλλαγή του κώδικα

Κώδικας: Επιλογή όλων

    if &#40;strpos&#40;$referrer_short, 'www.'&#41; == '0'&#41; 
    &#123; 
        $referrer_short = ltrim&#40;$referrer_short, "www."&#41;; 
    &#125; 

    ...    

    if &#40;strpos&#40;$referrer_short, 'www.'&#41; == '0'&#41; 
    &#123; 
        $bburl_match = ltrim&#40;$bburl_match, "www."&#41;; 
    &#125; 
ώστε το 2ο if να γίνει παρόμοιο με το πρώτο. Κάτι σαν το:

Κώδικας: Επιλογή όλων

    if &#40;strpos&#40;$bburl_match, 'www.'&#41; == '0'&#41; 
    &#123; 
        $bburl_match = ltrim&#40;$bburl_match, "www."&#41;; 
    &#125; 
Δες και το ενδεχόμενο να χρειάζεται να το κάνεις με === αντί ==.
Επίσης η strpos επιστρέφει false ή αριθμό, όχι string -> '0'.

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Ασυμβατότητα κώδικα με PHP 5.3.13

Δημοσίευση από philos » 01 Ιαν 2013 19:49

Τελικά έφταιγαν τα '' στο 0 στις if. Τα αφαίρεσα και έφτιαξε, ευχαριστώ!! :D

Περίεργο πάντως, όταν ήμασταν σε PHP 5.2 το έτρεχε σωστά. :-?

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες