我正在尝试从产品Feed中解析许多CSV文件。我正在使用下面的代码从CSV中获取数据,并逐行处理以插入到MySQL数据库中。由于某种原因,每隔一段时间,addslashes函数似乎跳过了转义序列。我在这里做错了什么?
while (($data = fgetcsv($fh, 2000, ",")) !== FALSE)
{
$num = count($data);
$nl = 0;
for ($c=0; $c < $num; $c++)
{
$nl++;
if ($c >= 0)
{
if ($nl == 1)
{
$Name = addslashes($data[$c]);
}
if ($nl == 2)
{
$URL = $data[$c];
}
if ($nl == 3)
{
$CatalogName = addslashes($data[$c]);
}
if ($nl == 4)
{
$LastUpdated = $data[$c];
}
}
}
if ($headerRow > 40)
{
$sql = "INSERT INTO table (name,url,catname,updated) VALUES ('$Name','$URL','$CatalogName','$LastUpdated')";
mysqli_query($connection3,$sql) or die("Can't execute query I001.);
}
}
答案 0 :(得分:1)
用于参数化查询(http://php.net/manual/en/mysqli.prepare.php):
$sql=$connection3->prepare("INSERT INTO table (name,url,catname,updated) VALUES (?,?,?,?)");
$sql->bind_param('ssss',$Name,$URL,$CatalogName,$LastUpdated);
$results=$sql->execute(); //results contains whether or not the execute was successful.
虽然这是“面向对象的风格”,但无论你喜欢“对象”还是“程序风格”,这个语句的实际功能都会起作用,这一切都在风格中。在任何情况下,它都会起作用,文档中也有程序示例。
事实上,这是你如何按程序进行的:
$stmt=mysqli_prepare($connection3, "INSERT INTO table (name,url,catname,updated) VALUES (?,?,?,?)");
mysqli_stmt_bind_param($stmt, "ssss", $Name,$URL,$CatalogName,$LastUpdated);
mysqli_stmt_execute($stmt);
现在您不必担心转义语句,但您仍然需要清理条目以防止跨站点脚本和其他安全风险。