У меня есть следующая модель базы данных:
Эта база данных заполняется путем загрузки в файл CSV. Допустим, это файл CSV:
Вот как CSV загружается в базу данных: сначала я беру все значения foo_name
и вставляю их в таблицу Foo
. Я только заполняю имя. ID - автоинкремент. То же самое и с bar_name
. Обратите внимание, что все names
могут существовать в таблице только один раз. Таким образом, даже когда Jefferson
появляется дважды в CSV, он существует только один раз в реальной таблице базы данных. То же самое для Foo
. сильный текст
Это отлично работает. Столы заполняются. Но, как видите, таблица Foo
содержит внешний ключ к Bar
.
Я хочу поместить Bar(ID)
в Foo(bar_id)
, где Foo(name)
и Bar(name)
находятся в одной строке в CSV-файле.
Я пытался сделать это, перебирая CSV-файл снова. Для каждого Foo(name)
я получаю Foo(ID)
. Я также получаю Bar(ID)
. Затем я обновляю Foo(bar_id)
с помощью ID
в Bar
, который соответствует Bar(name)
.
Это код в моем while-l oop для чтения csv:
$foo = $column[0];
$bar = $column[1];
$foo_id = 0;
$stmt = $conn->prepare("SELECT ID from Foo WHERE name=?");
$stmt->bind_param("s", $name_);
$name_ = $foo;
$stmt->execute();
$stmt->bind_result($id);
$stmt->fetch();
$foo_id = $id;
$stmt->close();
$bar_id = 0;
$stmt = $conn->prepare("SELECT ID from bars WHERE name=?");
$stmt->bind_param("s", $name_);
$name_ = $bar;
$stmt->execute();
$stmt->bind_result($id);
$stmt->fetch();
$bar_id = $id;
$stmt->close();
//echo $foo_id . " - " . $bar_id . "<br>";
$stmt = $conn->prepare("UPDATE foo SET bar_id=? WHERE ID=?");
if (!$stmt) {
die("Statement failed (" . $stmt->errno . "): " . $conn->error);
}
$stmt->bind_param("ii", $bar_, $id_);
$bar_ = $bar_id;
$id_ = $foo_id;
if(!$stmt->execute()) {
echo $stmt->error;
}
echo $stmt->affected_rows . "<br>";
$stmt->close();
Эта строка echo $foo_id . " - " . $bar_id . "<br>";
красиво выводит foo_id
и bar_id
, как и должно быть. $stmt->affected_rows
возвращает 1
почти каждый раз. Так что что-то надо обновить. У меня вообще нет ошибок. И выполнение UPDATE foo SET bar_id=? WHERE ID=?
вручную в базе работает.
Несмотря на все это, столбец bar_id
не обновляется / не сохраняется.