PHP синтаксический анализ CSV проблема с выходом строк для MySQL

Я пытаюсь проанализировать несколько файлов CSV из ленты продуктов. Я использую код ниже, чтобы получить данные из CSV и обрабатывать строку за строкой для вставки в базу данных MySQL. Почему-то время от времени функция addlashes, похоже, пропускает escape-последовательность. Что я здесь не так делаю?

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 ответ

Решение

Для параметризованного запроса ( 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);

Теперь вам не нужно беспокоиться о том, чтобы избежать выписки, но вам все равно нужно санировать свои записи, чтобы предотвратить межсайтовый скриптинг и другие угрозы безопасности.

Другие вопросы по тегам