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);
Теперь вам не нужно беспокоиться о том, чтобы избежать выписки, но вам все равно нужно санировать свои записи, чтобы предотвратить межсайтовый скриптинг и другие угрозы безопасности.