// 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)
вызывается непосредственно перед исполнением?
Что здесь происходит?
Эта ошибка, которую вы получаете:
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.
Надеюсь, это поможет.