Liebe Mitlesende,
ich habe mir für ein Projekt eine Klasse gebaut, die PHPs PDO-Klasse nutzt. Nun möchte ich ein SQL-UPDATE an einer Tabelle durchführen, und erhalte dabei diese ominöse Fehlermeldung:
SQLSTATE[HY000]: General error
Was will mir wer (PHP, PDO oder MySQL?) damit sagen?
Mein PHP-Code, der die Anfrage stellt:
class MyDB {
...
public function __construct ($settings) {
$t = $this;
$t->errors = array();
try {
$t->pdo = new \PDO(
sprintf(
'mysql:dbname=%1$s;host=%2$s;charset=UTF8;',
$settings['db-name'],
$settings['db-host']
),
$settings['db-user'],
$settings['db-pw'],
array(
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
)
);
} catch (\PDOException $e) {
$t->errors[] = $t->get_error($e);
}
}
/**
* wrapper for \PDO::prepare, \PDOStatement::execute and \PDOStatement::fetchAll
*
* This function passes the parameters through to the PDO object.
*
* @param string SQL
* @param array parameters list
* @param int column number for \PDO::FETCH_COLUMN fetch mode
* @return array result sets
*/
public function get ($sql = '', $params = array(), $col = null) {
$t = $this;
$r = array();
if (!empty($sql)) {
$st = $t->pdo->prepare($sql);
$st->execute($params); // getestet: ergibt in allen Fällen true
try {
$r = (
!is_null($col) && is_numeric($col)
? $st->fetchAll(\PDO::FETCH_COLUMN, $col)
: $st->fetchAll(\PDO::FETCH_ASSOC)
);
} catch (\PDOException $ex) {
$t->errors[] = $t->get_error(
$ex,
array('sql' => $sql, 'params' => $params)
);
}
}
return $r;
}
}
Da ich sowohl den SQL-Code mit Platzhaltern, als auch die Parameter logge, hier meine Debug-Ausgabe, was ich an Daten füttern wollte:
UPDATE `people` SET
`call`=:call,
`first_name`=:first_name,
`family_name`=:family_name,
`email`=:email,
`sex`=:sex,
`titles`=:titles
WHERE `first_name`=:first_name AND `family_name`=:family_name
Die Platzhalter wurden mit diesem Array befüllt:
[params] => Array
(
[:call] => Herr
[:first_name] => Fritzchen
[:family_name] => Müller
[:email] => fritzchenmueller@example.org
[:sex] => m
[:titles] => Prof. Dr.
)
Mit ist völlig unklar, wo hier ein Fehler liegen könnte. Anscheinend wird mein SQL-Code korrekt erstellt (sehe keinen Syntax-Fehler darin) und mit der korrekten Anzahl an passenden Ersetzungsparametern an MyDB::get
übertragen.
Wer weiß Rat?
Liebe Grüße,
Felix Riesterer.