1. ホーム
  2. php

[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません

2022-02-12 14:18:32

質問

// 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);

上記のコードは、次のようなエラーで失敗します。

sqlstate[hy093]: 無効なパラメータ番号: パラメータが定義されていない

とはいえ count($matches) == count($values) executeが呼ばれる直前?

ここで何が起こっているのでしょうか?

解決方法は?

このエラーは、あなたが受け取っているものです。

<ブロッククオート

sqlstate[hy093]: 無効なパラメータ番号: パラメータが定義されていません

の要素数が少ないからです。 $values &です。 $matches が同じでない場合や $matches が1つ以上の要素を含んでいる。

もし $matches が複数の要素を含む場合、挿入は失敗します。なぜなら、クエリ ( 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());

?>

少しアレンジする必要があります。

私が使用したテーブル構造は ここで :

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 ;

コードはPHP 5.3.8とMySQL 5.5.16を使用しているXAMPPサーバーで実行されました。