seregali
@seregali

Проблемы с PDO. Invalid parameter number. Влияет ли количество полей?

Нужно было сохранить информацию из файла в базу.

Столкнулся с такой проблемой:
Invalid parameter number: number of bound variables does not match number of tokens

Вроде все понятно, нужно чтобы количество полей совпадало. Но есть один момент.
Таблица в базе состоит из 12 полей.

При попытке их сохранить показывает ошибку.

Делаю туже работу с 11ю полями ошибки нет. И это для меня загадка.

Вот мой код. Есть идеи?

Так я сохраняю объект в базе
$part = new part();
$part->title = addslashes($data[2]);
$part->dzch = strval($data[1]);
$part->categoryId = $lastId;
$part->detailNumber1 = "";
$part->detailNumber2 = "";
$part->applicability = "";
$part->engineComponents = "";
$part->kp = "";
$part->enginePower = "";
$part->tnvd = "";
$part->сltch = "";
$part->save();


Функция save()
function save()
    {
        $App = App::get();
        $class = get_class($this);
        $classVars = get_class_vars($class);

        if (!empty($this->id)) {
            $query = "
			UPDATE
				`" . $class . "`
			SET ";
            foreach ($classVars as $name => $value) {
                $query .= "`" . $name . "` = :$name,";
            }

            $query[strlen($query) - 1] = ' ';

            $query .= "
			WHERE
				`id` = :id";

            $App->db->query($query, (array)$this);

        } else {
            $this->id = guid();

            $query = "
			INSERT INTO
				`" . $class . "` ( ";

            foreach ($classVars as $name => $value) {
                $query .= " `" . $name . "` ,";
            }

            $query[strlen($query) - 1] = ' ';

            $query .= ")
			VALUES ( ";

            foreach ($classVars as $name => $value) {
                $query .= " :$name ,";
            }

            $query[strlen($query) - 1] = ' ';

            $query .= " ) ";

            $App->db->query($query, (array)$this);
        }

        $App->setObjectToCache($this);
        return $this->id;
    }


Функция query()
function query($query, $data = null, &$intoObject = null)
    {
        try {
            $sth = $this->pdo->prepare($query);
            if ($intoObject)
                $sth->setFetchMode(PDO::FETCH_INTO, $intoObject);

            if ($data)
                foreach ($data as $dataKey => $dataField) {
                    if (is_array($dataField))
                        unset($data[$dataKey]);
                }

            $sth->execute($data);
            return $sth;
        } catch (PDOException $e) {
            n($e);
            return null;
        }
    }

функция n() выводит ответ.

Достаточно долго я пользуюсь такой системой. Не было проблем.
  • Вопрос задан
  • 248 просмотров
Решения вопроса 1
seregali
@seregali Автор вопроса
Вместе bindValue я отправляю $data.

$sth->execute($data);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lubezniy
А где вообще в функции query биндятся значения? Не вижу ни bindValue, ничего. А сообщение говорит о том, что количество таких значений не равно количеству таковых в тексте запроса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 00:45
1000 руб./за проект
02 мая 2024, в 23:56
2000 руб./за проект