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)
之前执行被调用?
这里发生了什么?
您收到这个错误:
SQLSTATE [HY093]:参数号无效:参数未定义
是因为$values
& $matches
中元素的数量不一样,或者$matches
包含多个元素。
如果$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()); ?>
你将需要适应一点。
我使用的表结构在这里 :
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。
我希望这有帮助。