PHP股票市场分析器应用程序只会将历史数据的第一行插入数据库


PHP stock market analyser app will only insert first line of historic data into database

以下是基本连接:

<?php
$connect = mysql_connect('localhost', 'root', '');
if (!$connect) {
    die('Could not connect to database!');
}
mysql_select_db('stockmarket', $connect);
?>

主代码读取tickerMaster.php中的每只股票,即:

YHOO(YAHOO(
F(福特(
NFLX(NETFLIX(
ADBE(ADOBE(
GE(GE(

然后,每只股票都会被读取,并在应用程序的主代码中从雅虎金融下载每只股票的历史记录这是Netflix(NFLX(文件,例如在主代码运行时创建。其他4只股票都是一样的,但数字明显不同。这是日期,开盘,高,低,收盘,成交量,调整收盘:

2015-08-14124.959999125.00123.00123.389998631900123.389999
2015-08-13120.989998125.73003119.39996123.73000315221000123.730003
2015-08-12121.470001122449997118.660004120.51000213822500120.510002
2015-08-11120.010002123.760002120.00122.799811047600122.739998
2015-08-10126.08996126.50121.510002123.02999913370600123.029999

下面的主代码将正确地为每种股票创建一个表。但是只将从上到下的第一行插入表中,而不循环通过和插入每种股票的所有行。

主代码:

<?php
    include('includes/connect.php');
    function createURL($ticker) {
        $currentMonth  = date("n");
        $currentMonth  = $currentMonth - 1;
        $currentDay    = date("j");
        $currentYear   = date("Y");
        return "http://real-chart.finance.yahoo.com/
        table.csv?s=$ticker&d=$currentMonth&e=$currentDay&f=$currentYear
        &g=d&a=7&b=10&c=2015&ignore=.csv";
           //Aug.  10   2015
    function getCVSFile($url, $outputFile) {
        $content = file_get_contents($url);       
        $content = str_replace(
             "Date, Open, High, Low, Close, Volume, Adj Close", 
             "", 
             $content
        ); //above string comes with stock data
        //downloaded from yahoo. I don't want
        $content = trim($content);               
        file_put_contents($outputFile, $content);
    }   
    function fileToDatabase($txtFile, $tableName) {
        $file = fopen($txtFile, "r");
        while (!feof($file)) {
            $line    = fgets($file);
            $pieces  = explode(",", $line);
            $date    = $pieces[0];
            $open    = $pieces[1];
            $high    = $pieces[2];
            $low     = $pieces[3];
            $close   = $pieces[4];
            $volume  = $pieces[5];
            $adj_clo = $pieces[6]; 
            $amount_change  = $close - $open;
            $percent_change = ($amount_change/$open) * 100;
            $sql     = "SELECT * FROM $tableName";
            $result  = mysql_query($sql);
            if (!$result) {
                $sql_2 = "CREATE TABLE $tableName (date DATE, PRIMARY KEY(date),    open FLOAT, high FLOAT, low FLOAT, close FLOAT, volume INT, amount_change FLOAT, percent_change FLOAT, adj_clo FLOAT)";
                mysql_query($sql_2);
            }
            $sql_3 = "INSERT INTO $tableName (date, open, high, low, close, volume, amount_change, percent_change, adj_clo) 
                          VALUES ({$date}, {$open}, {$high}, {$low}, {$close}, {$volume}, {$amount_change}, {$percent_change}, {$adj_clo} )";
            mysql_query($sql_3);
        } 
        fclose($file);
    }
function main() {
    $mainTickerFile = fopen("tickerMaster.txt", "r");
    while(!feof($mainTickerFile)) {
        $companyTicker = fgets($mainTickerFile);
        $companyTicker = trim($companyTicker);
        $fileURL = createURL($companyTicker);
        $companyTxtFile = "txtFiles/".$companyTicker."txt";
        getCVSFile($fileURL, $companyTxtFile);
        fileToDatabase($companyTxtFile, $companyTicker);
    }                                  
}
main();
?>

任何关于为什么只将第一行插入数据库的帮助都将不胜感激。

这是基于以上评论的总结答案:

1( 您必须检查while loops是否在所有行上迭代。

2( 检查SQL查询中是否存在任何问题。(如果mysql_query(...)返回false. ,则检查mysql_query调用的返回值,并检查mysql_error函数的返回值

3( 检查关键字date是否可以用作mysql表中的字段名。

4( 最后,mysql_error告诉我们,不能插入新的数据集,因为存在具有date列(表的主键(重复值的行。如果date的值有效,您可以检查date为什么是0000-00-00,或者定义另一个主键。