Подтвердить что ты не робот

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

// 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?

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

4b9b3361

Ответ 1

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

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

заключается в том, что число элементов в $values и $matches не одинаково или $matches содержит более 1 элемента.

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

Если $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.

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