0

我正在尝试从产品提要中解析一些 CSV 文件。我正在使用下面的代码从 CSV 中获取数据,并逐行处理以插入 MySQL 数据库。出于某种原因,addlashes 函数似乎每隔一段时间就会跳过转义序列。我在这里做错了什么?

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.);
    }
}
4

1 回答 1

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

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

于 2013-11-03T19:15:21.000 回答