Обновление MySQL значение не сохраняется PHP - PullRequest
0 голосов
/ 05 мая 2020

У меня есть следующая модель базы данных: enter image description here

Эта база данных заполняется путем загрузки в файл CSV. Допустим, это файл CSV: enter image description here

Вот как 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 не обновляется / не сохраняется.

1 Ответ

0 голосов
/ 05 мая 2020

Код выше работает. Я совершил еще одну глупую ошибку. При первом чтении CSV-файла для заполнения таблиц значения сначала записываются в массив.

Затем я читаю его в другой раз, чтобы установить отношения.

Проблема в том, что что я записал из памяти в базу данных в самом конце моего кода. В результате перезаписываются значения столбца, содержащие отношение. Решено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...