-1

所以我正在用 php 开发一个 Web 应用程序,它抓取一个 .csv 文件并对其进行解析。然后将其提交到 mysql 数据库。我成功地检索了数据,并且能够输入我正在检索的所有数值。我遇到的一个问题是将日期插入 sql 数据库。

我没有收到我知道的错误,日期值只是 0000-00-00。当我运行脚本时,我通过将 php 中的数据回显到屏幕来进行错误检查。它回声很好,格式为 yyyy-mm-dd。如果您想对其进行测试运行,下面是可以正常运行的 php 代码,不幸的是,如果您的系统上没有运行 wamp/lamp/equivalent,我没有公共服务器可以让您对其进行测试。

我错过了一些简单的东西吗?为什么这个日期不能正确插入?是不是格式不对?它看起来是正确的格式,但谁知道呢?

<?php

    //Connect to Database
    $con=mysqli_connect("localhost","root","","stockmarket");
    // Check connection
    if (mysqli_connect_errno($con))
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }


    // Setup URL to download csv file
    $requestUrl = "http://ichart.yahoo.com/table.csv?s=GOOG";


    // Pull data (download CSV as file)
    $CSV = file_get_contents($requestUrl);
    // Split results, trim way the extra line break at the end
    $quotes = explode("\n",trim($CSV));

    //Explore array with .csv contents
    foreach($quotes as $quoteraw) {
    $quoteraw = str_replace(", I", " I", $quoteraw);
    $quote = explode(",", $quoteraw);
    echo $quote[0];//error check, should print dates in correct format      

        //Insert contents into database 
    mysqli_query($con,"INSERT INTO nasdaq (Symbol,Date,Open,High,Low,Close,Volume,Adjusted Close) VALUES ('goog',$quote[0],$quote[1],$quote[2],$quote[3],$quote[4],$quote[5],$quote[6])");
    }

    mysqli_close($con);
?>
4

2 回答 2

2

您必须记住引用进入 MySQL 查询的值。

INSERT INTO nasdaq (Symbol,Date,Open,High,Low,Close,Volume,Adjusted Close) 
VALUES ('goog','".$quote[0]."','".$quote[1]."','".$quote[2]."'"); -- and so on

您的查询给您一个 SQL 错误。您必须始终检查 mysql_query 的结果以查看它是否正确。正如其他人所指出的,您应该采取进一步的措施来确保您避开各个$quote值,并最好使用准备好的语句。

于 2013-07-08T00:18:40.307 回答
1

如前所述,您需要引用您的字符串。我不推荐使用 Apartridge 的方法,因为如果您的任何字符串包含引号字符,它将失败。它还使您面临 SQL 注入攻击。

例如:运行此查询将失败:

<?php
$name = "O'Brien";
$query = "INSERT INTO table (LastName) VALUES ('$name')";
[...]
?>

为了帮助我,我使用 MySQLi 自己的转义函数,使用一个简单的函数在一步中转义和引用每个变量:

<?php

function sq($mysql_obj, $value) {
    // this function quotes $value to make it safe in an SQL statement
    return "'" . $mysql_obj->real_escape_string($value) . "'";
}

$mi = new mysqli("hostname", "username", "password", "database");
$name = "O'Brien";
$query = "INSERT INTO table (LastName) VALUES (".sq($mi,$name).")";
[...]
?>

请注意,您也可以引用数字数据,MySQL 会很高兴地处理它。因此,您不妨以这种方式引用所有内容。

您可以做更多的事情来清理输入并防止攻击,但这不仅仅是回答问题。

于 2013-07-08T03:18:56.253 回答