所以我正在php中开发一个web应用程序,它获取一个.csv文件并对其进行解析。然后它将其提交到mysql数据库。我成功地检索了数据,并且能够输入我正在检索的所有数值。我遇到的一个问题是在sql数据库中插入日期。
我没有收到我知道的错误,日期值只有0000-00-00。当我运行脚本时,我通过将php中的数据回显到屏幕来进行错误检查。它的回声很好,格式为yyyy-mm-dd。下面是php代码,如果你想让它进行测试运行,它会运行得很好,不幸的是,如果你的系统上没有wamp/lamp/等效程序,我没有公共服务器可以让你测试它。
我是不是错过了一些简单的东西?为什么这个日期不能正确插入?是不是格式不对?它看起来是正确的格式,但谁知道呢?
<?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);
?>
您必须记住引用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
值,并且最好使用准备好的语句。
如前所述,您需要对字符串进行引号引用。我不推荐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将非常愉快地处理它。所以你可以这样引用所有的东西。
你可以做更多的事情来净化输入并防止攻击,但这不仅仅是回答问题。