Вот уже пару дней борюсь с этим ...
Сразу после подключения к БД -
$this->sqladdimport = $this->db->prepare('INSERT INTO `importqueue`
(`user_id`, `service_id`, `format`, `comment`, `data`, `status`)
VALUES (:user, :service, :format, ":commment", :file, :status)',
array(PDO::ATTR_EMULATE_PREPARES=>true));
Вызывается -
function addImportQueue($filename, $user, $format, $service_id, $comment, $status = IMPORT_NEW ){
$fh = fopen($filename, 'r');
if (!$fh) {
return false;
}
$params = array( ':user' => $user['user_id'],
':format' => $format,
':service' => $service_id,
':comment' => $comment,
':status' => $status) ;
$this->sqladdimport->bindParam(':file', $fh, PDO::PARAM_LOB);
foreach ($params as $key => &$val){
$this->sqladdimport->bindParam($key,$val);
}
$this->sqladdimport->execute();
$id = $this->db->lastInsertId();
return $id;
}
Но я просто получаю
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'
в строке выполнения.
В случае необходимости таблица определяется следующим образом:
CREATE TABLE `importqueue` (
`import_id` INT(11) NOT NULL AUTO_INCREMENT,
`service_id` INT(11) NOT NULL DEFAULT '0',
`format` INT(11) NULL DEFAULT '0',
`user_id` INT(11) NULL DEFAULT '0',
`comment` TEXT NULL,
`date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`data` MEDIUMBLOB NULL,
`status` INT(11) NULL DEFAULT NULL,
INDEX `Index 1` (`import_id`)
)
COMMENT='Import queue/archive'
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Я новичок в PDO, и особенно в BLOB, поэтому я, вероятно, делаю что-то действительно явно глупое, но в настоящее время это ускользает от меня!
Спасибо!
Редактировать: Я отмечаю ссылки на кавычки вокруг: comment в файле prepare - это артефакт моей отладки, и я удалил их снова без изменений.
Также упростили функцию до
$fh = fopen($filename, 'r');
$this->sqladdimport->bindValue(':file', $fh, PDO::PARAM_LOB);
$this->sqladdimport->bindValue(':user', $user['user_id']);
$this->sqladdimport->bindValue(':format', $format);
$this->sqladdimport->bindValue(':service', $service_id);
$this->sqladdimport->bindValue(':comment', $comment);
$this->sqladdimport->bindValue(':status', $status);
$this->sqladdimport->execute();
и я все еще получаю ту же ошибку (используя либо bindParam, либо bindValue)
Не заключайте заполнители в кавычки, PDO / mysqli будет думать, что это просто строки, а не заполнители.
айнбер ах да, это была всего лишь одна из моих попыток отладки .. без кавычек тоже не работает.
Почему вы определяете массив параметров связывания и после этого объединяете их в цикл? Почему вы не связываете их напрямую?
Просто интересно, почему у вас ": comment" только в двойных кавычках. Я считаю это виновником
Йенс - Следствие копирования других примеров. Изначально у меня было все как array () внутри выполнения, но были те же ошибки. прочитал, что мне нужен PDO :: PARAM_LOB в параметре файла, поэтому разделите его.






см. Ключевые слова и зарезервированные слова ...
вы можете захотеть переименовать столбцы comment, date, format и status.
Invalid parameter number исходит из ":comment", который не заменяется, поэтому количество столбцов не соответствует количеству параметров, за вычетом одного. чтобы подготовленный оператор содержал правильное количество параметров, он должен быть :comment.
Это ключевые слова, но они не зарезервированы. OP имеет их в обратных кавычках, поэтому использование в порядке.
это все еще плохая практика, потому что их нужно заключать в обратные кавычки - и это может вызвать путаницу только тогда, когда нужно различать имя столбца и ключевое слово.
Спасибо, я могу настроить имена полей в продакшене (еще не поздно сделать это), но сначала пытаюсь наладить функциональность ..
У вас есть только заполнитель «: комментарий» в двойных кавычках. Следовательно, он будет рассматриваться как строка
Также, если вы пытаетесь сохранить двоичный файл, используйте
$fh = fopen($filename, 'rb');
вместо того
$fh = fopen($filename, 'r');
Кроме того, попробуйте определить тип данных для всех столбцов, потому что метод bindValue имеет третий столбец, который по умолчанию равен PDO :: PARAM_STR. Но у вас тоже есть числовые столбцы
$fh = fopen($filename, 'rb');
$this->sqladdimport->bindValue(':file', $fh, PDO::PARAM_LOB);
$this->sqladdimport->bindValue(':user', $user['user_id'],PDO::PARAM_INT);
$this->sqladdimport->bindValue(':format', $format,PDO::PARAM_INT);
$this->sqladdimport->bindValue(':service', $service_id,PDO::PARAM_INT);
$this->sqladdimport->bindValue(':comment', $comment,PDO::PARAM_STR);
$this->sqladdimport->bindValue(':status', $status,PDO::PARAM_INT);
$this->sqladdimport->execute();
Я изменил это, и моя проблема не решена :(
@ user2158583 ваш файл - двоичный файл или текстовый файл?
Ах. Это текст, но с различными непечатаемыми символами. Я должен относиться к нему как к двоичному, так как я не хочу ничего менять. Изменен на 'rb', но ошибка все равно появляется.
Вы тоже исправили заполнитель ": comment"?
Я сделал. $this->sqladdimport = $this->db->prepare('INSERT INTO importqueue` (user_id, service_id, format, comment, data, status) VALUES (: user,: service,: format,: commment,: file,: status) ', array (PDO :: ATTR_EMULATE_PREPARES => true)); `
Нашел ....
Я скопировал код в тестовый сценарий, который мне было легче изменить. Начал с одного поля (которое работало) и постепенно добавлял остальные одно за другим.
Проблема оказалась в простой опечатке в команде подготовки ... Это относится к: комментарий. Привязка имела в виду: комментарий. Я никогда не замечал лишнего "м" ..
Спасибо всем за все предложения. Это был познавательный опыт!
Возможный дубликат SQLSTATE [HY093]: недопустимый номер параметра: параметр не определен