我已经和这个人打了几天了......
刚连接到db之后 -
$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致命错误:未捕获异常'PDOException',消息'SQLSTATE [HY093]:参数号无效:参数未定义'
在执行行上。
如果它是相关的,那么表定义如下:
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,所以我可能做的事情显然很愚蠢,但它现在正在逃避我!
谢谢!
编辑:我注意到引号周围的引用:准备中的注释 - 这是我的调试的一个人工制品,我已经删除了那些没有任何变化。
还简化了功能
$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)
看看Keywords and Reserved Words ......
你可能想重命名列comment
,date
,format
和status
。
Invalid parameter number
来自":comment"
未被替换,因此列数与参数数量不匹配,少于一个。为了给准备好的语句提供正确数量的参数,它应该是:comment
。
您只有双引号中的“:commment”占位符。因此它将被视为一个字符串
此外,如果您尝试存储二进制文件使用
$fh = fopen($filename, 'rb');
代替
$fh = fopen($filename, 'r');
此外,尝试为所有列定义数据类型,因为bindValue方法具有默认为PDO :: PARAM_STR的第3列。但是你也有数字列
$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();
找到了 ....
我将代码复制到一个我可以更容易修改的测试脚本中。从一个字段(有效)开始,逐渐添加其余字段。
这个问题在prepare命令中被证明是一个简单的错字......那就是:commment。绑定是指:评论。我从来没有注意到额外的'm'..
感谢大家提出的所有建议。这是一次学习经历!