SQLSTATE : недопустимый номер параметра: параметр не определен

// 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) вызывается непосредственно перед исполнением?

Что здесь происходит?

Solutions Collecting From Web of "SQLSTATE : недопустимый номер параметра: параметр не определен"

Эта ошибка, которую вы получаете:

SQLSTATE [HY093]: недопустимый номер параметра: параметр не определен

потому что количество элементов в $values & $matches не совпадает или $matches содержит более одного элемента.

Если $matches содержит более одного элемента, то вставка не будет выполнена, поскольку в запросе ( hash ) указано только одно имя столбца,

Если $matches $values & $matches не содержат одинаковое количество элементов, тогда вставка также завершится неудачно из-за запроса, ожидающего x params, но он получит 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 ; 

Код был запущен на моем сервере XAMPP, который использует PHP 5.3.8 с MySQL 5.5.16.

Надеюсь, это поможет.