SQLSTATE : Ungültige Parameternummer: Parameter wurde nicht definiert

// BUILD VALUES $count = count($matches); for($i = 0; $i  dbc -> prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash"); $q -> execute($matches); 

Der obige Code schlägt mit dem folgenden Fehler fehl

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

Obwohl wenn count($matches) == count($values) kurz bevor execute aufgerufen wird?

Was geht hier vor sich?

Dieser Fehler, den Sie erhalten:

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

ist, weil die Anzahl der Elemente in $values & $matches nicht identisch ist oder $matches mehr als 1 Element enthält.

Wenn $matches mehr als 1 Element enthält, schlägt die Einfügung fehl, da nur 1 Spaltenname in der Abfrage referenziert wird ( hash )

Wenn $values & $matches nicht die gleiche Anzahl von Elementen enthalten, wird die Einfügung ebenfalls fehlschlagen, da die Abfrage x params erwartet, aber y-Daten $matches empfängt.

Ich glaube, dass Sie auch sicherstellen müssen, dass der Spaltenhash einen eindeutigen Index hat.

Probieren Sie den Code hier :

 < ?php /*** mysql hostname ***/ $hostname = 'localhost'; /*** mysql username ***/ $username = 'root'; /*** mysql password ***/ $password = ''; try { $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password); /*** echo a message saying we have connected ***/ echo 'Connected to database'; } catch(PDOException $e) { echo $e->getMessage(); } $matches = array('1'); $count = count($matches); for($i = 0; $i < $count; ++$i) { $values[] = '?'; } // INSERT INTO DATABASE $sql = "INSERT INTO hashes (hash) VALUES (" . implode(', ', $values) . ") ON DUPLICATE KEY UPDATE hash='hash'"; $stmt = $dbh->prepare($sql); $data = $stmt->execute($matches); //Error reporting if something went wrong... var_dump($dbh->errorInfo()); ?> 

Sie müssen es ein wenig anpassen.

Die Tabellenstruktur, die ich verwendet habe, ist hier :

 CREATE TABLE IF NOT EXISTS `hashes` ( `hashid` int(11) NOT NULL AUTO_INCREMENT, `hash` varchar(250) NOT NULL, PRIMARY KEY (`hashid`), UNIQUE KEY `hash1` (`hash`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Code wurde auf meinem XAMPP Server ausgeführt, der PHP 5.3.8 mit MySQL 5.5.16 verwendet.

Ich hoffe das hilft.

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

Leider ist dieser Fehler nicht beschreibend für eine Reihe von Problemen, die mit dem gleichen Problem zusammenhängen – ein verbindlicher Fehler. Es gibt auch nicht an, wo der Fehler ist, und so ist Ihr Problem nicht unbedingt in der Ausführung, sondern die SQL-statement, die bereits ‘vorbereitet’ wurde.

Dies sind die möglichen Fehler und ihre Lösungen:

  1. Es gibt einen Parameterkonflikt – die Anzahl der Felder stimmt nicht mit den Parametern überein, die gebunden wurden. Achten Sie auf Arrays in Arrays. Um das zu überprüfen, benutze var_dump ($ var) . ” print_r ” zeigt nicht unbedingt, ob der Index in einem Array ein anderes Array ist (wenn das Array einen Wert enthält), während var_dump dies tut .

  2. Sie haben versucht, mit demselben Bindungswert zu binden, zum Beispiel: “: hash” und “: hash”. Jeder Index muss eindeutig sein, auch wenn es logisch sinnvoll ist, denselben für zwei verschiedene Teile zu verwenden, auch wenn es denselben Wert hat. (Es ist ähnlich wie eine Konstante, aber mehr wie ein Platzhalter)

  3. Wenn Sie in einer statement mehr als einen Wert binden (wie es häufig bei einem “INSERT” der Fall ist), müssen Sie BindParam und dann BindValue an die Parameter binden. Der process besteht darin, die Parameter an die Felder zu binden und anschließend die Werte an die Parameter zu binden.

     // Code snippet $column_names = array(); $stmt->bindParam(':'.$i, $column_names[$i], $param_type); $stmt->bindValue(':'.$i, $values[$i], $param_type); $i++; //..... 
  4. Wenn Sie Werte an column_names oder table_names binden, können Sie “ verwenden, aber das ist nicht notwendig, aber stellen Sie sicher, dass Sie konsistent sind.

  5. Jeder Wert in einfachen Anführungszeichen wird immer als String behandelt und nicht als Spalten- / Tabellenname oder Platzhalter zum Binden gelesen.