Fehlermeldung bei MySQL

Jacy

Mitglied
Hallo, ich versuche gerade einen Skript zu schreiben, mit dem ich aus einem Formular Werte in meine DB speichern kann. Allerdings bekomme ich immer folgende Fehlermeldung:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /Users/jb110/public_html/albumneu.php on line 72

Das ist mein Code:
PHP:
<?php

 $dbhost = "localhost";
  $dbname = "u-jb110";
  $dbuser = "jb110";
  $dbpass = "";
  
  $dsn    = "mysql:dbhost=$dbhost;dbname=$dbname";
  $db     = new PDO($dsn,$dbuser,$dbpass);
  
$album_sql = "SELECT titel, jahr, cover FROM album";
$album_select = $db->prepare($album_sql);
$album_select->execute();
$album = $album_select->fetchAll();

// Pizzadaten zur Speicherung wurden übermittelt 
// Wenn das Formular abgeschickt wurde, wird der Wert
// des Submit-Buttons übermittelt s.u.
if( $_REQUEST['submit'] ) { // Formular wurde abgeschickt

  // Eingabe-Validierung, sind alle benötigen Daten vorhanden  

  // Das Array Fehler verwenden wir um alle auftreten Fehler zu sammeln
  $fehler = array();
 
  // Falls ein Name vorhanden ist in das Array $pizza kopieren
  // andernfalls einen Fehler registrieren
  // Die Funktion trim() dient dazu überflüssige Leerzeichen am Anfang
  // und am Ende einer Zeichenkette zu entfernen
  if( trim($_REQUEST['titel']) ){
    $album['titel'] = trim($_REQUEST['titel']);
  } else {
    // Der Fehler wird nun unter dem passenden Schlüssel gespeichert
    // so kann die Formulardarstellung entsprechend angepasst werden
    $fehler['titel'] = "Es muss ein Titel für das Album angegeben werden";
  }

  // Das gleiche fuer die Beschreibung, wenn diese fehlt wird
  // allerdings kein Fehler registriert sondern nur ein leerer
  // Wert in $pizza gespeichert
  // Die Beschreibung ist optional
  if( trim($_REQUEST['jahr']) ){
    $album['jahr'] = trim($_REQUEST['jahr']);
  } else {
    $fehler['jahr'] = "Es muss das Erscheinungsjahr des Albums angegeben werden";
  }

  // Das Bild ist ebenfalls optional, siehe Beschreibung
  if( trim($_REQUEST['bild']) ){
    $album['bild'] = trim($_REQUEST['bild']);
  } else {
    $album['bild'] = '';
  }

  // Fehlerbehandlung
  // Falls ein Fehler aufgetreten ist, also das Array $fehler nicht leer ist,
  // diese Fehler anzeigen und nicht mit der Aktualisierung der Datenbank fortfahren
  if($fehler){
    echo '<ul class="fehler">';
    foreach($fehler as $meldung){
      echo "<li>$meldung</li>\n";
    }
    echo "</ul>";
  } else { // Falls kein Fehler aufgetreten ist $fehler ist leer
           // dann Daten speichern
    // Daten speichern
    $insert_sql = "INSERT INTO album (titel,jahr,
                                      cover)
                        VALUES(:titel,:jahr,
                               :cover)";
    $album_insert = $db->prepare($insert_sql);
    if($album_insert->execute($album)){
      echo '<p class="erfolg">Das Album wurde gespeichert</p>';
      // Wenn die Pizza gespeichert ist, die Formulardaten löschen
      // damit nicht versehentlich die gleiche Pizza mehrmals in
      // die Datenbank gespeichert wird, oder das Formular mit
      // dem Bearbeitungsformular verwechselt wird.
      // unset() entfernt eine Variable
      unset($album);
    } else {
      echo '<p class="fehler">FEHLER: Das Album konnte <b>nicht
               gespeichert</b> werden!</p>';
    }
  }
}

// jetzt werden zunächst die Grunddaten der Pizza angezeigt:
// Name, Beschreibung und Bild
?>
  <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<form class="form2" method="post" 
    action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <?php if($fehler['titel']){ $missing = ' class="missing" '; } else { $missing = ''; } ?>
    <p<?php echo $missing; ?>><label for="name">Name des Albums:</label><br />
    <input type="text" name="titel" id="titel"
       value="<?php echo $album['titel']; ?>" /></p>
    
    <p><label for="jahr">Erscheinungsjahr:</label><br />
    <textarea cols="25" rows="3" name="jahr" id="jahr"><?php echo $pizza['jahr']; ?></textarea></p>
    
    <p><img src="bilder/<?php echo $album['cover']; ?>" width="150" height="150" alt="Bild: <?php echo $album['titel']; ?>" />

    <p><label for="bild">Cover des Albums:</label><br />
    <input type="text" name="bild" id="bild" size="15"
       value="<?php echo $album['cover']; ?>" /></p>

<?php // Der Submit-Button wird explizit mit einem Namen versehen (name="submit")
      // damit wir später einfach überprüfen können ob das Formular abgeschickt wurde ?>    
    <p><input type="submit" value="speichern" name="submit" /></p>
    
  <br style="clear:both">
</div>
</form>

Ich komme irgendwie nicht mehr weiter :(( Kann mir irgendjemand helfen?
 
Gehen denn die ersten Excecutes auch schon die du ausführst?
Der Fehler sagt mir, dass du zu viele/zu wenig Argumente an Excecute übergibst.
 
Das weiß ich leider nicht genau. Ich habe versucht das Skript nachzubasteln, so wie wir es in unserer Vorlesung hatten, doch leider funktionieren bei mir viele Befehle nicht,die dort verwendet werden. Gibt es dazu vllt eine Alternative?
 
wie gesagt wenn ich daheim kann ich dir helfen, ich hab leider keinen Webserver hier in der Arbeit.

Auf den ersten Blick schauts ganz gut aus. Du instanzierst ein PDO Objekt mit deinen Datenbankverbindungen. Ich würde vll erstmal testen, ob dein erster Excecute überhaupt funktoiniert, ich denke mal der klappt auch schon nicht.
Ich hatte das so in erinnerung:

Code:
$album_select->exec('statement');

Also ohne den Prepare, aber das dürfte ja gehen, ich hab mich halt auch schon lange nicht mehr mit PDO beschäftigt.

Teste einfach mal bis zu deinem ersten Excecute und kuck ob da der Fehler auch drinnen ist.
 
Ich hab es jetzt mal mit einem anderen Code probiert,der soweit zu funktionieren scheint, aber danke für den Tipp=)

Allerdings hat sich mir noch eine weitere Frage gestellt: In dem Formular soll ja eine Jahrangabe eingetragen werden, die dann in die DB in das Feld Jahr eingefügt wird. Dieses Feld ist aber vom Typ YEAR und muss leider auch so bleiben (Vorgabe). Im PHP Skript kann ich ja aber bei input type= nur "text" angeben. Kann ich das irgendwie transformieren?
 
Zurück