PHP PDO'SQLSTATE [HY093]:参数号无效:未定义参数

问题描述 投票:1回答:3

我已经和这个人打了几天了......

刚连接到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)

php pdo
3个回答
0
投票

看看Keywords and Reserved Words ......

你可能想重命名列commentdateformatstatus

Invalid parameter number来自":comment"未被替换,因此列数与参数数量不匹配,少于一个。为了给准备好的语句提供正确数量的参数,它应该是:comment


0
投票

您只有双引号中的“: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();

0
投票

找到了 ....

我将代码复制到一个我可以更容易修改的测试脚本中。从一个字段(有效)开始,逐渐添加其余字段。

这个问题在prepare命令中被证明是一个简单的错字......那就是:commment。绑定是指:评论。我从来没有注意到额外的'm'..

感谢大家提出的所有建议。这是一次学习经历!

© www.soinside.com 2019 - 2024. All rights reserved.