yahoo.stocks.class - Probleme?

Uller

Grünschnabel
Hallo,

kennt jemand von Euch das PHP-Skript auf http://www.giombetti.com mittels welchem sich die Aktienkurse von finance.yahoo.com abfragen und in eine mysql-Datenbank speichern lassen?

Würde dies gern verwenden, komme jedoch mit dem Skript nicht zu recht

habe das Skript so ausgeführt, wie es unter http://giombetti.com/snippets/14 zu finden ist, erhalte aber die folgende Fehlermeldung:


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\Programme\Apache Group\Apache2\htdocs\yahoo.stocks.class.php on line 148

Ich denke ich mache irgendwas falsch - wäre nett, wenn mir jemand helfen könnte!

Vielen Dank schon im Voraus!
 
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\Programme\Apache Group\Apache2\htdocs\yahoo.stocks.class.php on line 148

Bedeutet nicht weniger, das man die $Variable oder ein Befehl nicht richtig mit dem Symikolion beendet hat :)!

Werd mal schauen, wo der Fehler drinliegt... Aha habs schon gefunden..

In der Zeile 148:

PHP:
$read = str_replace(""", "", trim(fread($open, 2000)));

ersetze es mal durch das:

PHP:
$read = str_replace("", "", trim(fread($open, 2000)));

War nähmlich zu viel "" drin :)!
 
Zuletzt bearbeitet:
Gut, Danke, die Fehlermeldung ist jetzt weg, aber die Daten werden immer noch nicht in die Datenbank eingefügt, muss ich die Klasse eigentlich irgendwie von ner anderen Datei aufrufen, (Bin absoluter Newbie - musst Du wissen)....

War keine ausführliche Anleitung zur Verwendung des Scripts dabei!

Gruß, Chris
 
Also, wie sieht dein jetziges Script aus? Haste die class mit einer Instanzvariable aufgerufen?

Das du keine Daten hast, kann sein das du die Tabelle noch nicht in deiner MySQL DB hast :)!

Du musst dir eine Class wie eine Struktur vorstellen, die du dann mit einer Instanzvariable benutzen kannst, ohne ein Aufruf passiert nix :)!

Ich werd mal das Script ausprobieren und eine Lösung hier schreiben..

[Anleitung:]

1.0 MySQL Tabelle stocks erstellen

Code:
-- phpMyAdmin SQL Dump
-- version 2.6.0-pl2
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Erstellungszeit: 24. Oktober 2004 um 19:39
-- Server Version: 4.0.14
-- PHP-Version: 4.3.8
-- 
-- Datenbank: `test`
-- 

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `stocks`
-- 
-- Erzeugt am: 24. Oktober 2004 um 19:35
-- Aktualisiert am: 24. Oktober 2004 um 19:36
-- 

DROP TABLE IF EXISTS `stocks`;
CREATE TABLE IF NOT EXISTS `stocks` (
  `ID` int(11) NOT NULL auto_increment,
  `stock` varchar(64) NOT NULL default '',
  `value` varchar(16) NOT NULL default '0',
  `changepoints` varchar(16) NOT NULL default '0',
  `open` varchar(16) NOT NULL default '',
  `intra_top` varchar(16) NOT NULL default '',
  `intra_down` varchar(16) NOT NULL default '',
  `date` varchar(10) NOT NULL default '',
  `time` varchar(6) NOT NULL default '',
  `unixtime` int(12) NOT NULL default '0',
  `reallocaltime` int(12) NOT NULL default '0',
  `md5` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=40 ;

Du musst den Code in phpmyadmin ausführen und bekommst die Tabelle, der SQL Code steht auch nochmal im Script bei den Kommentars drin :)!

1.1 Ausführung:

Nach der 'class' Struktur musst du das Ausführen lassen!

PHP:
$stocks = new yahoo_stocks(); 
$stocks->my_connect();//if you have no open mySQL connection (yet) 
$eurostoxx = $stocks->get_stocks("^STOXX50E", "y"); //Get data for Euro StoXX 50 and use cache (returns an array) 
$dowjones = $stocks->get_stocks("^DJI", "n");//Dow Jones and no cacheing 
echo var_dump($stocks->get_stocks("^DJI", "n"));//displays the kind of array this class returns 
$stocks->my_close();

>> Die Funktion var_dump zeigt dir nochmal alles was in den Arrays drin steht, kannst aber weglassen wenn du möchtest :)! Bei mir hat er nun dann die Daten in die Datenbank geschrieben in die Tabelle :D!

Also es stand fast alles in den langen Kommentar!
 
Zuletzt bearbeitet:
Hallo,

vielen vielen Dank für Deine ausführliche Hilfe....

Hab jetzt den code

$stocks = new yahoo_stocks();
$stocks->my_connect();//if you have no open mySQL connection (yet)
$eurostoxx = $stocks->get_stocks("^STOXX50E", "y"); //Get data for Euro StoXX 50 and use cache (returns an array)
$dowjones = $stocks->get_stocks("^DJI", "n");//Dow Jones and no cacheing
echo var_dump($stocks->get_stocks("^DJI", "n"));//displays the kind of array this class returns
$stocks->my_close();


hinten an die Datei angefügt, und sie geöffnet, erhalte jetzt allerdings folgende Warnungen:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Programme\Apache Group\Apache2\htdocs\yahoo.stocks.class.php on line 109

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Programme\Apache Group\Apache2\htdocs\yahoo.stocks.class.php on line 117
array(10) { ["unixtime"]=> int(1098475320) ["stock"]=> string(6) ""^DJI"" ["value"]=> string(7) "9757.81" ["date"]=> string(10) "22.10.2004" ["time"]=> string(5) "22:02" ["changepoints"]=> string(7) "-107.95" ["open"]=> string(7) "9863.85" ["intra_top"]=> string(7) "9883.25" ["intra_down"]=> string(7) "9753.02" ["md5"]=> string(32) "4b0ec9160de5a4817b14da9519fe492b" }


Die Tabelle bleibt dabei leer.....


Tut mir leid, wenn ichs absolut nicht raff, aber bin halt noch Anfänger :)
 
Hast du die Variablen ausgefüllt? Weil nicht gültige Daten kommen Fehler auf :)!

Such mal diese Zeile:

PHP:
var $time = "+6"; //ATTENTION: daylight saving isn't (yet) respected 
var $refreshtime = "1"; //minimal 0,25 because yahoo updates their values approx every 15sec! 
var $dbhost = "localhost"; 
var $user = "root"; 
var $passwd = ""; 
var $db = "test"; 
var $stocks_table = "stocks";

Und das Script sollte dann so aussehen:

PHP:
<?PHP

/** 
* Class:             yahoo.stocks.class.php 
* Require:           mySQL (if using cache functionality) 
* Optional: 
* Description:       A class to grab the latest stocks from Yahoo Finance, and to cache them optionally 
* Created on:        Thu, 31 Jul 2003 14:01:46 +0200 
* Last Change:       Wed, 31 Mar 2004 12:59:35 +0200 
* Author:            Marc Giombetti <marc@giombetti.com> 
* Website:              http://www.giombetti.com 
* Copyright:         GPL - General Public License 
* Version:           0.2 
* Bugfies:           Scott Bratcher (Problems with -6 timezones) 
* 
* ----------------------------------------------------------------------------- 
* Configuration options 
* 
* $time                - Difference in time between you and the yahoo Server (GMT) 
* $refreshtime            - How often a value may (at most) be checked for on the yahoo website (in minutes) 
*                           (Minimal value is 0,25 because yahoo updates the stocks approx every 15sec) 
* The following values are only necessary if the cache functionality is used 
* $dbhost                - mySQL database host 
* $user                - mySQL username 
* $passwd                - mySQL password 
* $db                    - mySQL database 
* $stocks_table        - mySQL table 
* 
* ----------------------------------------------------------------------------- 
* mySQL table structure (only needed if cache functionality is used and no active mySQL connection to $db is present) 
* 
* CREATE TABLE `stocks` ( 
*     `ID` int(11) NOT NULL auto_increment, 
*     `stock` varchar(64) NOT NULL default '', 
*     `value` varchar(16) NOT NULL default '0', 
*     `changepoints` varchar(16) NOT NULL default '0', 
*     `open` varchar(16) NOT NULL default '', 
*     `intra_top` varchar(16) NOT NULL default '', 
*     `intra_down` varchar(16) NOT NULL default '', 
*     `date` varchar(10) NOT NULL default '', 
*     `time` varchar(6) NOT NULL default '', 
*     `unixtime` int(12) NOT NULL default '0', 
*     `reallocaltime` int(12) NOT NULL default '0', 
*     `md5` varchar(32) NOT NULL default '', 
*     PRIMARY KEY  (`ID`) 
* ) TYPE=MyISAM AUTO_INCREMENT=39 ; 
* 
* ----------------------------------------------------------------------------- 
* How to use this class? - Examples: 
* 
* $stocks = new yahoo_stocks(); 
* $stocks->my_connect();//if you have no open mySQL connection (yet) 
* $eurostoxx = $stocks->get_stocks("^STOXX50E", "y"); //Get data for Euro StoXX 50 and use cache (returns an array) 
* $dowjones = $stocks->get_stocks("^DJI", "n");//Dow Jones and no cacheing 
* echo var_dump($stocks->get_stocks("^DJI", "n"));//displays the kind of array this class returns 
* $stocks->my_close(); 
* 
* ----------------------------------------------------------------------------- 
* Some tock keywords: 
* ^DJI         - Dow Jones 
* ^IXIC         - Nasdaq 
* ^GSPC         - S&P 500 
* ^STOXX50E     - Euro STOXX50 
* For more stock keywords visit http://finance.yahoo.com 
* ----------------------------------------------------------------------------- 
*/ 

class yahoo_stocks { 
    /** 
     * Time difference Between Yahoo and your local time; 
     */ 
    var $time = "+6"; //ATTENTION: daylight saving isn't (yet) respected 
    var $refreshtime = "1"; //minimal 0,25 because yahoo updates their values approx every 15sec! 
    var $dbhost = "localhost"; 
    var $user = "root"; 
    var $passwd = ""; 
    var $db = "test"; 
    var $stocks_table = "stocks"; 

    /** 
     * how long should quote values be stored in mysql (0 = unlimited / otherwise time in days) 
     */ 
    var $keepfilesfor = 0; 

    /** 
     * yahoo_stocks :: get_stocks() 
     * :: ATTENTION - IF THE CACHE IS USED  - calling this 
     * :: function will need an open mySQL connection to be present! 
     * :: use my_connect() first 
     * 
     * @param  $stock Stock shortcut 
     * @param  $cache (y or n) 
     * @return array () 
     */ 
    function get_stocks($stock, $cache) 
    { 
        if ($cache == "y") { 
            if ($this->keepfilesfor != "0") { 
                $deletefrom = time() - $this->keepfilesfor * 24 * 3600; 
                $mystock = mysql_escape_string($stock); 
                $q = "DELETE FROM `$this->stocks_table` WHERE stock='$mystock' AND reallocaltime<'$deletefrom'"; 
                mysql_query($q); 
            } 
            $timeout = time()-60 * $this->refreshtime; 
            $mystock = mysql_escape_string($stock); 
            $q = "SELECT * FROM `$this->stocks_table` WHERE stock='$mystock' AND reallocaltime>'$timeout' "; 
            $q .= "ORDER BY `unixtime` DESC LIMIT 1"; 
            $d = mysql_query($q); 
            if (!mysql_num_rows($d)) { 
                $reallocaltime = time(); 
                $return = $this->generate_stock_array($stock); 
                /** 
                 * Check the mysql database to prevent double entries using the md5 hash 
                 */ 
                $qquery = "SELECT * FROM `$this->stocks_table` WHERE md5='${return['md5']}'"; 
                $qcheck = mysql_query($qquery); 
                if (mysql_num_rows($qcheck)) { 
                    $x = mysql_fetch_array($qcheck); 
                    return $x; 
                } else { 
                    $sql = "INSERT INTO `$this->stocks_table` (`stock` , `value` , `changepoints` , `open` , `intra_top` , `intra_down` , `date` , `time` , `unixtime` , `reallocaltime`, `md5` )"; 
                    $sql .= "VALUES('${return['stock']}','${return['value']}','${return['changepoints']}','${return['open']}','${return['intra_top']}','${return['intra_down']}',"; 
                    $sql .= "'${return['date']}','${return['time']}','${return['unixtime']}','$reallocaltime','${return['md5']}')"; 
                    mysql_query($sql); 
                    return $return; 
                } 
            } else { 
                $x = mysql_fetch_array($d); 
                return $x; 
            } 
        } else { 
            return $this->generate_stock_array($stock); 
        } 
    } 

    /** 
     * yahoo_stocks::generate_stock_array() 
     * 
     * :: please don't use this function - Use get_stocks() instead 
     * :: this function is for internal use in get_stocks() 
     * 
     * @param  $stock 
     * @return 
     */ 
    function generate_stock_array($stock) 
    { 
        $open = fopen("http://finance.yahoo.com/d/quotes.csv?s=$stock&f=sl1d1t1c1ohgv&e=.csv", "r"); 
        $read = str_replace("", "", trim(fread($open, 2000))); 

        $data = explode(",", $read); 
        fclose($open); 

        /** 
         * Converting yahoo's date to local date 
         */ 
        $strtotime_date = strtotime(str_replace('"', '', "$data[2] $data[3]")); 
        if (eregi("^-.*", $this->time)) { 
            $this->time = str_replace("-", "", $this->time); 
            $return['unixtime'] = $strtotime_date - $this->time * 3600; 
        } else { 
            $this->time = str_replace("+", "", $this->time); 
            $return['unixtime'] = $strtotime_date + $this->time * 3600; 
        } 
        $return['stock'] = $data[0]; 
        $return['value'] = $data[1]; 
        $return['date'] = date("j.n.Y", $return['unixtime']); 
        $return['time'] = date("G:i", $return['unixtime']); 
        $return['changepoints'] = $data[4]; 
        $return['open'] = $data[5]; 
        $return['intra_top'] = $data[6]; 
        $return['intra_down'] = $data[7]; 
        $return['md5'] = md5($read); 
        if ($return['value'] == "0.00" && $return['date'] == "1.1.1970") { 
            die("ERROR: yahoo.stocks.class.php - <b>$stock</b> is no valid stock"); 
        } 
        return $return; 
    } 

    /** 
     * yahoo_stocks :: get_stock_bundle() :: uses an array ($symbols) to gather several stock quotes at once 
     * 
     * @param  $symbols ; 
     * @return ;) 
     */ 

    function get_stock_bundle($syms) 
    { 
        foreach ($syms as $s) { 
            $bundle[$s] = $this->generate_stock_array($s); 
        } 

        return $bundle; 
    } 

    /** 
     * yahoo_stocks :: my_connect() :: Connect to the mySQL server 
     * 
     * @return mysql _connection 
     */ 
    function my_connect() 
    { 
        $this->conn = @mysql_connect($this->dbhost, $this->user, $this->passwd) or die("Can't connect to mySQLn"); 
        return mysql_select_db($this->db, $this->conn); 
    } 

    /** 
     * yahoo_stocks :: my_close() :: Disconnect from the mySQL server 
     * 
     * @return TRUE ;) 
     */ 
    function my_close() 
    { 
        return @mysql_close(); 
    } 
} 

$stocks = new yahoo_stocks(); 
$stocks->my_connect();//if you have no open mySQL connection (yet) 
$eurostoxx = $stocks->get_stocks("^STOXX50E", "y"); //Get data for Euro StoXX 50 and use cache (returns an array) 
$dowjones = $stocks->get_stocks("^DJI", "n");//Dow Jones and no cacheing 
echo var_dump($stocks->get_stocks("^DJI", "n"));//displays the kind of array this class returns 
$stocks->my_close(); 


?>
 
Zuletzt bearbeitet:
Zurück