SQLSTATE[HY093]: Ungültige Parameternummer: Parameter wurde nicht definiert

Lesezeit: 4 Minuten

k zum Benutzeravatar von z
k zum z

Ich benutze Yii’s Active Record Pattern schon seit einiger Zeit. Jetzt muss mein Projekt für eine kleine Transaktion auf eine andere Datenbank zugreifen. Ich dachte, das DAO der Yii wäre gut dafür. Allerdings erhalte ich einen kryptischen Fehler.

CDbCommand konnte die SQL-Anweisung nicht ausführen: SQLSTATE[HY093]: Ungültige Parameternummer: Parameter wurde nicht definiert

Hier ist mein Code:

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));
}

Dadurch wird die folgende Abfrage erstellt (wie im Anwendungsprotokoll zu sehen):

INSERT INTO users (username, password, ssn, surname, firstname, email
                   , city, country) 
VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country);

FYI $model->placeOfBirth soll sowohl in Stadt- als auch in Landkreiswerten enthalten sein. Das ist kein Tippfehler (nur eine dumme Sache, die ich tun muss).

Benutzeravatar von thaddeusmt
thaddäusmt

Nur um eine Antwort zu geben – da dieser Fehler ziemlich häufig vorkommt – sind hier einige Ursachen:

  1. Der :parameter Name stimmt aus Versehen nicht mit der Bindung überein (Tippfehler?). Das ist hier passiert. Sie haben :alias in der SQL-Anweisung, aber gebunden :username. Als also die Parameterbindung versucht wurde, konnte Yii/PDO nicht finden :username in der SQL-Anweisung, was bedeutet, dass es “ein Parameter kurz” war und einen Fehler ausgelöst hat.

  2. Völlig vergessen, die hinzuzufügen bindValue() für einen Parameter. Dies ist in Yii einfacher zu bewerkstelligen als andere Konstrukte $criterawo Sie ein Array oder params haben ($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)).

  3. Ein weiterer möglicher Grund ist ein ungültiges Zeichen im Platzhalternamen

  4. Seltsame Konflikte mit der CDataProvider-Paginierung und/oder -Sortierung bei der Verwendung together Und joins. Es gibt keine spezifische, einfache Möglichkeit, dies zu charakterisieren, aber bei der Verwendung komplexer Abfragen in CDataProviders hatte ich seltsame Probleme mit Parametern, die gelöscht wurden und dieser Fehler auftrat.

Eine sehr hilfreiche Möglichkeit, diese Probleme in Yii zu beheben, ist Parameterprotokollierung aktivieren in deiner Konfigurationsdatei. Fügen Sie dies zu Ihrem hinzu db Array in Ihrer Konfigurationsdatei:

'enableParamLogging'=>true,

Und stellen Sie sicher, dass CWebLogRoute Route ist in Ihrem eingerichtet log Abschnitt. Dadurch wird die Abfrage ausgegeben, die einen Fehler ergab, und alle Parameter, die versucht wurden, zu binden. Super hilfreich!

  • Guter Post. Ich habe in meiner Instanz festgestellt, dass ich nach einem der Spaltennamen ein Leerzeichen hatte, und das war genug, um den Fehler auszulösen.

    – SalonMonster

    19. Dezember 2011 um 23:52 Uhr

  • Eine Liste gültiger Platzhalterzeichen hier: stackoverflow.com/questions/5809951/…

    – Schokolade

    8. Juli 2013 um 12:04 Uhr


  • Meiner war auch ein Leerzeichen nach einem der Spaltennamen im Bind-Aufruf, Mann, der schwer zu erkennen war

    – Wesley Smith

    1. August 2016 um 12:49 Uhr


Möglicherweise versuchen Sie, einen Parameter in einfache Anführungszeichen zu binden, anstatt ihn die Arbeit für Sie erledigen zu lassen.

Vergleichen:

Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter));

Mit:

Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%'));

Eine Ursache für diesen Fehler, die für mich oben nicht behandelt wurde, ist, wenn Sie es mit einem dynamischen Array von Parametern zu tun haben, wenn Sie irgendwelche Parameter zurücksetzen, müssen Sie sie neu indizieren, bevor Sie sie übergeben. Der brutale Teil davon ist, dass Ihr Fehlerprotokoll dies nicht tut Indexe anzeigen, damit es so aussieht, als wäre alles in Ordnung. Z.B:

SELECT id WHERE x = ?, y = ?, z = ?

Könnte das Protokoll erzeugen: Ungültige Parameternummer: Parameter wurde nicht mit Parametern definiert (“x”, “y”, “z”)

Dies sieht so aus, als ob es keinen Fehler auslösen sollte, aber wenn die Indizes so etwas sind:

0 => x, 1 => y, 4 => z

Es betrachtet den letzten Parameter als undefiniert, weil es nach Schlüssel 2 sucht.

  • Fügen Sie Ihrer Antwort hinzu, dass ein einfaches print_r die Indizes anzeigt und dass dies mit array_values ​​behoben werden kann, da es das Array beginnend bei 0 neu indiziert

    – chiliiii

    6. September 2016 um 17:28 Uhr

Ich habe diesen Fehler erhalten, wenn ich versucht habe, Folgendes zu tun:

$stmt = $pdo->prepare("select name from mytable where id = :id");
$stmt->execute([
  'id' => $id,
  'unusedvar' => $foo, // This row causes the error.
]);

Grundsätzlich können Sie keine unbenutzten Parameter im Array übergeben execute(). Jeder Wert im Array wird übergeben execute() muss in Ihrer vorbereiteten Anweisung verwendet werden.

Dies ist auch in der angegeben Dokumente:

Das Binden von mehr Werten als angegeben ist nicht möglich; Wenn in input_parameters mehr Schlüssel vorhanden sind als in der in PDO::prepare() angegebenen SQL, schlägt die Anweisung fehl und es wird ein Fehler ausgegeben.

1445020cookie-checkSQLSTATE[HY093]: Ungültige Parameternummer: Parameter wurde nicht definiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy