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

Gri*_*iff 29 php mysql pdo

// BUILD VALUES
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
    $values[] = '(?)';
}
// INSERT INTO DATABASE
$q = $this -> dbc -> prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash");
$q -> execute($matches);
Run Code Online (Sandbox Code Playgroud)

上面的代码失败,出现以下错误

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

虽然count($matches) == count($values)在执行之前就被调用了?

这里发生了什么?

小智 44

您收到此错误:

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

是因为$values&中的元素数量$matches不相同或$matches包含多于1个元素.

如果$matches包含多于1个元素,则插入将失败,因为查询中只引用了1个列名(hash)

如果$values&$matches不包含相同数量的元素,那么插入也将失败,因为查询期望x参数但是它正在接收y数据$matches.

我相信你还需要确保列散列上还有一个唯一的索引.

试试这里的代码:

<?php

/*** mysql hostname ***/
$hostname = 'localhost';

/*** mysql username ***/
$username = 'root';

/*** mysql password ***/
$password = '';

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password);
    /*** echo a message saying we have connected ***/
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }


$matches = array('1');
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
    $values[] = '?';
}

// INSERT INTO DATABASE
$sql = "INSERT INTO hashes (hash) VALUES (" . implode(', ', $values) . ") ON DUPLICATE KEY UPDATE hash='hash'";
$stmt = $dbh->prepare($sql);
$data = $stmt->execute($matches);

//Error reporting if something went wrong...
var_dump($dbh->errorInfo());

?>
Run Code Online (Sandbox Code Playgroud)

您需要稍微调整一下.

我使用的表结构在这里:

CREATE TABLE IF NOT EXISTS `hashes` (
  `hashid` int(11) NOT NULL AUTO_INCREMENT,
  `hash` varchar(250) NOT NULL,
  PRIMARY KEY (`hashid`),
  UNIQUE KEY `hash1` (`hash`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)

代码在我的XAMPP服务器上运行,该服务器使用PHP 5.3.8和MySQL 5.5.16.

我希望这有帮助.

  • 很好的答案,我刚刚碰到这个,因为我定义了两个具有相同标识符的列 - ":example",这也应该是一个要检查的点! (4认同)

Dan*_*y F 6

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

不幸的是,此错误不能描述与同一问题相关的一系列不同问题-绑定错误。它还没有指定错误的位置,因此您的问题不一定在执行中,而是在已经“准备好”的sql语句中。

这些是可能的错误及其解决方案:

  1. 参数不匹配-字段数与已绑定的参数不匹配。当心数组中的数组。要仔细检查,请使用var_dump($ var)。如果一个数组中的索引是另一个数组(如果该数组中有一个值),则不一定要显示“ print_r ”,而var_dump会显示。

  2. 您尝试使用相同的绑定值进行绑定,例如:“:hash”和“:hash”。每个索引都必须是唯一的,即使从逻辑上说,对于两个不同的部分使用相同的索引是有意义的,即使它的值相同。(类似于常量,但更类似于占位符)

  3. 如果要在一条语句中绑定多个值(如“ INSERT”的情况通常如此),则需要bindParam,然后将bindValue绑定到参数。此处的过程是将参数绑定到字段,然后将值绑定到参数。

    // Code snippet
    $column_names = array();
    $stmt->bindParam(':'.$i, $column_names[$i], $param_type);
    $stmt->bindValue(':'.$i, $values[$i], $param_type);
    $i++;
    //.....
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将值绑定到column_names或table_names时,可以使用``,但这不是必需的,但请确保一致。

  5. ''单引号中的任何值始终被视为字符串,而不会被视为要绑定的列/表名或占位符。