SQLSTATE[HY093]:매개 변수 번호가 잘못되었습니다. 매개 변수가 정의되지 않았습니다.
저는 Yii의 활동적인 음반 패턴을 한동안 사용했습니다.이제, 제 프로젝트는 하나의 소규모 트랜잭션에 대해 다른 데이터베이스에 액세스해야 합니다.이거는 Yii의 DAO가 좋을 것 같아서요.하지만, 저는 암호문 오류가 발생하고 있습니다.
CDb명령에서 SQL 문을 실행하지 못했습니다. SQLSTATE[HY093]:매개 변수 번호가 잘못되었습니다. 매개 변수가 정의되지 않았습니다.
여기 내 코드가 있습니다.
public function actionConfirmation
{
$model_person = new TempPerson();
$model = $model_person->find('alias=:alias',array(':alias'=>$_GET['alias']));
$connection=Yii::app()->db2;
$sql = "INSERT INTO users (username, password, ssn, surname
, firstname, email, city, country)
VALUES(:alias, :password, :ssn, :surname
, :firstname, :email, :city, :country)";
$command=$connection->createCommand($sql);
$command->bindValue(":username", $model->alias);
$command->bindValue(":password", substr($model->ssn, -4,4));
$command->bindValue(":ssn", $model->ssn);
$command->bindValue(":surname", $model->lastName);
$command->bindValue(":firstname", $model->firstName);
$command->bindValue(":email", $model->email);
$command->bindValue(":city", $model->placeOfBirth);
$command->bindValue(":country", $model->placeOfBirth);
$command->execute();
$this->render('confirmation',array('model'=>$model));
}
이것은 (응용프로그램 로그에 나타난 것처럼) 다음과 같은 쿼리를 구성합니다.
INSERT INTO users (username, password, ssn, surname, firstname, email
, city, country)
VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country);
참고로$model->placeOfBirth
도시와 카운티의 가치 모두에 있다고 추정됩니다그건 오타가 아니에요. (제가 해야 할 바보 같은 일입니다).
이 오류는 매우 일반적이기 때문에 대답을 제공하기 위해 다음과 같은 몇 가지 원인이 있습니다.
그
:parameter
이름이 실수로 바인딩과 일치하지 않습니다(typo?).이게 여기서 일어난 일입니다.그들은.:alias
SQL 문에서 바인딩됨:username
. 그래서 매개변수 바인딩을 시도했을 때 Yii/PDO는:username
sql 문에서 "하나의 매개 변수가 짧음"을 의미하며 오류를 던졌습니다.추가하는 것을 완전히 잊어버림.
bindValue()
매개 변수의 경우이것은 Yii에서 하기에 더 쉽습니다. 다음과 같은 다른 구조물들.$critera
, 배열 또는 매개 변수가 있는 경우($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)
).다른 가능한 이유는 자리 표시자 이름에 잘못된 문자가 있습니다.
사용 시 CDataProvider Pagination 및/또는 Sorting과 이상한 충돌 발생
together
그리고.joins
. 이를 특징짓는 구체적이고 쉬운 방법은 없지만 CDataProvider에서 복잡한 쿼리를 사용할 때 매개 변수가 떨어지고 이 오류가 발생하는 이상한 문제가 있었습니다.
Yii에서 이러한 문제를 해결하는 매우 유용한 방법 중 하나는 구성 파일에서 매개 변수 로깅을 활성화하는 것입니다.이것을 당신의 것에 추가합니다.db
구성 파일의 배열:
'enableParamLogging'=>true,
그리고 꼭.CWebLogRoute
경로가 당신의 것에 설정되어 있습니다.log
부분.이렇게 하면 제공 및 오류가 발생한 쿼리와 바인딩하려고 했던 모든 매개 변수가 출력됩니다.정말 도움이 되네요!
매개변수가 사용자에게 적합하도록 하는 대신 하나의 따옴표로 묶으려고 하는 것일 수도 있습니다.
비교:
Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter));
사용자:
Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%'));
위에서 다루지 않은 이러한 오류의 원인은 매개변수의 동적 배열을 처리할 때 매개변수를 설정하지 않으면 매개변수를 전달하기 전에 재인덱스해야 하기 때문입니다.여기서 잔인한 부분은 오류 로그에 인덱스가 표시되지 않기 때문에 모든 것이 맞는 것처럼 보인다는 것입니다.예:
SELECT id WHERE x = ?, y = ?, z = ?
로그: 잘못된 매개 변수 번호: 매개 변수가 매개 변수("x",y",z")로 정의되지 않았습니다.
오류가 발생하지 않아야 할 것처럼 보이지만 인덱스가 다음과 같은 경우:
0 => x, 1 => y, 4 => z
키 2를 찾고 있기 때문에 마지막 매개 변수가 정의되지 않은 것으로 간주합니다.
다음과 같은 작업을 시도할 때 오류가 발생했습니다.
$stmt = $pdo->prepare("select name from mytable where id = :id");
$stmt->execute([
'id' => $id,
'unusedvar' => $foo, // This row causes the error.
]);
되지 않은 으로 에서 되지 를 으로 할 할 으로 으로 전달할 수 .execute()
은 . . 이 으로 되었습니다 의 되었습니다 으로 이 의 execute()
준비된 명세서에 사용해야 합니다.
이는 문서에도 명시되어 있습니다.
지정한 값보다 많은 값을 바인딩할 수 없습니다. PDO::prepare()에 지정된 SQL보다 input_parameters에 더 많은 키가 있으면 문이 실패하고 오류가 표시됩니다.
언급URL : https://stackoverflow.com/questions/5874383/sqlstatehy093-invalid-parameter-number-parameter-was-not-defined
'programing' 카테고리의 다른 글
PowerShell 매개 변수 값 목록 (0) | 2023.09.06 |
---|---|
업로드 실패 버전 코드가 2인 APK가 이미 있으므로 APK에 다른 버전 코드를 사용해야 합니다. (0) | 2023.09.06 |
MySQL에서 트리거를 비활성화하는 방법? (0) | 2023.09.06 |
MariaDb: 중첩 json 객체 쿼리를 만드는 방법 (0) | 2023.09.06 |
Ajax.BeginForm은 Ajax 스크립트를 실행하지 않고 포스트백으로 뒤로 넘어갑니다. (0) | 2023.09.06 |