Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Programmierfrage - class zerhaut mir die Ausgabe

    kaisa

    • Schreiberling
    • Beiträge: 365
    Programmierfrage - class zerhaut mir die Ausgabe
    am: 18. November 2014, 01:20:13
    Ich möchte ein IP2Country einbauen und im Admin anzeigen lassen. Datenbank ist in der Shopdatenbank eingesetzt.

    admin/orders.php
    Code: PHP  [Auswählen]
    require ('includes/classes/phpip2country.class.php');
    $dbConfigArray = array(
        'host' => 'localhost', //example host name
        'port' => 3306, //3306 -default mysql port number
        'dbName' => 'shop2', //example db name
        'dbUserName' => 'obaguru', //example user name
        'dbUserPassword' => '123', //example user password
        'tableName' => 'ip_to_country', //example table name
    );
     

    weiter unten der Knackpunkt:
    Code: PHP  [Auswählen]
    <?php // BOF *KS* link to Whois-Service and ip2country
    $phpip2Country = new phpIp2Country($order->customer['cIP'],$dbConfigArray);
    // $ipcountry = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
    ?>
                    <td class="main" valign="top" bgcolor="#FFCC33"><strong><?php echo IP; ?></strong></td>
                    <td class="main" bgcolor="#FFCC33"><strong><?php echo '<a href="'.WHOS_ONLINE_IP_WHOIS_SERVICE.$order->customer['cIP'].'">'.$order->customer['cIP'].'</a> '.$ipcountry; ?></strong></td>

    Sobald ich diese Zeile aktiviere, zerhaut es die Seite, als wenn die weitere Berechnung abbricht und nur ein kleiner teil der Seite gelasden wird:
    Code: PHP  [Auswählen]
    $ipcountry = $phpIp2Country->getInfo(IP_COUNTRY_NAME);

    Ich habe shcon zig Varianten getestet. Trial and Error. Bin mit meinem Latein am Ende. Ich weiß nichteinmal, ob korregte Werte zurückgeliefert werden. Print_r ging nicht. Aber es gibt keine Fehlermeldung im Skript (mehr). Das ist gut.

    Hat jemand eine Idee?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=31511.0
    Trade Republic - Provisionsfrei Aktien handeln

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #1 am: 18. November 2014, 02:15:51
    error_reporting ist an?

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #2 am: 18. November 2014, 08:06:57
    Code: PHP  [Auswählen]
    <?php // BOF *KS* link to Whois-Service and ip2country
    $phpip2Country = new phpIp2Country($order->customer['cIP'],$dbConfigArray);
    // $ipcountry = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
    ?>
    sondern
    Code: PHP  [Auswählen]
    <?php // BOF *KS* link to Whois-Service and ip2country
    $phpIp2Country = new phpIp2Country($order->customer['cIP'],$dbConfigArray);
    // $ipcountry = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
    ?>

    mr.mc.mauser

    • Fördermitglied
    • Beiträge: 343
    • Geschlecht:
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #3 am: 18. November 2014, 08:10:01
    Hast Du mal das Gesamte Script / Modul als zip ?
    es wäre leichter wenn man sehen könnte was in der Klasse genau passiert

    kaisa

    • Schreiberling
    • Beiträge: 365
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #4 am: 18. November 2014, 08:24:01
    Error-reporting zeigt jetzt:
    Zitat
    Call to a member function getInfo() on a non-object in /var/www/virtual/sportfotos-online.com/htdocs/shop/admin/orders.php on line 503

    @webald: Ich sehe keinen Unterschied in den Blöcken.

    Am liebsten würde ich noch die bestehende Datenbankverbindung vom Shop benutzen und nicht alles nochmal definieren.

    Das hier ist die Klasse von der Webseite
    https://bitbucket.org/magorski/php-ip-2-country/src

    Code: PHP  [Auswählen]
    <?php
    /**
     * phpIp2Country class
     *
     * @author Mariusz Górski
     * @copyright 2008 Mariusz Górski
     * @name phpIp2Country
     * @version 1.0
     * @link http://code.google.com/p/php-ip-2-country/
     *
     * @todo (static?) function to get full countries list
     */


    define('IP_STR',1);
    define('IP_VALUE',2);
    define('IP_RANGE_NUMERICAL',3);
    define('IP_RANGE',4);
    define('IP_REGISTRY',5);
    define('IP_ASSIGNED_UNIXTIME',6);
    define('IP_COUNTRY_ISO',7);
    define('IP_COUNTRY_CODE',8);
    define('IP_COUNTRY_NAME',9);
    define('IP_INFO',10);

    class phpIp2Country {

            /**
             * @param string $ip
             * @param ip $method
             */

            function __construct($ip,$dbConfig=array()){
                    if(!$this->chceckIpAddr($ip)){
                            die('Bad IP address! Should be in xxx.xxx.xxx.xxx format!');
                    }else{
                            $this->ip = $ip;
                    }
                   
                    if(!is_array($dbConfig)){
                            die('Error! Database configuration not set! #1');
                    }else{
                            $this->dbConfig = $dbConfig;
                    }
                   
                    $this->dbConnect();
                   
                    $this->ipArr = $this->getIpArr();
                    $this->ipValue = $this->getIpValue();
                   
                    $this->ipInfoArr = $this->dbGetRow($this->getIpSelectSQL());
                   
                    if(!$this->ipInfoArr){
                            die ('Error during reciving informations about IP address!');
                    }else{
                            $this->ipInfoArr['IP_STR'] = $this->ip;
                            $this->ipInfoArr['IP_VALUE'] = $this->ipValue;
                            $this->ipInfoArr['IP_FROM_STR'] = $this->getIpFromValue($this->ipInfoArr['IP_FROM']);
                            $this->ipInfoArr['IP_TO_STR'] = $this->getIpFromValue($this->ipInfoArr['IP_TO']);
                    }
            }
           
            function __destruct(){
                    if($this->db)
                            mysql_close($this->db);
            }
           
            /**
             * IP address
             *
             * @var string
             */

            public $ip = '';
           
            /**
             * Numerical representation of IP address
             *       Example: (from Right to Left)
             *       1.2.3.4 = 4 + (3 * 256) + (2 * 256 * 256) + (1 * 256 * 256 * 256)
             *       is 4 + 768 + 13,1072 + 16,777,216 = 16,909,060
             * @var integer
             */

            private $ipValue = NULL;
           
            /**
             * database conection configuration
             * feel free to replece our db conection and use Your favorite database abstraction layer (ie. ADOdb)
             *
             * @var array
             */

            public $dbConfig = array();
           
            /**
             * database conection object
             * feel free to replece our db conection and use Your favorite database abstraction layer (ie. ADOdb)
             *
             * @var object
             */

            public $db = false;
           
            /**
             * IP address in form of array of integer values
             *
             * @var string
             */

            private $ipArr = array();
           
            /**
             * IP address information array
             *
             * @var string
             */

            private $ipInfoArr = false;
           
            /**
             * returns information about IP adrress
             *
             * @param integer $mode
             * @return mixed
             */

            public function getInfo($mode=IP_INFO){
                    if(!in_array($mode,array( IP_STR , IP_VALUE, IP_RANGE_NUMERICAL, IP_RANGE, IP_REGISTRY, IP_ASSIGNED_UNIXTIME , IP_COUNTRY_ISO, IP_COUNTRY_CODE, IP_COUNTRY_NAME, IP_INFO, ))){
                            die('Error! Bad getInfo() mode!');
                    }else switch($mode){
                            case IP_STR:
                                    return $this->ipInfoArr['IP_STR'];
                                    break;
                            case IP_VALUE:
                                    return $this->ipInfoArr['IP_VALUE'];
                                    break;
                            case IP_RANGE_NUMERICAL:
                                    return array(
                                             'FROM' => $this->ipInfoArr['IP_FROM'],
                                             'TO' => $this->ipInfoArr['IP_TO']
                                    );
                                    break;
                            case IP_RANGE:
                                    return array(
                                             'FROM' => $this->ipInfoArr['IP_FROM_STR'],
                                             'TO' => $this->ipInfoArr['IP_TO_STR']
                                    );
                                    break;
                            case IP_REGISTRY:
                                    return $this->ipInfoArr['REGISTRY'];
                                    break;
                            case IP_ASSIGNED_UNIXTIME:
                                    return $this->ipInfoArr['ASSIGNED'];
                                    break;
                            case IP_COUNTRY_ISO:
                                    return $this->ipInfoArr['CTRY'];
                                    break;
                            case IP_COUNTRY_CODE:
                                    return $this->ipInfoArr['CNTRY'];
                                    break;
                            case IP_COUNTRY_NAME:
                                    return $this->ipInfoArr['COUNTRY'];
                                    break;
                            case IP_INFO:
                            default:
                                    return $this->ipInfoArr;
                                    break;
                    }
            }
           
            /**
             * validate IP address
             *
             * @param string $ip
             * @return boolean
             */

            private function chceckIpAddr($ip=''){
                    return preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/i',$ip);
            }
           
            /**
             * returns IP address in array of integer values
             *
             * @return array
             */

            private function getIpArr(){
                    $vars = explode('.',$this->ip);
                    return array(
                            intval($vars[0]),
                            intval($vars[1]),
                            intval($vars[2]),
                            intval($vars[3])
                    );
            }
           
            /**
             * returns numerical representation of IP address.
             *       Example: (from Right to Left)
             *       1.2.3.4 = 4 + (3 * 256) + (2 * 256 * 256) + (1 * 256 * 256 * 256)
             *       is 4 + 768 + 13,1072 + 16,777,216 = 16,909,060
             *
             * @return integer
             */

            private function getIpValue(){
                    return $this->ipArr[3] + ( $this->ipArr[2] * 256 ) + ( $this->ipArr[1] * 256 * 256 ) + ( $this->ipArr[0] * 256 * 256 * 256 );
            }
           
            /**
             * returns IP numer from numerical representation.
             *       Example: (from Right to Left)
             *       1.2.3.4 = 4 + (3 * 256) + (2 * 256 * 256) + (1 * 256 * 256 * 256)
             *       is 4 + 768 + 13,1072 + 16,777,216 = 16,909,060
             *
             * @param integer $value
             * @param boolean $returnAsStr
             * @return mixed
             */

            private function getIpFromValue($value=0,$returnAsStr=true){
                    $ip[0] = floor( intval($value) / (256*256*256) );
                    $ip[1] = floor( ( intval($value) - $ip[0]*256*256*256 ) / (256*256) );
                    $ip[2] = floor( ( intval($value) -$ip[0]*256*256*256 -$ip[1]*256*256 ) / 256 );
                    $ip[3] = intval($value) - $ip[0]*256*256*256 - $ip[1]*256*256 - $ip[2]*256;
                    if($returnAsStr){
                            return $ip[0].'.'.$ip[1].'.'.$ip[2].'.'.$ip[3];
                    }else{
                            return $ip;
                    }
            }
           
            /**
             * returns SQL used to get iformation from ip2country database
             *
             * @return string
             */

            private function getIpSelectSQL(){
                    if(empty($this->dbConfig['tableName'])){
                            $this->dbConfig['tableName'] = 'ip_to_country'; //setting default mysql port name
                            echo "phpPp2Country table name not selected! traying default value: '".$this->dbConfig['tableName']."'";
                    }
                    return 'SELECT * FROM '.$this->dbConfig['tableName'].' WHERE IP_FROM <= '.$this->ipValue.' AND IP_TO >= '.$this->ipValue;
            }
           
            /**
             * connect to database
             * feel free to replece our function and use here Your favorite(s) database abstraction layer (ie. ADOdb)
             *
             * @return object - database conection resource
             */

            private function dbConnect(){
                    if(is_array($this->dbConfig)){
                            if(empty($this->dbConfig['host'])){
                                    $this->dbConfig['host'] = 'localhost'; //setting default mysql port name
                                    echo "Database connection host not selected! traying default value: '".$this->dbConfig['port']."'";
                            }
                            if(intval($this->dbConfig['port']==0)){
                                    $this->dbConfig['port'] = 3306; //setting default mysql port name
                                    echo "Database connection port not selected! traying default value: '".$this->dbConfig['port']."'";
                            }
                            if(empty($this->dbConfig['dbUserName'])){
                                    $this->dbConfig['dbUserName'] = 'ip_to_country'; //setting default mysql port name
                                    echo "Database connection host not selected! traying default value: '".$this->dbConfig['dbUserName']."'";
                            }
                            if(empty($this->dbConfig['dbUserPassword'])){
                                    $this->dbConfig['dbUserPassword'] = 'xxx'; //setting default mysql port name
                                    echo "Database connection host not selected! traying default value: '".$this->dbConfig['dbUserPassword']."'";
                            }
                            $this->db = mysql_connect($this->dbConfig['host'].':'.$this->dbConfig['port'], $this->dbConfig['dbUserName'], $this->dbConfig['dbUserPassword']);
                            if (!$this->db) {
                                die('Database connection error: ' . mysql_error());
                            }else{
                                    if(empty($this->dbConfig['dbName'])){
                                            $this->dbConfig['dbName'] = 'ip_to_country'; //setting default mysql port name
                                            echo "Database connection host not selected! traying default value: '".$this->dbConfig['dbName']."'";
                                    }
                                    if( !mysql_select_db( $this->dbConfig['dbName'] , $this->db ) ){
                                            die("Error during selecting database '".$this->dbConfig['dbName']."' : ". mysql_error());
                                    }else{
                                            return true;
                                    }
                            }
                    }else{
                            die('Error! Database configuration not set! #2');
                    }
            }
           
            /**
             * executes given SQL querry and returns one row
             * feel free to replece our function and use here Your favorite(s) database abstraction layer (ie. ADOdb)
             *
             * @param string $sql
             * @return array
             */

            private function dbGetRow($sql){
                    $result = mysql_query($sql);
                    if($result){
                            $row = mysql_fetch_assoc($result);
                            if($row){
                                    return $row;
                            }
                    }
                    die("Error during database querry:" . mysql_error());
            }
    }

    kaisa

    • Schreiberling
    • Beiträge: 365
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #5 am: 18. November 2014, 08:30:14
    Hach, es klappt. Error_reporting hat mich darauf hingewiesen.

    Jetzt sehe ich auch, was webald meinte:
    Es war die unterschiedliche Schreibweise der Variable:
    $phpIp2Country
    $phpip2Country

    Ok, Erweiterung klappt. Jetzt sehe ich das IP-Land bei Kundenbestellungen. Vielleicht gibt jemand einen Tipp, das (mit den Datenbankinfos) besser zu integrieren. Dann würde ich das noch an anderen Stellen einbauen.

    Da kriege ich jetzt in customers.php (um es im IPLOG einzubauen) die Meldung
    Zitat
    Warning: mysql_close(): 279 is not a valid MySQL-Link resource in /var/www/isis-memorabilia.af/htdocs/shop/admin/includes/classes/phpip2country.class.php on line 63

    Warning: mysql_close(): 282 is not a valid MySQL-Link resource in /var/www/isis-memorabilia.af/htdocs/shop/admin/includes/classes/phpip2country.class.php on line 63

    Warning: mysql_close(): 285 is not a valid MySQL-Link resource in /var/www/isis-memorabilia.af/htdocs/shop/admin/includes/classes/phpip2country.class.php on line 63

    Mal sehen, wer den Fehler entdeckt  :flee-mrgreen:

    Matt

    • Experte
    • Beiträge: 4.241
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #6 am: 18. November 2014, 12:56:38
    Finde nur ich den Ansatz, den der Kollege da auf bitbucket betreibt, hoffnungslos übertrieben? Sieht aus wie ein Java-Entwickler. Hauptsache umständlich gemacht und in einer Klasse gewrapped.

    Mal ein pragmatischer Ansatz auf Basis der Datenbanktabelle die da im Bitbucket verlinkt ist:
    admin/orders.php, Zeilen 411 bis 414:
    Code: PHP  [Auswählen]
                  <tr>
                    <td class="main" valign="top" bgcolor="#FFCC33"><b><?php echo IP; ?></b></td>
                    <td class="main" bgcolor="#FFCC33"><b><?php echo $order->customer['cIP']; ?></b></td>
                  </tr>
     
    ersetzen durch
    Code: PHP  [Auswählen]
                  <?php
                    $sSql = sprintf("select * from ip_to_country where inet_aton('%s') between IP_FROM and IP_TO", $order->customer['cIP']);
                    $oQuery = xtc_db_query($sSql);
                    $aCountryToIP = xtc_db_fetch_array($oQuery);
                  ?>
                  <tr>
                    <td class="main" valign="top" bgcolor="#FFCC33"><b><?php echo IP; ?></b></td>
                    <td class="main" bgcolor="#FFCC33"><b><?php echo $order->customer['cIP']; ?><?php echo !empty($aCountryToIP['COUNTRY']) ? $aCountryToIP['COUNTRY'] : '' ?></b></td>
                  </tr>
     

    Alternativ könnte man auch per curl einfach http://ipinfo.io/ fragen, was sie an Infos zu dieser IP haben. Macht den Seitenaufbau aber schon langsamer und kann relativ schnell nervig werden.

    kaisa

    • Schreiberling
    • Beiträge: 365
    ip2country
    Antwort #7 am: 18. November 2014, 13:06:25
    Wow, Matt. Das ist natürlich ungemein kompakter, wenn auch nicht ganz so flexibel wie die Klasse (andere Infos über IP möglich). Aber das Land reicht ja.
    von ip2country nun variablen country2ip verwenden klingt verwirrend. Aber es funktioniert.  :thx:

    Wie du sagtest, habe ich mich gegen eine Online-Version entschieden, da es den Seitenaufbau verlangsamen könnte oder der Dienst kostenpflichtig wird oder eingestellt werden könnte.

    Man muss nur die Datenbank gelegentlich aktualisieren. Das könnte ein cron-job erledigen:

    Zitat
    wget https://raw.githubusercontent.com/magorski/php-ip-2-country/master/ip_to_country.sql
    mysql -uuser -ppass db < ip_to_country.sql

    Matt

    • Experte
    • Beiträge: 4.241
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #8 am: 18. November 2014, 14:09:27
    Wow, Matt. Das ist natürlich ungemein kompakter, wenn auch nicht ganz so flexibel wie die Klasse (andere Infos über IP möglich). Aber das Land reicht ja.

    Im Array $aCountryToIP ist prinzipiell jede Info drin. Du musst sie nur auslesen.
    Code: PHP  [Auswählen]
    <td class="main" bgcolor="#FFCC33"><b><?php echo $order->customer['cIP']; ?><?php echo !empty($aCountryToIP['COUNTRY']) ? "<img src='/admin/images/flags/".$aCountryToIP['CTRY'].".png' alt=''/>". $aCountryToIP['COUNTRY'] : '' ?></b></td>
    Zeigt auch noch die Flagge, vorausgesetzt, die liegen mit der ISO-Bezeichnung in eben diesem Ordner. Komische Namen für seine Tabellenfelder hat der Kollege übrigens auch...

    von ip2country nun variablen country2ip verwenden klingt verwirrend. Aber es funktioniert.  :thx:

    Den Satz habe ich ehrlich gesagt nicht verstanden.

    Man muss nur die Datenbank gelegentlich aktualisieren. Das könnte ein cron-job erledigen:
    Zitat
    wget https://raw.githubusercontent.com/magorski/php-ip-2-country/master/ip_to_country.sql
    mysql -uuser -ppass db < ip_to_country.sql

    Das wird nicht funktionieren. Entweder musst du vorher einen DROP machen oder die Datenbank zumindest leeren. Ungetestet:
    Code: PHP  [Auswählen]
    <?php
    require_once('includes/application_top.php');
    xtc_db_query("DROP table IF EXISTS `ip_to_country`");

    xtc_db_query(file_get_contents('https://raw.githubusercontent.com/magorski/php-ip-2-country/master/ip_to_country.sql'));
     

    kaisa

    • Schreiberling
    • Beiträge: 365
    Re: Programmierfrage - class zerhaut mir die Ausgabe
    Antwort #9 am: 18. November 2014, 14:23:22
    woah. Tja, da sieht man, dass ich meist nur ein copy&paste-Programmierer bin und dann durch trial und error probiere, das hinzubasteln. Klappt auch oft.

    Toll, solche kurzen und knackigen Lösungen zu sehen, die ich auch verstehen kann, aber bisher nicht kannte. SQL-Abfrage und auch nun das laden einer sql-tabelle direkt von einer URL.  :good: Ist aber sicher auch ein Sicherheitsproblem, wenn Befehle von einer fremden URL-Datei automatisiert ausgeführt würden  :-?

    Zitat
    von ip2country nun variablen country2ip verwenden klingt verwirrend. Aber es funktioniert
    Ich meine, für eine Funktion, die die IP zu einem Ländernamen konvertiert, macht IP2Country Sinn. Du hast den Variablen den Namen country2ip gegeben, was bei mir dann gleich zu Zuckungen in den Gehirnwendungen führt. Wohl alles Interpretationssache.
    11 Antworten
    3005 Aufrufe
    07. Mai 2020, 08:57:33 von JWi
    1 Antworten
    1548 Aufrufe
    16. Dezember 2014, 11:54:15 von webald
    12 Antworten
    6754 Aufrufe
    04. Juli 2011, 18:41:34 von Sick
    2 Antworten
    2788 Aufrufe
    10. Februar 2011, 09:49:37 von nugget
               
    anything