Как правильно использовать метод вставки запроса Yii2? - PullRequest
0 голосов
/ 24 января 2020

Я пытался использовать объект QueryBuilder для генерации правильно экранированного оператора INSERT. Имя таблицы базы данных генерируется с использованием имени загруженного файла, и будет несколько таблиц, поэтому использование модели здесь на самом деле не вариант.

Код, который я пытался использовать, был следующим:

                        $params = [
                            "index" => $row["A"],
                            "description" => $row["B"],
                        ];
                        $conn->createCommand(
                            $qb->insert($tableName, [
                                "Index" => ":index",
                                "Description" => ":description",
                            ], $params),
                            $params
                        )->execute();

Сообщение об ошибке SQL, которое я получил, состояло в том, что число параметров не соответствует количеству токенов.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Это просто так:

$conn->createCommand()->insert($tableName, [
    "Index" => $row["A"],
    "Description" => $row["B"],
])->execute();

yii \ db \ Command :: insert () выполняет экранирование за вас. Например:

$a = "a'b\"";
echo \Yii::$app->db->createCommand()->insert('t', ['a' => $a])->getRawSql() . "\n";

возвращает

INSERT INTO `t` (`a`) VALUES ('a\'b\"')
0 голосов
/ 24 января 2020

Моя основная проблема заключалась в том, что в документации неправильно объясняется, какой должна быть переменная $params. Я обнаружил, что это должен быть пустой, но инициализированный массив, поэтому в основном $params = [];.

Кроме того, поскольку функция использует $params в качестве ссылки, они уже обрабатываются объектом QueryBuilder и Мне не нужно экранировать мои значения два раза.

Последний код, который сработал, был таким:

                        $params = [];
                        $conn->createCommand(
                            $qb->insert($tableName, [
                                "Index" => $row["A"],
                                "Description" => $row["B"],
                            ], $params),
                            $params
                        )->execute();

Надеюсь, это когда-нибудь кому-нибудь поможет.

...