PHP-скрипт — из CSV в базу данных MySQLPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP-скрипт — из CSV в базу данных MySQL

Сообщение Anonymous »

Я сталкиваюсь с проблемой загрузки данных в базу данных уже несколько дней.
Я регулярно загружаю исходный файл CSV с кодировкой cp1250, поэтому меняю кодировку на utf8mb4 с помощью PHP-скрипта ниже, потому что я в MySQL (InnoDB) установлено utf8mb4_unicode_ci.
Файл CSV содержит специальные символы в двух именах столбцов. В частности, «вариант:Детская Великость» и «вариант:Множстви», и я считаю, что проблема в этом.
Значения не совпадают. вставляются в эти два столбца. Любые другие столбцы подходят.
Я не могу повлиять на такое наименование столбцов, поскольку файл CSV обновляется автоматически.
Может ли кто-нибудь посоветовать мне, как обеспечить эти данные также вставляются в эти «специальные» столбцы? Столбцы должны содержать цифры.
УСТАНОВИТЬ КОДИРОВАНИЕ

Код: Выделить всё

// Set the character encoding to utf8mb4
if (!$mysqli->set_charset('utf8mb4')) {
die("Error setting character encoding: " . $mysqli->error);
}

// Load CSV
$data = [];
while (($row = fgetcsv($handle, 1000, ";")) !== false) {
$record = [];
foreach ($columns as $index => $column) {
// Windows-1250 -> UTF-8
$cellValue = isset($row[$index]) ? trim(iconv("Windows-1250", "UTF-8//IGNORE", $row[$index])) : null;
$record[$column] = $cellValue;
}
$record["importID"] = $importID;
$data[] = $record;
}
Здесь я готовлю запрос INSERT:

Код: Выделить всё

// SQL query to insert data into table 'products'
$stmt = $mysqli->prepare("
INSERT INTO products (
code,
pairCode,
.......
`variant:Dětská Velikost`,
`variant:Množství`
)
VALUES ...
");

Код: Выделить всё

foreach ($data as $record) {
// Empty cells = NULL
foreach ($record as $key => $value) {
$record[$key] = $value === "" ? NULL : $value;
}

$stmt->bind_param(
"sisssssssssssssssssssssssssii",
$record["code"],
$record["pairCode"],
.....
$record["variant:Dětská velikost"],
$record["variant:Množství"]
);

if (!$stmt->execute()) {
echo "Error: " . $stmt->error . "
";
}
}

Я пробовал сопоставлять столбцы и переименовывать столбцы в базе данных, но это не сработало, поэтому я изменил их обратно:

Код: Выделить всё

// Rename columns
$columnMap = [
"variant:Dětská velikost" => "DetskaVelikost",
"variant:Množství" => "Mnozstvi",
];

$columns = array_map(function($column) use ($columnMap) {
return isset($columnMap[$column]) ? $columnMap[$column] : $column;
}, $columns);

Вот структура базы данных. Для каждого поля установлено значение NULL в значении YES.
Значения в столбцах code, pairCode и т. д. подходят, но variant:Dětská velikost и variant:Množství имеют значения NULL.



Поле
Тип




код
varchar(100)


pairCode
int(11)


...
. ..


вариант: Детская великая
int(11)


вариант:Множество
int(11)



**Я пробовал**
  • сменить кодировку базы данных на cp1250
  • сопоставление столбцов
  • ChatGPT


Подробнее здесь: https://stackoverflow.com/questions/792 ... l-database
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»