PHP CSV解析问题逃避MySQL的字符串

时间:2013-11-03 18:31:51

标签: php mysql csv addslashes

我正在尝试从产品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.);
    }
}

1 个答案:

答案 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);

现在您不必担心转义语句,但您仍然需要清理条目以防止跨站点脚本和其他安全风险。