Who's Online Enhanced

Open to all! Ask other shopowners for help.
User avatar
tessthepup
Certified Developer
Posts: 382
Joined: Mon Mar 01, 2021 5:55 pm
Phoenix Version:
Has thanked: 47 times
Been thanked: 62 times

Re: Who's Online Enhanced

Post by tessthepup »

@radhavallabh

I have tested the who's online with Firefox, Chrome, Edge and Opera browsers and it works perfectly.

I can only presume there is something already in your store that is conflicting.

Does your browser console report anything?


Join The Code Co-op to get access to your library in the Code Co-op Forum
radhavallabh
Senior Contributor
Posts: 466
Joined: Tue Oct 27, 2020 4:09 am
Phoenix Version: 1.1.0.6
Has thanked: 29 times
Been thanked: 3 times

Re: Who's Online Enhanced

Post by radhavallabh »

tessthepup wrote: Fri Dec 05, 2025 7:00 pm @radhavallabh

I have tested the who's online with Firefox, Chrome, Edge and Opera browsers and it works perfectly.

I can only presume there is something already in your store that is conflicting.

Does your browser console report anything?
I use php 7.4, Well the visitors are almost 500 to 400 (many are bots) generally;

After trying loading it today I get Failed error in Browser console after 4 minutes....

Secure Connection Failed

The connection to www.xx.com was interrupted while the page was loading.

The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
Please contact the website owners to inform them of this problem.


Rest all pages load well and fast.
Hope I could get this wonderful addon working dear;
Thank you in advance;
Warm Regds.
radhavallabh
azpro
Contributor
Posts: 177
Joined: Fri Nov 06, 2020 8:25 am
Phoenix Version: v1.1.0.6
Has thanked: 30 times
Been thanked: 34 times

Re: Who's Online Enhanced

Post by azpro »

500 to 400 (many are bots)
.. I would think that is a bigger issue that needs to be resolved first.

We also had the issue of lots of bots (actually probably more leechers/spiders for AI-LLM etc) which gave all kinds of negative results (loading time of pages). We started with Cloudflare to have better control on incoming traffic and this worked out quite nicely.

Please note - I am not an expert - just what I "think" might be a solution.
radhavallabh
Senior Contributor
Posts: 466
Joined: Tue Oct 27, 2020 4:09 am
Phoenix Version: 1.1.0.6
Has thanked: 29 times
Been thanked: 3 times

Re: Who's Online Enhanced

Post by radhavallabh »

Hi;
I use the Sitelock CDN actually for that...
The normal whos online loaded normally actually with no issues..
Just wanted this beautiful addon to work out too...
Very Warm Regds.
radhavallabh
MyGamesShop
Contributor
Posts: 131
Joined: Wed Mar 10, 2021 3:02 am
Phoenix Version: v1.1.0.6
Has thanked: 8 times
Been thanked: 5 times

Re: Who's Online Enhanced

Post by MyGamesShop »

The download link as @ 03.03.26
When I extract this file in Ubuntu Linux the file permissions do not allow to delete or rename as a user.
Very odd permissions, is there a reason for this?
Which required the use of sudo to remove or change.
sudo rm -rf "Who's Online Enhanced"
You do not have the required permissions to view the files attached to this post.
User avatar
tessthepup
Certified Developer
Posts: 382
Joined: Mon Mar 01, 2021 5:55 pm
Phoenix Version:
Has thanked: 47 times
Been thanked: 62 times

Re: Who's Online Enhanced

Post by tessthepup »

MyGamesShop wrote: Mon Mar 02, 2026 11:31 pm The download link as @ 03.03.26
When I extract this file in Ubuntu Linux the file permissions do not allow to delete or rename as a user.
Very odd permissions, is there a reason for this?
Which required the use of sudo to remove or change.
sudo rm -rf "Who's Online Enhanced"
@MyGamesShop I wish I could give you a reason but I do not use Ubuntu Linux so have no idea, sorry
gritsop
Posts: 2
Joined: Sun Oct 02, 2022 12:03 pm
Phoenix Version:

Re: Who's Online Enhanced

Post by gritsop »

Just wanted to ask if this addon could be updated so that the top labels (customers, bots, guests) are clickable so that the list is filtered per type of online entities.

It would be nice to have filtered categories especially when the list is large (more than 2-3 pages).

Thank you in advance.,
User avatar
tessthepup
Certified Developer
Posts: 382
Joined: Mon Mar 01, 2021 5:55 pm
Phoenix Version:
Has thanked: 47 times
Been thanked: 62 times

Re: Who's Online Enhanced

Post by tessthepup »

@gritsop
gritsop wrote: Sun May 03, 2026 8:31 pm Just wanted to ask if this addon could be updated so that the top labels (customers, bots, guests) are clickable so that the list is filtered per type of online entities.

It would be nice to have filtered categories especially when the list is large (more than 2-3 pages).

Thank you in advance.,
Hi, I have updated the code to include a filter system.
You do not have the required permissions to view the files attached to this post.
PiLLaO
Contributor
Posts: 107
Joined: Thu Nov 05, 2020 9:28 pm
Phoenix Version: v1.1.0.6
Has thanked: 53 times
Been thanked: 11 times

Re: Who's Online Enhanced

Post by PiLLaO »

In case it's of any use, this is part of the old osCommerce Who's Online add-on that I used to use to show guest cart

Code: Select all

    function unserializesession($data) {
      $vars = preg_split(
            '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
            $data,-1,PREG_SPLIT_NO_EMPTY |
             PREG_SPLIT_DELIM_CAPTURE
            );
      for($i=0; $vars[$i]; $i++) {
        $result[$vars[$i++]]=unserialize($vars[$i]);
      }
      return $result;
    }


    if (isset($info)) {
      $heading[] = array('text' => '<strong>' . TABLE_HEADING_SHOPPING_CART . '</strong>');

      // First we check if the session exist in a file, else we will use mysql
      if ( (file_exists(tep_session_save_path() . '/sess_' . $info)) && (filesize(tep_session_save_path() . '/sess_' . $info) > 0) ) {
        $session_data = file(tep_session_save_path() . '/sess_' . $info);
        $session_data = trim(implode('', $session_data));
      } else {
        $session_data = tep_db_query("select value from sessions WHERE sesskey = '" . $info . "'");
        $session_data = tep_db_fetch_array($session_data);
        $session_data = trim($session_data['value']);
      }


      if ($length = strlen($session_data)) {

        if (PHP_VERSION < 4) {
          $start_cart = strpos($session_data, 'cart[==]o');
          $start_currency = strpos($session_data, 'currency[==]s');
        } else {
          $start_cart = strpos($session_data, 'cart|O');
          $start_currency = strpos($session_data, 'currency|s');
        }

        // if we found the 'cart' tag in the session data
        // workaround for timeout when suhosin session data encryption is in effect
        if ($start_cart !== false) {
          for ($i=$start_cart; $i<$length; $i++) {
            if ($session_data[$i] == '{') {
              if (isset($tag)) {
                $tag++;
              } else {
                $tag = 1;
              }
            } elseif ($session_data[$i] == '}') {
              $tag--;
            } elseif ( (isset($tag)) && ($tag < 1) ) {
              break;
            }
          }

          $session_data_cart = substr($session_data, $start_cart, $i);
          $session_data_currency = substr($session_data, $start_currency, (strpos($session_data, ';', $start_currency) - $start_currency + 1));
/*
        session_decode($session_data_cart);
        session_decode($session_data_currency);

        if (PHP_VERSION < 4) {
          $broken_cart = $cart;
          $cart = new shoppingCart;
          $cart->unserialize($broken_cart);
        } else {
          $cart = $_SESSION['cart'];
          $currency = $_SESSION['currency'];
        }
*/

          $session_data_id = unserializesession($session_data_id);
          $session_data_currency = unserializesession($session_data_currency);
          $session_data_country = unserializesession($session_data_country);
          $session_data_zone = unserializesession($session_data_zone);
          $session_data_cart = unserializesession($session_data_cart);

          // Finalement, on restaure la session du Panier ($_SESSION['cart']) pour le consulter:
          // Sans cela, $_SESSION['cart'] resterait vide.
          // Et donc on n'aurait plus la possibilité de voir le contenu du panier des utilisateurs.
          $_SESSION['currency'] = $session_data_currency;
          $_SESSION['cart'] = $session_data_cart;

/*
        if (is_object($cart)) {
          $products = $cart->get_products();
          for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
            $contents[] = array('text' => $products[$i]['quantity'] . ' x ' . $products[$i]['name']);
          }
          if (sizeof($products) > 0) {
            $contents[] = array('text' => tep_draw_separator('pixel_black.gif', '100%', '1'));
            $contents[] = array('align' => 'right', 'text' => TEXT_SHOPPING_CART_SUBTOTAL . ' ' . $currencies->format($cart->show_total(), true, $currency));
*/
        if (is_object($_SESSION['cart']['cart'])) {
          $products = $_SESSION['cart']['cart']->get_products();

          foreach ($products as $key => $row) {
            $attributes[$key] = $row['attributes'];
            $name[$key] = $row['name'];
          }
          array_multisort(array_map('strtolower',$name), $attributes, SORT_ASC, $products, SORT_ASC);

          for ($i=0, $n=sizeof($products); $i<$n; $i++) {
      // Push all attributes information in an array
            if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) {
              foreach ($products[$i]['attributes'] as $option => $value) {
                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix
                                            from products_options popt, products_options_values poval, products_attributes pa
                                            where pa.products_id = '" . (int)$products[$i]['id'] . "'
                                             and pa.options_id = '" . (int)$option . "'
                                             and pa.options_id = popt.products_options_id
                                             and pa.options_values_id = '" . (int)$value . "'
                                             and pa.options_values_id = poval.products_options_values_id
                                             and popt.language_id = '" . (int)$languages_id . "'
                                             and poval.language_id = '" . (int)$languages_id . "'");
                $attributes_values = tep_db_fetch_array($attributes);

                $products[$i][$option]['products_options_name'] = $attributes_values['products_options_name'];
                $products[$i][$option]['options_values_id'] = $value;
                $products[$i][$option]['products_options_values_name'] = $attributes_values['products_options_values_name'];
                $products[$i][$option]['options_values_price'] = $attributes_values['options_values_price'];
                $products[$i][$option]['price_prefix'] = $attributes_values['price_prefix'];
              }
            }
          }

          for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
            $products_complete = $products[$i]['quantity'] . ' x ' . $products[$i]['name'];
            if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) {
              foreach($products[$i]['attributes'] as $option => $value) {
                $products_complete .= '<br />&nbsp;&nbsp;&nbsp;<small><i> - ' . $products[$i][$option]['products_options_name'] . ' ' . $products[$i][$option]['products_options_values_name'] . '</i></small>';
              }
            }
            $contents[] = array('text' => $products_complete);
          }

          if (sizeof($products) > 0) {
            $contents[] = array('text' => tep_draw_separator('pixel_black.gif', '100%', '1'));
            $contents[] = array('align' => 'right', 'text'  => TEXT_SHOPPING_CART_SUBTOTAL . ' ' . $currencies->format($_SESSION['cart']['cart']->show_total(), true, $_SESSION['currency']['currency']));
          } else {
            $contents[] = array('text' => '<i>' . TEXT_EMPTY . '</i>');
          }
        }

      }
    }
User avatar
tessthepup
Certified Developer
Posts: 382
Joined: Mon Mar 01, 2021 5:55 pm
Phoenix Version:
Has thanked: 47 times
Been thanked: 62 times

Re: Who's Online Enhanced

Post by tessthepup »

@PiLLaO

Thank you. I will see what I can do
PiLLaO wrote: Tue May 05, 2026 3:21 pm In case it's of any use, this is part of the old osCommerce Who's Online add-on that I used to use to show guest cart

Code: Select all

    function unserializesession($data) {
      $vars = preg_split(
            '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
            $data,-1,PREG_SPLIT_NO_EMPTY |
             PREG_SPLIT_DELIM_CAPTURE
            );
      for($i=0; $vars[$i]; $i++) {
        $result[$vars[$i++]]=unserialize($vars[$i]);
      }
      return $result;
    }


    if (isset($info)) {
      $heading[] = array('text' => '<strong>' . TABLE_HEADING_SHOPPING_CART . '</strong>');

      // First we check if the session exist in a file, else we will use mysql
      if ( (file_exists(tep_session_save_path() . '/sess_' . $info)) && (filesize(tep_session_save_path() . '/sess_' . $info) > 0) ) {
        $session_data = file(tep_session_save_path() . '/sess_' . $info);
        $session_data = trim(implode('', $session_data));
      } else {
        $session_data = tep_db_query("select value from sessions WHERE sesskey = '" . $info . "'");
        $session_data = tep_db_fetch_array($session_data);
        $session_data = trim($session_data['value']);
      }


      if ($length = strlen($session_data)) {

        if (PHP_VERSION < 4) {
          $start_cart = strpos($session_data, 'cart[==]o');
          $start_currency = strpos($session_data, 'currency[==]s');
        } else {
          $start_cart = strpos($session_data, 'cart|O');
          $start_currency = strpos($session_data, 'currency|s');
        }

        // if we found the 'cart' tag in the session data
        // workaround for timeout when suhosin session data encryption is in effect
        if ($start_cart !== false) {
          for ($i=$start_cart; $i<$length; $i++) {
            if ($session_data[$i] == '{') {
              if (isset($tag)) {
                $tag++;
              } else {
                $tag = 1;
              }
            } elseif ($session_data[$i] == '}') {
              $tag--;
            } elseif ( (isset($tag)) && ($tag < 1) ) {
              break;
            }
          }

          $session_data_cart = substr($session_data, $start_cart, $i);
          $session_data_currency = substr($session_data, $start_currency, (strpos($session_data, ';', $start_currency) - $start_currency + 1));
/*
        session_decode($session_data_cart);
        session_decode($session_data_currency);

        if (PHP_VERSION < 4) {
          $broken_cart = $cart;
          $cart = new shoppingCart;
          $cart->unserialize($broken_cart);
        } else {
          $cart = $_SESSION['cart'];
          $currency = $_SESSION['currency'];
        }
*/

          $session_data_id = unserializesession($session_data_id);
          $session_data_currency = unserializesession($session_data_currency);
          $session_data_country = unserializesession($session_data_country);
          $session_data_zone = unserializesession($session_data_zone);
          $session_data_cart = unserializesession($session_data_cart);

          // Finalement, on restaure la session du Panier ($_SESSION['cart']) pour le consulter:
          // Sans cela, $_SESSION['cart'] resterait vide.
          // Et donc on n'aurait plus la possibilité de voir le contenu du panier des utilisateurs.
          $_SESSION['currency'] = $session_data_currency;
          $_SESSION['cart'] = $session_data_cart;

/*
        if (is_object($cart)) {
          $products = $cart->get_products();
          for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
            $contents[] = array('text' => $products[$i]['quantity'] . ' x ' . $products[$i]['name']);
          }
          if (sizeof($products) > 0) {
            $contents[] = array('text' => tep_draw_separator('pixel_black.gif', '100%', '1'));
            $contents[] = array('align' => 'right', 'text' => TEXT_SHOPPING_CART_SUBTOTAL . ' ' . $currencies->format($cart->show_total(), true, $currency));
*/
        if (is_object($_SESSION['cart']['cart'])) {
          $products = $_SESSION['cart']['cart']->get_products();

          foreach ($products as $key => $row) {
            $attributes[$key] = $row['attributes'];
            $name[$key] = $row['name'];
          }
          array_multisort(array_map('strtolower',$name), $attributes, SORT_ASC, $products, SORT_ASC);

          for ($i=0, $n=sizeof($products); $i<$n; $i++) {
      // Push all attributes information in an array
            if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) {
              foreach ($products[$i]['attributes'] as $option => $value) {
                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix
                                            from products_options popt, products_options_values poval, products_attributes pa
                                            where pa.products_id = '" . (int)$products[$i]['id'] . "'
                                             and pa.options_id = '" . (int)$option . "'
                                             and pa.options_id = popt.products_options_id
                                             and pa.options_values_id = '" . (int)$value . "'
                                             and pa.options_values_id = poval.products_options_values_id
                                             and popt.language_id = '" . (int)$languages_id . "'
                                             and poval.language_id = '" . (int)$languages_id . "'");
                $attributes_values = tep_db_fetch_array($attributes);

                $products[$i][$option]['products_options_name'] = $attributes_values['products_options_name'];
                $products[$i][$option]['options_values_id'] = $value;
                $products[$i][$option]['products_options_values_name'] = $attributes_values['products_options_values_name'];
                $products[$i][$option]['options_values_price'] = $attributes_values['options_values_price'];
                $products[$i][$option]['price_prefix'] = $attributes_values['price_prefix'];
              }
            }
          }

          for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
            $products_complete = $products[$i]['quantity'] . ' x ' . $products[$i]['name'];
            if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) {
              foreach($products[$i]['attributes'] as $option => $value) {
                $products_complete .= '<br />&nbsp;&nbsp;&nbsp;<small><i> - ' . $products[$i][$option]['products_options_name'] . ' ' . $products[$i][$option]['products_options_values_name'] . '</i></small>';
              }
            }
            $contents[] = array('text' => $products_complete);
          }

          if (sizeof($products) > 0) {
            $contents[] = array('text' => tep_draw_separator('pixel_black.gif', '100%', '1'));
            $contents[] = array('align' => 'right', 'text'  => TEXT_SHOPPING_CART_SUBTOTAL . ' ' . $currencies->format($_SESSION['cart']['cart']->show_total(), true, $_SESSION['currency']['currency']));
          } else {
            $contents[] = array('text' => '<i>' . TEXT_EMPTY . '</i>');
          }
        }

      }
    }


Join The Code Co-op to get access to your library in the Code Co-op Forum
Post Reply