• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PDO execute

Yosh™

Mitglied
Hey,

ich hab ein Array mit dem namen: $aFieldValue
Inhalt:

Array (
[1] => YoshiiTM
[2] => [email protected]
[3] => myPwIsHashedWithASalt
)

jetzt möchte ich dieses Array per PDO execute in die Datenbank schreiben:

PHP:
$sPrepareSql = "INSERT INTO users (username,email,hashedpw) VALUES (?,?,?)"

$oPdo = new pdo();
$oStmt = $oPdo->oDb->prepare($sPrepareSql);
$oStmt->execute($aFieldValue);

Kriege allerdings folgende fehlermeldung:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\creatix\core\models\mainmodel.php on line 96

Er sagt mir not defined parameter, obwohl ich ein Array mit 3 Einträgen habe und 3 Fragezeichen im prepare, verstehe nicht wo da der Fehler sein sollte.
 
Werbung:
Hey,

ich hab ein Array mit dem namen: $aFieldValue
Inhalt:

Array (
[1] => YoshiiTM
[2] => [email protected]
[3] => myPwIsHashedWithASalt
)

jetzt möchte ich dieses Array per PDO execute in die Datenbank schreiben:

PHP:
$sPrepareSql = "INSERT INTO users (username,email,hashedpw) VALUES (?,?,?)"

$oPdo = new pdo();
$oStmt = $oPdo->oDb->prepare($sPrepareSql);
$oStmt->execute($aFieldValue);

Kriege allerdings folgende fehlermeldung:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\creatix\core\models\mainmodel.php on line 96

Er sagt mir not defined parameter, obwohl ich ein Array mit 3 Einträgen habe und 3 Fragezeichen im prepare, verstehe nicht wo da der Fehler sein sollte.

Habe schon länger nicht mehr mit PDO gearbeitet, aber ich denke das hängt mit den Keys zusammen. Nach dem array_filter bleiben die Keys erhalten(1, 2, 4, 9). Sie müssten aber nummeriert (0,1,2,3) sein.
Versuchs mal damit:
PHP:
$oStmt->execute(array_values($aFieldValue));

Schöner (und vor allem in deinem Fall robuster) wäre es natürlich den Parametern Namen zu geben:
Code:
INSERT INTO users (username,email,hashedpw) VALUES (:username,:email,:hash)
PHP:
$oStmt->execute(array(
  'username' => 'YoshiiTM',
  'email' => '…',
  'hash' => '…' 
));
 
Und wiedereinmal :D Meine Rettung.
Vielen dank.

Mit den Parametern ist etwas schwer, da ich alles generieren lasse durch eine Methode, heißt ich hab keine fixen Werte, sondern immer verschiedene auch andere Tabellen mal oder weniger/mehr spalten etc.

Deswegen kann ich hardcoded stuff nicht anwenden, da ich keinerlei SQL Qry's mehr im Script habe, sondern alles über meine Load() / save() funktion läuft.

PHP:
public function load($sSearch, $sKeyField = 'id', $sOrderBy = '', $throwException = true)
{
$this->_bEntryExist = true;$sPrepareQuery = "SELECT ";$index = 1;if ($sOrderBy == '') {
$sOrderBy = $sKeyField;}
foreach ($this->aFields as $key => $sField) {
if ($index == count($this->aFields)) {
$sPrepareQuery .= $key . " ";} else {
$sPrepareQuery .= $key . ", ";}
++$index;}

$sPrepareQuery .= sprintf('FROM %s WHERE %s = ? ORDER BY %s', $this->_sCoreTable, $sKeyField, $sOrderBy);$oPdo = new pdo();$oStmt = $oPdo->oDb->prepare($sPrepareQuery);$oStmt->execute(
array(
$sSearch)
);if ($oStmt->execute() && $oStmt->rowCount() > 0) {
$oRes = $oStmt->fetch(\PDO::FETCH_ASSOC);foreach ($oRes as $key => $mValue) {
$this->aFields[$key] = $mValue;}
return true;} elseif ($throwException) {
throw new \Exception(sprintf(language::lang('PDO_ERROR'), $sKeyField, $sSearch, $this->_sCoreTable));}
}

als beispiel meine load funktion.
Wird nen eigenes Framework :).

Danke nochmal für die hilfe
 
Werbung:
Und wiedereinmal :D Meine Rettung.
Vielen dank.

Mit den Parametern ist etwas schwer, da ich alles generieren lasse durch eine Methode, heißt ich hab keine fixen Werte, sondern immer verschiedene auch andere Tabellen mal oder weniger/mehr spalten etc.

Deswegen kann ich hardcoded stuff nicht anwenden, da ich keinerlei SQL Qry's mehr im Script habe, sondern alles über meine Load() / save() funktion läuft.

PHP:
public function load($sSearch, $sKeyField = 'id', $sOrderBy = '', $throwException = true)
{
$this->_bEntryExist = true;$sPrepareQuery = "SELECT ";$index = 1;if ($sOrderBy == '') {
$sOrderBy = $sKeyField;}
foreach ($this->aFields as $key => $sField) {
if ($index == count($this->aFields)) {
$sPrepareQuery .= $key . " ";} else {
$sPrepareQuery .= $key . ", ";}
++$index;}

$sPrepareQuery .= sprintf('FROM %s WHERE %s = ? ORDER BY %s', $this->_sCoreTable, $sKeyField, $sOrderBy);$oPdo = new pdo();$oStmt = $oPdo->oDb->prepare($sPrepareQuery);$oStmt->execute(
array(
$sSearch)
);if ($oStmt->execute() && $oStmt->rowCount() > 0) {
$oRes = $oStmt->fetch(\PDO::FETCH_ASSOC);foreach ($oRes as $key => $mValue) {
$this->aFields[$key] = $mValue;}
return true;} elseif ($throwException) {
throw new \Exception(sprintf(language::lang('PDO_ERROR'), $sKeyField, $sSearch, $this->_sCoreTable));}
}

als beispiel meine load funktion.
Wird nen eigenes Framework :).

Danke nochmal für die hilfe

Habe mir den Code jetzt nicht genau angesehen, aber die Feldnamen brauchst du ja sowieso:
Code:
INSERT INTO users (username,email,hashedpw)
Dann sollte es ja eigentlich kein Problem sein die Parameter mit den selben Namen zu generieren:
Code:
VALUES (:username, :email, :hashedpw)

Aber wenn es so wie du es hast problemlos funktioniert, will ich dir jetzt auch nicht dagegen reden.
 
Mal etwas offtopic, wenn du dein eigenes Framework schreibst, schon dran gedacht ne eigene DB klasse zu schreiben, mit dem Fluent Interface. Dann könntest du DB Abfragen so bauen

PHP:
$result = \DB::getInstance()->select(array('id', 'login', 'name'))->from('table')->where(array('id'=>1))->execute();

Ist nun jetzt mal ein Beispiel, natürlich kann das machen wie man es will, aber so könntest du dein sql Statement wirklich schritt für schritt aufbauen.

und für den Bereich
PHP:
foreach ($this->aFields as $key => $sField) {
     
     if ($index == count($this->aFields)) {
       $sPrepareQuery .= $key . " ";
     } else {
       $sPrepareQuery .= $key . ", ";
     }
     ++$index;
   }

hättest du auch implode nehmen können
 
Warum benutzen manche eigentlich noch "a" für Array am Anfang einer Variable, sowie "s" für String usw. Erkennt doch jede IDE heutzutage und ist doch altbacken genau wie die Dateien mit .class oder .inc abzuspeichern.

Und wie @B3nnoX schon sagt, ist eine eigne DB-Klasse was feines. Würde daür aufjedenfall zwei Klassen machen einmal "Database" und "DatabaseQuery". Man könnte natürlich noch tiefer eingehen und den Query wieder aufteilen, in die Klassen "SELECT", "UPDATE" usw...
 
Werbung:
Und wie @B3nnoX schon sagt, ist eine eigne DB-Klasse was feines. Würde daür aufjedenfall zwei Klassen machen einmal "Database" und "DatabaseQuery". Man könnte natürlich noch tiefer eingehen und den Query wieder aufteilen, in die Klassen "SELECT", "UPDATE" usw...

Ich arbeite seit 1/2 Jahren nur mehr mit Doctrine (ORM).
Würde ich einer eigenen Klasse definitiv bevorzugen.
 
Ja ich arbeite auch schon 1 Jahr mit Doctrine. Das würde ich einer eignen Klasse auch bevorzugen, allerdings weiß ich ja nicht ob der Threadersteller damit umgehen kann. Geschweige ob er den Composer besitzt.

Benutzt du auch einen Entity Generator oder erstellst du deine Entitys per Hand?
 
Zurück
Oben