PHP использует значения GET из URL для использования в функции - PullRequest
2 голосов
/ 17 февраля 2012

Я пытаюсь изменить код php, чтобы получить значения из URL и использовать их в функции конвертера.Я продолжаю получать «объект не найден», когда я пытаюсь использовать его на URL-адресе, например так ...

https://localhost/atwd/test/white%20hat/conv?amnt=10&from=GBP&to=USD

Ниже приведен мой CurrencyConverter.php файл

<?php
class CurrencyConverter    
{
    var $xml_file = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml";
    var $mysql_host, $mysql_user, $mysql_pass, $mysql_db, $mysql_table;
    var $exchange_rates = array();

    // Load Currency Rates

    function CurrencyConverter($host, $user, $pass, $db, $tb)
    {
        $this->mysql_host = $host;
        this->mysql_user = $user;
        $this->mysql_pass = $pass;
        $this->mysql_db = $db;
        $this->mysql_table = $tb;

        $this->checkLastUpdated();

        $conn = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass);
        $rs = mysql_select_db($this->mysql_db, $conn);
        $sql = "SELECT * FROM " . $this->mysql_table;
        $rs = mysql_query($sql, $conn);

        while ($row = mysql_fetch_array($rs))
        {
            $this->exchange_rates[$row['currency']] = $row['rate'];
        }
    }

    /* Perform the actual conversion, defaults to £1.00 GBP to USD */
    function convert($a, $b, $c, $decimals = 2)
    {
        $a = $_GET['amnt'];
        $b = $_GET['from'];
        $c = $_GET['to'];

        strip_tags($a);
        strip_tags($b);
        strip_tags($c);

        return (number_format(($a / $this->exchange_rates[$b]) * $this->exchange_rates[$c], $decimals));
    }

    /* Check to see how long since the data was last updated */
    function checkLastUpdated()
    {
        $conn = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass);
        $rs = mysql_select_db($this->mysql_db, $conn);
        $sql = "SHOW TABLE STATUS FROM " . $this->mysql_db . " LIKE '" . $this->mysql_table . "'";
        $rs = mysql_query($sql, $conn);

        if (mysql_num_rows($rs) == 0)
        {
            $this->createTable();
        }
        else
        {
            $row = mysql_fetch_array($rs);
            if (time() > (strtotime($row["Update_time"]) + (12 * 60 * 60)))
            {
                $this->downloadExchangeRates();
            }
        }
    }

    /* Download xml file, extract exchange rates and store values in database */
    function downloadExchangeRates()
    {
        $currency_domain = substr($this->xml_file, 0, strpos($this->xml_file, "/"));
        $currency_file = substr($this->xml_file, strpos($this->xml_file, "/"));
        $fp = @fsockopen($currency_domain, 80, $errno, $errstr, 10);
        if ($fp)
        {
            $out = "GET " . $currency_file . " HTTP/1.1\r\n";
            $out.= "Host: " . $currency_domain . "\r\n";
            $out.= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8)      Gecko/20051111 Firefox/1.5\r\n";
            $out.= "Connection: Close\r\n\r\n";
            fwrite($fp, $out);
            while (!feof($fp))
            {
                $buffer = fgets($fp, 128);
            }

            fclose($fp);
            $pattern = "{<Cube\s*currency='(\w*)'\s*rate='([\d\.]*)'/>}is";
            preg_match_all($pattern, $buffer, $xml_rates);
            array_shift($xml_rates);
            for ($i = 0; $i < count($xml_rates[0]); $i++)
            {
                $exchange_rate[$xml_rates[0][$i]] = $xml_rates[1][$i];
            }

            $conn = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass);
            $rs = mysql_select_db($this->mysql_db, $conn);
            foreach($exchange_rate as $currency => $rate)
            {
                if ((is_numeric($rate)) && ($rate != 0))
                {
                    $sql = "SELECT * FROM " . $this->mysql_table . " WHERE currency='" . $currency . "'";
                    $rs = mysql_query($sql, $conn) or die(mysql_error());
                    if (mysql_num_rows($rs) > 0)
                    {
                        $sql = "UPDATE " . $this->mysql_table . " SET rate=" . $rate . " WHERE currency='" . $currency . "'";
                    }
                    else
                    {
                        $sql = "INSERT INTO " . $this->mysql_table . " VALUES('" . $currency . "'," . $rate . ")";
                    }

                    $rs = mysql_query($sql, $conn) or die(mysql_error());
                }
            }
        }
    }

    /* Create the currency exchange table */
    function createTable()
    {
        $conn = mysql_connect($this->mysql_host, $this->mysql_user, $this->mysql_pass);
        $rs = mysql_select_db($this->mysql_db, $conn);
        $sql = "CREATE TABLE " . $this->mysql_table . " ( currency char(3) NOT NULL default '',  rate float NOT NULL default '0', PRIMARY KEY(currency) ) ENGINE=MyISAM";
        $rs = mysql_query($sql, $conn) or die(mysql_error());
        $sql = "INSERT INTO " . $this->mysql_table . " VALUES('EUR',1)";
        $rs = mysql_query($sql, $conn) or die(mysql_error());

        $this->downloadExchangeRates();
    }
}

и вот где я вызываю функцию из другого файла с именем conv.php.

 <?php
     include 'CurrencyConverter.php';

     $x = new CurrencyConverter('localhost','root','','converterTest','currency');   

     echo $x->convert($a, $b, $c);

Любая помощь очень ценится!

1 Ответ

1 голос
/ 17 февраля 2012

Если в вашем главном файле есть функция convert, это может быть отсутствующий файл, оканчивающийся на URL:

https://localhost/atwd/test/white%20hat/conv.php?amnt=10&from=GBP&to=USD

Если функция 'convert' находится в файле 'CurrencyConverter.php', вы можете попробовать включить ее с параметрами:

include('CurrencyConverter.php?foo=1&bar=2');

EDIT:

Примечание: неопределенная переменная: exchange_rate in C: \ xampp \ htdocs \ atwd \ test \ white hat \ CurrencyConverter.php в строке 106

-> В строке 99 вы определяете $exchange_rate[$xml_rates[0][$i]], а не $exchange_rate это не то же самое и вызывает ошибку.

Предупреждение. В foreach () указан неверный аргумент C: \ xampp \ htdocs \ atwd \ test \ white hat \ CurrencyConverter.php в строке 106

-> Это похоже на последствие неопределенной переменной $ exchange_rate

Примечание: неопределенная переменная: a в C: \ xampp \ htdocs \ atwd \ test \ white hat \ conv.php в строке 6 Примечание: неопределенная переменная: b in C: \ xampp \ htdocs \ atwd \ test \ white hat \ conv.php в строке 6 Примечание: Неопределенная переменная: c в C: \ xampp \ htdocs \ atwd \ test \ white hat \ conv.php по линии 6

-> Вот ошибка, я думаю. Вы пытаетесь вызвать функцию convert() form 'CurrencyConverter.php', но переменные $a, $b и $c определены в самой функции. Таким образом, переменные не определены в 'conv.php' и вызове convert() пока нет. Я бы посоветовал вам попытаться $ _GET получить значения url и одновременно определить переменную в вызове функции.

convert($_GET['amnt'], $_GET['from'], $_GET['to'])

Таким образом, у вас уже есть переменные, определенные в вашем CurrencyConverter.php, и вы можете удалить строки с 41 по 43.

...