Felix Riesterer: Was will mir diese PDO-Meldung sagen? "SQLSTATE[HY000]: General error"

Beitrag lesen

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.