我有这个问题:
INSERT INTO user ( username , password , role )
SELECT
CONCAT( :username1 , "-" , ABS( REPLACE( (
SELECT username FROM user
WHERE username LIKE :username2
ORDER BY ID DESC LIMIT 1
), :username3, "" ) ) + 1 ) AS username,
:password,
:role
在php中我有这个用于绑定值的代码:
$dbp = $db->prepare( $query );
for( $i = 1 ; $i <= 3 ; $i++ ){
$dbp->bindValue( ':username' . $i , ( $i == 2 ? 'test%' : 'test' ) );
}
$dbp->bindValue( ':password' , '0' );
$dbp->bindValue( ':role' , 'test' );
$dbp->execute();
我在查询中有5个参数:
:username1 , :username2 , :username3 , :password , :role
并为每个人分配了bindValue函数。
Hovewer它会触发此错误:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]:
Invalid parameter number: parameter was not defined' in [...]
PDOStatement->bindValue(':username1', 'test') #1 {main} thrown in [...]
但参数确实存在于我的查询和for循环中。我不能在CONCAT函数中使用参数吗?
然而,This链接对我没有帮助:
1):参数名称与错误绑定不匹配(拼写错误?)
正如我所说,每个参数都匹配:我在每个bindValue之前回显,并且每个参数都写得正确。
2)完全忘记添加bindValue()
5个参数,5个bindValues,5个具有正确匹配的回声
第三点不是我的问题。
答案 0 :(得分:2)
此网站上已有hundreds similar questions。 他们中没有一个人发现了一些关于PDO绑定的神秘信息。所有这些都是由一个简单的排版错误引起的。没有例外。
您可以在查询的任何部分使用参数,只要它表示完整和单个数据文字。