"잘못된 매개 변수 번호 : 매개 변수가 정의되지 않았습니다"데이터 삽입
PHP"잘못된 매개 변수 번호 : 매개 변수가 정의되지 않았습니다"데이터 삽입
최신 정보
VALUES를 나열 할 때 사소한 실수를 저 지르려고했습니다. ": alias"가 아닌 ": username"을 넣어야합니다. 나는이 질문에 대한 답 신용이 그것을 원하는 사람에게는 자유 통치라고 생각하니? 아니면 질문을 삭제합니까?
실물
나는 Yii의 활동적인 레코드 패턴을 한동안 사용 해왔다. 이제, 내 프로젝트는 하나의 작은 트랜잭션을 위해 다른 데이터베이스에 액세스해야합니다. 나는 Yii의 DAO가 이것에 좋은 것이라고 생각했다. 그러나 나는 이상한 오류가 나타납니다.
여기 내 코드가 있습니다 :
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);
FYI $ model-> placeOfBirth는시와 카운티 값 모두에 있어야합니다. 그것은 오타가 아닙니다 (내가해야 할 바보 같은 일).
해결법
-
==============================
1.이 오류는 매우 일반적이기 때문에 답변을 제공하기 위해 여기에 몇 가지 원인이 있습니다.
이 오류는 매우 일반적이기 때문에 답변을 제공하기 위해 여기에 몇 가지 원인이 있습니다.
1) : 매개 변수 이름이 실수로 바인드와 일치하지 않습니다 (typo?). 이것은 여기서 일어난 일입니다. 그는 : SQL 문에서 별명을 가지고 있지만 바인드 된 : username. 그래서 param 바인딩이 시도되었을 때, Yii / PDO는 SQL 문에서 username을 찾을 수 없었습니다. 이것은 "하나의 매개 변수가 짧음"을 의미하고 오류를 던졌습니다.
2) 매개 변수에 bindValue ()를 추가하는 것을 완전히 잊었습니다. 이것은 Yii에서 배열이나 params ($ criteria-> params = array ( ': bind1'=> 'test', ': bind2'=> 'test)가있는 $ critera와 같은 다른 구문에서 더 쉽게 할 수 있습니다.
3) CDataProvider와의 이상한 충돌. 함께 사용하거나 조인 할 때 페이지 매기기 및 / 또는 정렬. 이 특성을 특정, 쉬운 방법은 없지만 CDataProviders에서 복잡한 쿼리를 사용할 때 매개 변수가 떨어지고이 오류가 발생하는 이상한 문제가 발생했습니다.
Yii에서 이러한 문제를 해결하는 데 매우 유용한 한 가지 방법은 구성 파일에 매개 변수 로깅을 설정하는 것입니다. config 파일의 db 배열에 다음을 추가하십시오.
'enableParamLogging'=>true,
로그 섹션에 CWebLogRoute 라우트가 설정되어 있는지 확인하십시오. 이것은주고받은 쿼리와 바인드하려고 시도한 모든 매개 변수를 출력합니다. 슈퍼 유용한!
-
==============================
2.당신이 일을하도록하는 대신 작은 따옴표 안에서 param을 묶으려고 할 수도 있습니다.
당신이 일을하도록하는 대신 작은 따옴표 안에서 param을 묶으려고 할 수도 있습니다.
비교:
Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter));
와:
Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%'));
-
==============================
3.위에 언급되지 않은이 오류의 원인은 매개 변수를 설정 해제 한 경우 동적 매개 변수 배열을 처리 할 때 매개 변수를 전달하기 전에 다시 색인화해야한다는 것입니다.이 잔인한 부분은 오류 로그가 모든 것이 옳은 것처럼 보이는 색인을 보여줍니다. 예 :
위에 언급되지 않은이 오류의 원인은 매개 변수를 설정 해제 한 경우 동적 매개 변수 배열을 처리 할 때 매개 변수를 전달하기 전에 다시 색인화해야한다는 것입니다.이 잔인한 부분은 오류 로그가 모든 것이 옳은 것처럼 보이는 색인을 보여줍니다. 예 :
SELECT id WHERE x = ?, y = ?, z = ?
Log : Invalid parameter number : 매개 변수가 params ( "x", "y", "z")로 정의되지 않았습니다.
이것은 오류를 던져서는 안되지만 인덱스가 다음과 같을 경우에 발생합니다.
0 => x, 1 => y, 4 => z
마지막 매개 변수는 키 2를 찾고 있으므로 정의되지 않은 것으로 간주합니다.
-
==============================
4.같은 것을하려고 할 때이 오류가 발생했습니다 :
같은 것을하려고 할 때이 오류가 발생했습니다 :
$stmt = $pdo->prepare("select name from mytable where id = :id"); $stmt->execute([ 'id' => $id, 'unusedvar' => $foo, // This row causes the error. ]);
기본적으로 execute ()에 전달 된 배열에는 사용하지 않은 매개 변수를 사용할 수 없습니다. execute ()에 전달 된 배열의 모든 값은 준비된 명령문에서 사용해야합니다.
이것은 문서에도 지정되어 있습니다.
from https://stackoverflow.com/questions/5874383/invalid-parameter-number-parameter-was-not-defined-inserting-data by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP는 mysqli 준비 성명 (0) | 2018.09.18 |
---|---|
사용되지 않는 preg_replace / e를 preg_replace_callback [duplicate] (0) | 2018.09.17 |
_GET의 최대 URL 매개 변수 크기 (0) | 2018.09.17 |
이중 콜론 (:)으로 비 정적 메서드 호출 (0) | 2018.09.17 |
PHP에서 동적으로 mysqli bind_param 인수를 바인딩하는 방법? (0) | 2018.09.17 |