programing

SQLSTATE[HY093]:매개 변수 번호가 잘못되었습니다. 매개 변수가 정의되지 않았습니다.

stoneblock 2023. 9. 6. 21:44

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도시와 카운티의 가치 모두에 있다고 추정됩니다그건 오타가 아니에요. (제가 해야 할 바보 같은 일입니다).

이 오류는 매우 일반적이기 때문에 대답을 제공하기 위해 다음과 같은 몇 가지 원인이 있습니다.

  1. :parameter이름이 실수로 바인딩과 일치하지 않습니다(typo?).이게 여기서 일어난 일입니다.그들은.:aliasSQL 문에서 바인딩됨:username. 그래서 매개변수 바인딩을 시도했을 때 Yii/PDO는:usernamesql 문에서 "하나의 매개 변수가 짧음"을 의미하며 오류를 던졌습니다.

  2. 추가하는 것을 완전히 잊어버림.bindValue()매개 변수의 경우이것은 Yii에서 하기에 더 쉽습니다. 다음과 같은 다른 구조물들.$critera, 배열 또는 매개 변수가 있는 경우($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)).

  3. 다른 가능한 이유는 자리 표시자 이름에 잘못된 문자가 있습니다.

  4. 사용 시 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