Author Topic: expCounter 1.2 und PHP7  (Read 2184 times)

Offline ruebenwurzel

  • Betatester
  • **
  • Posts: 8391
  • Gender: Male
  • Keep on Rockin
    • Familie Gallas Online
expCounter 1.2 und PHP7
« on: October 16, 2016, 08:35:27 PM »
Hallo,

habe auf einer Seite noch den expCounter in der Version 1.2 eingebunden. Nicht als WB Modul sondern als separate Installation mit der Einbindung über die index.php des Templates. Funktioniert auch noch mit WB 2.8.3 SP7 und PHP 5.6 ohne Probleme. Wollte die Domäne jetzt auf PHP 7 umstellen und da funktioniert er nicht mehr, da mysql_connect nicht mehr zur Verfügung steht.

So wie ich das sehe müsste das auf mysqli_connect geändert werden. Die Datenbankanbindung steht in der includes/mysql.class.php des Counters.

Code: [Select]
<?php
/**
 *
 * includes/mysql.class.php [last modified by xray]
 *
 * @package:   expCounter
 * @version:   1.2.1
 * @copyright:  since 2009 by Volker S. Latainski
 * @license:   GPL 2.0 or higher(see docs/license.txt)
 * @link:       http://www.expblog.net/expcounter
 * @filesource
 *
 * based on chCounter 3.1.3 copyright by Christoph Bachner and Bert Koern (http://chcounter.org)
 *
 * *******************************************************************************************
 *
 * This program is free software; you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110, USA
 *
 * *******************************************************************************************
 */
class chC_mysql
{
  
/**
   * The resultset
   * @var resource|bool
   */
  
public $query_result;
  
/**
   * Actual query string
   * @var string
   */
  
public $statement;
  
/**
   * Connection ID
   * @var int
   */
  
public $connection_id;
  
/**
   * Count of queries
   * @var int
   */
  
public $queries 0;
  
/**
   * All errors as string
   * @var string
   */
  
public $accepted_errors '';
  
/**
   * Stack for all statements of this connection
   * @var array
   */
  
public $statements = array();
  
/**
   * Debug mode
   * @var bool
   */
  
public $debug TRUE;
  
/**
   * Die on error flag
   * @var bool
   */
  
public $die_on_error TRUE;
  
/**
   * Error array
   * @var array
   */
  
public $errors = array();
  
/**
   * Array for table maintenance
   * @var array
   */
  
public $repaired = array();
  
/**
   * MySQL server
   * @var string
   */
  
private $db_server;
  
/**
   * MySQL username
   * @var string
   */
  
private $db_user;
  
/**
   * MySQL password
   * @var string
   */
  
private $db_passwort;
  
/**
   * MySQL database
   * @var string
   */
  
private $db_database;

  
/**
   * Constructor
   *
   * @param    string $db_server    Server Address
   * @param    string $db_user      Username
   * @param    string $db_passwort  Password
   * @param    string $db_database  Database
   * @param    string $debug        Debug Mode
   * @return   void
   * @access   public
   */
  
public function __construct($db_server$db_user$db_passwort$db_database FALSE$debug '')
  {
    
// debugging
    
if($debug == 'DEBUG_OFF'$this->debug FALSE;
    elseif(
$debug == 'DEBUG_ON'$this->debug TRUE;

    
// db data
    
$this->db_server $db_server;
    
$this->db_user $db_user;
    
$this->db_passwort $db_passwort;
    
$this->db_database $db_database;

    
// new connection
    
$this->connect();
  }

  
/**
   * Connect to database
   *
   * @return   void
   * @access   private
   */
  
private function connect()
  {
    
$this->connection_id = @ mysql_connect($this->db_server$this->db_user$this->db_passworttrue) OR $this->_handle_error();

    
// set charset to uft8
    
if(version_compare(PHP_VERSION'5.2.3''>='))
    {
      @ 
mysql_set_charset('utf8');
    }
    else
    {
      @ 
mysql_query("SET NAMES 'utf8'");
    }

    if(
$this->db_database != FALSE)
    {
      @ 
mysql_select_db($this->db_database) OR $this->_handle_error();
    }
  }

  
/**
   * Send statement/query
   *
   * @param    string $statement  SQL Query
   * @return   resource|bool
   * @access   public
   */
  
public function query($statement)
  {
    
$this->query_result = @mysql_query($statement$this->connection_id);
    
$this->queries++;
    if(
mysql_errno())
    {
      if(
mysql_errno() == 1016 || mysql_errno() == 1030)
      {
        
$return $this->_repair_table($statement);
        if(
$return == TRUE)
        {
          
$this->query_result = @mysql_query($statement$this->connection_id);
        }
        else
        {
          
$this->_handle_error($statement);
        }
      }
      else
      {
        
$this->_handle_error($statement);
      }
    }
    
$this->statements[] = $statement;
    return 
$this->query_result;
  }

  
/**
   * Error handling
   *
   * @param    string     $statement  SQL Query
   * @return   bool|exit
   * @access   private
   */
  
private function _handle_error($statement FALSE)
  {
    
$this->errors[] = array(
        
'statement' => $statement,
        
'errno' => mysql_errno(),
        
'error' => mysql_error()
    );

    if(
$this->debug == FALSE || (mysql_errno() != && is_int(strpos($this->accepted_errors, (string) mysql_errno()))))
    {
      return 
FALSE;
    }

    if(
$this->debug == TRUE)
    {
      echo 
"<b>expCounter: MySQL error!</b><br />\n";
      if(
$statement != FALSE)
      {
        echo 
"SQL query:<br />\n"
        
"<ul style=\"margin-top:5px; margin-bottom:5px\">\n"
        
"<li><i>" $statement "</i></li>\n"
        
"</ul>\n<br />\n";
      }
      echo 
"Error number: " mysql_errno() . "<br />\n" mysql_error() . "\n";
      if(
$this->die_on_error == TRUE)
      {
        die(
"<br />\n<i>Script stopped.</i>");
      }
    }
    elseif(
$this->die_on_error == TRUE)
    {
      exit;
    }
  }

  
/**
   * Table maintenance
   *
   * @param    string   $statement  SQL Query
   * @return   bool
   * @access   public
   */
  
public function _repair_table($statement)
  {
    
$tabellen = array(
        
strtolower(CHC_TABLE_CONFIG),
        
strtolower(CHC_TABLE_DATA),
        
strtolower(CHC_TABLE_LOG_DATA),
        
strtolower(CHC_TABLE_COUNTED_USERS),
        
strtolower(CHC_TABLE_IGNORED_USERS),
        
strtolower(CHC_TABLE_ONLINE_USERS),
        
strtolower(CHC_TABLE_ACCESS),
        
strtolower(CHC_TABLE_SCREEN_RESOLUTIONS),
        
strtolower(CHC_TABLE_USER_AGENTS),
        
strtolower(CHC_TABLE_SEARCH_ENGINES),
        
strtolower(CHC_TABLE_REFERRERS),
        
strtolower(CHC_TABLE_LOCALE_INFORMATION),
        
strtolower(CHC_TABLE_PAGES),
        
strtolower(CHC_TABLE_XSS_LOG)
    );
    if(
$count preg_match_all('/(' implode('|'$tabellen) . ')/i'$statement$matches))
    {
      
$nr 0;
      for (
$i 0$i $count$i++)
      {
        if(!isset(
$this->repaired[$matches[1][$i]]))
        {
          
$this->query('REPAIR TABLE `' $matches[1][$i] . '`;');
          
$this->repaired[$matches[1][$i]] = TRUE;
          
$nr++;
        }
      }
      if(
$nr 0)
      {
        return 
TRUE;
      }
    }
    return 
FALSE;
  }

  
/**
   * Set the debug mode
   *
   * @param    string   $mode  The Debug Mode
   * @return   void
   * @access   public
   */
  
public function set_debug_mode($mode)
  {
    
$this->debug = ($mode == 'DEBUG_OFF') ? FALSE TRUE;
  }

  
/**
   * Check if db connection is esteblished
   *
   * @return   bool
   * @access   public
   */
  
public function is_connected()
  {
    if(
$this->connection_id == FALSE)
    {
      return 
FALSE;
    }
    else
    {
      return 
mysql_ping($this->connection_id);
    }
  }

  
/**
   * Get error array
   *
   * @return   array
   * @access   public
   */
  
public function get_errors()
  {
    return 
$this->errors;
  }

  
/**
   * Reset error array
   *
   * @return   void
   * @access   public
   */
  
public function reset_errors()
  {
    
$this->errors = array();
  }

  
/**
   * Set accepted errors
   *
   * @param    array   $errors  The Error Array
   * @return   void
   * @access   public
   */
  
public function set_accepted_errors($errors)
  {
    
$this->accepted_errors = (string) $errors;
  }

  
/**
   * Protect the queries against SQL Injection
   *
   * @param    string   $string  SQL Query/Statement
   * @return   string
   * @access   public
   */
  
public function real_escape_string($string)
  {
    return 
mysql_real_escape_string($string);
  }

  
/**
   * Obsolet function! => linked to real_escape_string()
   *
   * @param    string   $string  SQL Query/Statement
   * @return   string
   * @access   public
   *
   * @todo remove from source code
   */
  
public function escape_string($string)
  {
    return 
$this->real_escape_string($string);
  }

  
/**
   * Fetch the result (row) as an associative array, a numeric array or both
   *
   * @param    resource   $query_result  The Resultset
   * @param    bool       $all           ---
   * @return   array
   * @access   public
   */
  
public function fetch_array($query_result FALSE$all FALSE)
  {
    return 
$this->_fetch('array'$query_result$all);
  }

  
/**
   * Fetch the result (row) as an associative array
   *
   * @param    resource   $query_result  The Resultset
   * @param    bool       $all           ---
   * @return   array
   * @access   public
   */
  
public function fetch_assoc($query_result FALSE$all FALSE)
  {
    return 
$this->_fetch('assoc'$query_result$all);
  }

  
/**
   * Fetch the result (row) as an enumerated array
   *
   * @param    resource   $query_result  The Resultset
   * @param    bool       $all           ---
   * @return   array
   * @access   public
   */
  
public function fetch_row($query_result FALSE$all FALSE)
  {
    return 
$this->_fetch('row'$query_result$all);
  }

  
/**
   * ---
   *
   * @param    ---        $type          ---
   * @param    resource   $query_result  The Resultset
   * @param    bool       $all           ---
   * @return   void
   * @access   public
   *
   * @todo eval is evil ;)
   */
  
public function _fetch($type$query_result$all)
  {
    if(
$query_result == FALSE)
    {
      
$query_result $this->query_result;
    }

    if(
$all == FALSE)
    {
      return eval(
'return @mysql_fetch_' $type '( $query_result );');
    }
    else
    {
      
$array = array();
      for (
$i 0$i < @mysql_num_rows($query_result); $i++)
      {
        eval(
'$array[$i] = @mysql_fetch_' $type '( $query_result );');
      }
      return 
$array;
    }
  }

  
/**
   * Get number of rows in $query_result
   *
   * @param    resource   $query_result  The Resultset
   * @return   int|NULL
   * @access   public
   */
  
public function num_rows($query_result FALSE)
  {
    return (
$query_result != FALSE ) ? @mysql_num_rows($query_result) : @mysql_num_rows($this->query_result);
  }

  
/**
   * Get the ID generated in the last query
   *
   * @return   int
   * @access   public
   */
  
public function insert_id()
  {
    return @
mysql_insert_id();
  }

  
/**
   * Get number of affected rows in previous MySQL operation
   *
   * @return   int
   * @access   public
   */
  
public function affected_rows()
  {
    return @
mysql_affected_rows();
  }

  
/**
   * Get number of queries
   *
   * @return   int
   * @access   public
   */
  
public function get_number_of_queries()
  {
    return 
$this->queries;
  }

  
/**
   * Get the last statement
   *
   * @return   string
   * @access   public
   *
   * @todo error handling
   */
  
public function get_last_query()
  {
    return 
$this->statements[count($this->statements) - 1];
  }

  
/**
   * Free all memory associated with the actual result
   *
   * @return   bool
   * @access   public
   */
  
public function free_result()
  {
    @
mysql_free_result($this->query_result);
  }

  
/**
   * Close MySQL connection
   *
   * @return   bool
   * @access   public
   */
  
public function close()
  {
    return @
mysql_close($this->connection_id);
  }

  
/**
   * Destructor
   *
   * @return   void
   * @access   public
   */
  
public function __destruct() {}
}
?>

Kann man das ohne goßen Aufwand anpassen?

Matthias

Offline evaki

  • Posts: 2701
Re: expCounter 1.2 und PHP7
« Reply #1 on: October 18, 2016, 03:36:02 PM »
>>Kann man das ohne großen Aufwand anpassen?
Da ist nicht gerade wenig umzuschreiben, da sich wohl niemand um die deprecated-Meldungen unter php5.x gekümmert hat. Mit 'nem halbfertigen Konverter und manueller Korrektur (ich bin Laie!) bin ich neben anderen Meldungen soeben beim Installationsversuc h bei obsoleten mysql_fetch_*-Funktionen gelandet, und nach dieser Korrektur bei der nächsten Warnung: preg_replace(): The /e modifier is no longer....  Ob danach noch weiteres folgt, und ob die bisherigen Korrekturen erfolgreich sind, weiß ich natürlich (noch) nicht. Hab' nun abgebrochen. Wollte nur aufzeigen, daß es für'n Programmierer was zu tun gibt, wenn auch wahrscheinlich nicht das Riesenproblem ansteht.
MfG. Evaki
« Last Edit: October 18, 2016, 03:42:46 PM by evaki »

Offline jacobi22

  • Posts: 5863
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
Re: expCounter 1.2 und PHP7
« Reply #2 on: October 18, 2016, 04:48:52 PM »
dieses Addon ist im Vergleich zu anderen Erweiterungen relativ komplex, wurde vom Autor aufgegeben. Aus meiner persönlichen Sicht sollte man sich davon verabschieden, es sei denn, es findet sich kurzfristig jemand, der das Modul weiter pflegt. Und selbst dann ist nicht mit einer kurzfristigen Lösung zu rechnen. Die Alternativen (z.b. Ruud's Counter WbStats) sind da wesentlich geringer im Pflegeaufwand und bieten m.E. annähernd das Gleiche Ergebnis
Wer nicht will, findet Gründe, wer will, findet Wege.

Offline evaki

  • Posts: 2701
Re: expCounter 1.2 und PHP7
« Reply #3 on: October 18, 2016, 05:38:28 PM »
Je nach Server könnte möglicherweise das Hinzufügen "extension=mysql.so/dll" ausreichen. Zumindest bei den 5er-Versionen klappte der parallele Betrieb. Hier müßte man schauen, ob's generell ohne Probleme eingebunden werden kann, oder auch noch eigens kompiliert (gibt Anleitung im Netz!) werden muß. Hab' mich deswegen bisher nicht umgeschaut. Betreibe es selbst nur unter 5.x (Aktivierung).
Unter diesen Bedingungen läufts jedenfalls bei mir problemlos.
MfG. Evaki

Offline evaki

  • Posts: 2701
Re: expCounter 1.2 und PHP7
« Reply #4 on: October 18, 2016, 06:02:00 PM »
Habe mich ein wenig im Netz umgeschaut. Anscheinend sucht und bietet man Problemlösungen , um "old code" weiterhgin unter php7 laufen lassen zu können. (Nur ein gefundenes Beispiel "Mysql using Mysqli") Wenns funktioniert, kanns u.U. auch wirtschaftlich sein.
MfG. Evaki
« Last Edit: October 18, 2016, 06:08:09 PM by evaki »

Offline ruebenwurzel

  • Betatester
  • **
  • Posts: 8391
  • Gender: Male
  • Keep on Rockin
    • Familie Gallas Online
Re: expCounter 1.2 und PHP7
« Reply #5 on: October 18, 2016, 08:59:52 PM »
Hallo,

vielen Dank für die Antworten. Bestätigt das, was ich vermutet habe. Das Teil ist so alt und so komplex, dass sich eine Umprogrammierung nicht lohnt, zumindest nicht für den Einsatz zusammen mit WB, denn da gibt es Alternativen (WBstats).

Habe das auch nur noch bei einem Kunden im Einsatz, und der will partout darauf nicht verzichten. Werde ihm erklären, dass er sich mit dem Umstig auf PHP 7 dann von seinem Counter verabschieden darf.

Gott sei Dank läuft es ja noch mit PHP 5.6 und das kann man ja noch einige Zeit einsetzen.

Mysql auf dem Server "zu verbiegen" hört sich gut an und ist sicherlich auch wirtschaftlich wenn's eine größere Anzahl von Kunden und Anwendungen betrifft, aber für einen Kunden und einen "lumpigen" Seitenzähler steht das glaub ich in keinem Verhältnis.

Danke trotzdem an alle, die sich einen Kopf gemacht haben.

Gruß
Matthias

Offline evaki

  • Posts: 2701
Re: expCounter 1.2 und PHP7
« Reply #6 on: October 19, 2016, 12:47:40 PM »
Alternativ kannste im Netz auch nach einem entsprechenden Wrapper suchen (!!!).
Habe heute mal versuchsweise derartige (ein paar) Zeilen in den Counter eingefügt und kam prompt bis zum Abschluß der Installation. Zeigt, daß sich nicht wenige mit derartigen Problemen rumschlagen und 'ne Lösung suchen. 
Ist ja nicht immer nur der Counter, sondern es kann jeden six feet under treffen.
MfG. Evaki
« Last Edit: October 19, 2016, 12:57:19 PM by evaki »

Offline joey19

  • Posts: 97
Re: expCounter 1.2 und PHP7
« Reply #7 on: March 19, 2017, 06:23:22 PM »
... das Thema interessiert mich auch. Ich hatte heute schon auf php 7 umgestellt und musste zurückrudern, weil gesamte Homepage nicht mehr lief, bin jetzt wieder auf php 5.6.

Gibt es eine gangbare Lösung? Alternativ: Ist es möglich, die exp-Counter-Daten in einen anderen Counter zu migrieren? Perspektivisch wäre wohl ein Counter auf einer neuen Architektur sinnvoller ...

Lieben Gruß
Joey

Offline jacobi22

  • Posts: 5863
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
Re: expCounter 1.2 und PHP7
« Reply #8 on: March 19, 2017, 06:48:26 PM »
expCounter.... der Aufwand, das Dingen zu reparieren ist es für die paar Zahlen, die am Ende benötigt werden, einfach zu hoch - meine Meinung: ich muß nicht die VW-Autostadt nachbauen, um zu Hause mein Auto reparieren zu können  :roll:

Ähnliches trifft ein Migrationstool zu
Unsere Alternative ist der wbCounter -> http://addon.WebsiteBaker.org/pages/en/browse-add-ons.php?id=0018DF03

Die paar Daten, die nachher im Frontend gezeigt werden sollen, kann man manuell übernehmen. Dietmar hat da wohl schon etwas in derSchublade, das dem Ausgabe-template des expCounters entspricht, müßt er selber was zu schreiben. Ich benutz solche Frontendausgaben nicht, daher hab ich null Ahnung davon

Wer nicht will, findet Gründe, wer will, findet Wege.

 

postern-length