簡體   English   中英

使用PHP將數據插入SQLite3數據庫時出錯

[英]Error in inserting data to a SQLite3 database using PHP

我將從不同表收集的數據插入到SQLite3數據庫中。 但是問題是無論做什么我都會在數據庫中多獲得1行。 PHP代碼是:

<?php

include_once '../app/config.php';

$db = new MyDB();
if (!$db) {
    echo $db->lastErrorMsg();
}

function masterLoop($db)
{
    $mainTickerFile = fopen("../tickerMaster.txt", "r");
    while (!feof($mainTickerFile)) {
        $companyTicker = fgets($mainTickerFile);
        $companyTicker = trim($companyTicker);

        if ($companyTicker) {
            $nextDayIncrease = 0;
            $nextDayDecrease = 0;
            $nextDayNoChange = 0;
            $total = 0;

            $sumOfIncreases = 0;
            $sumOfDecreases = 0;

            $sql = "SELECT date, amount_change, percent_change FROM " . $companyTicker . " WHERE percent_change > 0 ORDER BY date ASC";
            $ret = $db->query($sql);
            $multiArray = array();
            $count = 0;
            while ($row = $ret->fetchArray(SQLITE3_ASSOC)) {
                foreach ($row as $i=>$value) {
                    $multiArray[$count][$i] = $value;
                }
                $count++;
            }
            foreach ($multiArray as $data) {
                $date = $data['date'];
                $amount_change = $data['amount_change'];
                $percent_change = $data['percent_change'];
                $sql2 = "SELECT date, amount_change, percent_change FROM " . $companyTicker . " WHERE date > '" . $date . "' ORDER BY date ASC LIMIT 1";
                $ret2 = $db->query($sql2);
                $row2 = $ret2->fetchArray(SQLITE3_ASSOC);
                $tom_date = $row2['date'];
                $tom_amount_change = $row2['amount_change'];
                $tom_percent_change = $row2['percent_change'];
                if ($tom_percent_change > 0) {
                    $nextDayIncrease++;
                    $sumOfIncreases += $amount_change;
                } elseif ($tom_percent_change < 0) {
                    $nextDayDecrease++;
                    $sumOfDecreases += $amount_change;
                } else {
                    $nextDayNoChange++;
                }
                $total++;
            }
        }

        $nextDayIncreasePercent = ($nextDayIncrease/$total)*100;
        $nextDayDecreasePercent = ($nextDayDecrease/$total)*100;
        $averageIncrease = $sumOfIncreases/$nextDayIncrease;
        $averageDecrease = $sumOfDecreases/$nextDayDecrease;

        insertIntoResultTable($db, $companyTicker, $nextDayIncrease, $nextDayIncreasePercent, $averageIncrease, $nextDayDecrease, $nextDayDecreasePercent, $averageDecrease);
    }
}

function insertIntoResultTable($db, $companyTicker, $nextDayIncrease, $nextDayIncreasePercent, $averageIncrease, $nextDayDecrease, $nextDayDecreasePercent, $averageDecrease)
{
    $buyValue = $nextDayIncreasePercent * $averageIncrease;
    $sellValue = $nextDayDecreasePercent * $averageDecrease;
    $createTableQuery = "CREATE TABLE IF NOT EXISTS analysisA (
        companyTicker TEXT PRIMARY KEY NOT NULL,
        nextDayIncrease INT,
        nextDayIncreasePercent FLOAT,
        averageIncrease FLOAT,
        nextDayDecrease INT,
        nextDayDecreasePercent FLOAT,
        averageDecrease FLOAT,
        buyValue FLOAT,
        sellValue FLOAT
    )";
    $db->query($createTableQuery);
    $insertQuery = $db->prepare("INSERT OR REPLACE INTO analysisA (companyTicker, nextDayIncrease, nextDayIncreasePercent, averageIncrease, nextDayDecrease, nextDayDecreasePercent, averageDecrease, buyValue, sellValue) VALUES (
        :companyTicker, :nextDayIncrease, :nextDayIncreasePercent, :averageIncrease, :nextDayDecrease, :nextDayDecreasePercent, :averageDecrease, :buyValue, :sellValue
    )");
    $insertQuery->bindValue(':companyTicker', $companyTicker, SQLITE3_TEXT);
    $insertQuery->bindValue(':nextDayIncrease', $nextDayIncrease, SQLITE3_INTEGER);
    $insertQuery->bindValue(':nextDayIncreasePercent', $nextDayIncreasePercent, SQLITE3_FLOAT);
    $insertQuery->bindValue(':averageIncrease', $averageIncrease, SQLITE3_FLOAT);
    $insertQuery->bindValue(':nextDayDecrease', $nextDayDecrease, SQLITE3_INTEGER);
    $insertQuery->bindValue(':nextDayDecreasePercent', $nextDayDecreasePercent, SQLITE3_FLOAT);
    $insertQuery->bindValue(':averageDecrease', $averageDecrease, SQLITE3_FLOAT);
    $insertQuery->bindValue(':buyValue', $buyValue, SQLITE3_FLOAT);
    $insertQuery->bindValue(':sellValue', $sellValue, SQLITE3_FLOAT);
    $insertQuery->execute();
}

masterLoop($db);
?>

<?php include_once APP_ROOT . '/templates/header.php'; ?>
        <link rel="shortcut icon" href="../app/images/favicon.ico" type="image/x-icon">
        <title>Analysis A</title>
    </head>
    <body>
        <div>
            <h4>Analysis A has been performed on the available stocks!</h4>
        </div>
<?php include_once APP_ROOT . '/templates/footer.php'; ?>

我想要的是5行,每行都有公司代碼(存儲在tickerMaster.txt )作為主鍵。 但我得到6行。 第六行與第五行相同,不同之處在於companyTicker列中不包含任何內容。 我不需要第六行,因為它與第五行相同。 tickerMaster.txt包含以下項目(最后還有一個新行):

AAPL
TSLA
NFLX
MSFT
ADBE

我該如何解決這個問題?

您應該在if ($companyTicker) {段內移動插入(和相關的計算),這樣將停止插入任何空格的行。

    if ($companyTicker) {
        $nextDayIncrease = 0;
        $nextDayDecrease = 0;
        $nextDayNoChange = 0;
        $total = 0;

        //  ...

        $nextDayIncreasePercent = ($nextDayIncrease/$total)*100;
        $nextDayDecreasePercent = ($nextDayDecrease/$total)*100;
        $averageIncrease = $sumOfIncreases/$nextDayIncrease;
        $averageDecrease = $sumOfDecreases/$nextDayDecrease;

        insertIntoResultTable($db, $companyTicker, $nextDayIncrease, $nextDayIncreasePercent, $averageIncrease, $nextDayDecrease, $nextDayDecreasePercent, $averageDecrease);
    }

目前,它不執行任何主要處理,但仍在處理包括插入在內的最后5行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM