PHP-MySQL Newsscript Fehlermeldung

d3mueller

Mitglied
Hi, wollte eine Funktion einbauen, die einen Eintrag in der Datenbank ändert.
Habe dazu unter jedem Newseintrag(die mit einer Schleife halt generiert werden) versteckte Felder hinzugefügt:

PHP:
//Versteckte Felder um Eintrag zu ändern
		 echo '<section class="news-box" style="min-height: 10px;opacity: .8; height: 21px; margin-top: -9px; ">
		 <form action="index.php?action=update-news-form" method="post">
		 <input name="id" type="hidden" value="' . $row['ID'] . '">
		 <input type="hidden" name="titel" value="' . $row['titel'] . '">
		 <textarea name="inhalt" class="hidden">' . $row['inhalt'] . '</textarea>
		 <input type="submit" value="Eintrag &auml;ndern" style="background-color: gray; border: none; width: 100%; font-size: 16px; font-weight: bold; color: #fff; display: block; cursor: pointer;">
		 </form>
		 </section>';

Klickt man auf den submit button wird man zu folgender Funktion weitergeleitet:

PHP:
<?php
function update_news_form() {
	
  // Erst mal prüfen, ob wir eingeloggt sind
  if( !isset($_SESSION['admin_logged_in']) || $_SESSION['admin_logged_in'] != true )
  {
   // Nicht eingeloggt -> Login-Formular anzeigen
    display_login_form();
  }
  else
  {
		if (isset($_POST['titel']) && isset($_POST['inhalt']) && isset($_POST['id'])) {
			$titel = $_POST['titel'];
			$inhalt = $_POST['inhalt'];
			$id = $_POST['id'];
			?>
  <form name="newseintragupdate" action="index.php?action=update-news" method="post" enctype="multipart/form-data">


    <fieldset id="newseintragupdate"><legend>Newseintrag erstellen</legend>
    <label>Titel:</label> <input cols="5" rows="10" id="titelupdate" type="text" name="titel" value="<?php echo $titel; ?>" /><br/>
    <label>Inhalt:</label> <textarea name="inhalt" id="inhaltupdate" name="inhalt"><?php echo $inhalt; ?></textarea><br/>
    <label>Bild:</label> <input id="uploadupdate" type="file" name="bild"/><br/>
    <input name="ID" type="hidden" value="<?php echo $id; ?>"><br>
    <fieldset id="abbrechen" onclick="location.href='index.php?action=news';">Abbrechen</fieldset>
    <input class="speichern" type="submit" name="news_submit" value="Speichern"/>
    </fieldset>
<br>
  </form>
            <?php
		} else {
			echo "Fehler";
		}
  }
}
?>

So, da kann man dann die Einträge verändern. Bis hierer funktioniert auch alles, er zeigt auch den Inhalt richtig an.

Jetzt leite ich dann weiter auf die eingentliche UPDATE funktion

PHP:
<?php
function update_news()
{
  // Erst mal prüfen, ob wir eingeloggt sind
  if( !isset($_SESSION['admin_logged_in']) || $_SESSION['admin_logged_in'] != true )
  {
    // Nicht eingeloggt -> Login-Formular anzeigen
    display_login_form();
  }
  else
  {
    // Eingeloggt -> News-Daten prüfen
    if(empty($_POST['titel']) || empty($_POST['inhalt']) )
    {
      echo "<fieldset class='fehler'>Der Titel und der Inhalt fehlt! Bitte eintragen</fieldset>";
      update_news_form();
    }
    else
    {
      // Eingaben entschärfen
      $titel = mysql_real_escape_string($_POST['titel']);
      $inhalt = mysql_real_escape_string($_POST['inhalt']);
	  $inhalt = nl2br($_POST['inhalt']);
	  $id = $_POST['ID'];
      $bild = null;
      // Wurde ein Bild hochgeladen?
      if( isset($_FILES['bild']['size']) && $_FILES['bild']['size'] > 0 && getimagesize($_FILES['bild']['tmp_name']) )
      {
        $bild = mysql_real_escape_string( './bilder/' . $_FILES['bild']['name'] );
        // Achtung! Der Ordner bilder muss existieren! Evtl. vorher anlegen!
        move_uploaded_file( $_FILES['bild']['tmp_name'], $bild );
        $query = sprintf( "UPDATE 'news' SET 'titel' = '" . $titel . "', 'inhalt' = '" . $inhalt . "', 'bild' = '" . $bild . "' WHERE 'id' = '" . $id . "'");
      }
      else
      {
        $query = sprintf( "UPDATE 'news' SET 'titel' = '" . $titel . "', 'inhalt' = '" . $inhalt . "' WHERE 'id' = '" . $id . "'");
      }
      // Datenbank-Query zusammen bauen -> Simpler INSERT INTO
 
      // Query ausführen und prüfen, ob alles ok war
      if( ! mysql_query($query) )
      {
        echo "Die News konnte nicht korrekt aktualisiert werden! Fehlermeldung: " . mysql_error() . "<br/>";
        update_news_form();
      }
      else
      {
?>
<fieldset class="erfolg">Der Newseintrag wurde erfolgreich ge&auml;ndert.</fieldset>

<?php
include ('news.php');
      }
    }
  }  
}

?>

Bloß hier kommt folgende Fehlermeldung im Browser :

Die News konnte nicht korrekt aktualisiert werden! Fehlermeldung: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''news' SET 'titel' = 'Nummer 3', 'inhalt' = 'Nummer 3.dfgd' WHERE 'id' = '38'' at line 1
Fehler

also liegt der Fehler hier
PHP:
<?php
...

$query = sprintf( "UPDATE 'news' SET 'titel' = '" . $titel . "', 'inhalt' = '" . $inhalt . "', 'bild' = '" . $bild . "' WHERE 'id' = '" . $id . "'");
      }
      else
      {
        $query = sprintf( "UPDATE 'news' SET 'titel' = '" . $titel . "', 'inhalt' = '" . $inhalt . "' WHERE 'id' = '" . $id . "'");
      }

...
?>


Aber ich find ihn nicht. Ist der UPDATE Befehl vllt falsch?

Danke schon mal

Lg
Dennis
 
Ja, der Update ist falsch. Und warum benutzt du sprintf(), wenn du ohnehin konkatenierst? Versuch es mal so:

PHP:
        $query = sprintf( "UPDATE `news` SET `titel` = '%s', `inhalt` = '%s', `bild` = '%s' WHERE `id` = %d", $titel, $inhalt, $bild, $id);
      }
      else
      {
        $query = sprintf( "UPDATE `news` SET `titel` = '%s', `inhalt` = '%s' WHERE `id` = %d", $titel, $inhalt, $id);
      }

Dein Fehler ist, das du statt Backticks ( ` ) das Single-Quote ( ' ) verwendest, um die Spalten- und Tabellen-Namen zu maskieren.
 
Gehört zwar nicht zu deiner Frage, aber wieso entschärft du nicht auch $_POST['inhalt'] und $_POST['id']?
PHP:
$inhalt = mysql_real_escape_string( nl2br($_POST['inhalt']) );
$id = intval($_POST['id']);
 
Ja, der Update ist falsch. Und warum benutzt du sprintf(), wenn du ohnehin konkatenierst? Versuch es mal so:

PHP:
        $query = sprintf( "UPDATE `news` SET `titel` = '%s', `inhalt` = '%s', `bild` = '%s' WHERE `id` = %d", $titel, $inhalt, $bild, $id);
      }
      else
      {
        $query = sprintf( "UPDATE `news` SET `titel` = '%s', `inhalt` = '%s' WHERE `id` = %d", $titel, $inhalt, $id);
      }

Dein Fehler ist, das du statt Backticks ( ` ) das Single-Quote ( ' ) verwendest, um die Spalten- und Tabellen-Namen zu maskieren.
Ah, danke :)

was könnte man außer sprintf denn noch nehmen?

Gehört zwar nicht zu deiner Frage, aber wieso entschärft du nicht auch $_POST['inhalt'] und $_POST['id']?
PHP:
$inhalt = mysql_real_escape_string( nl2br($_POST['inhalt']) );
$id = intval($_POST['id']);
Ah, danke.
Hatte ich ganz vergessen :)
 
Das mit dem sprintf() ist schon eine gute Lösung. Ich persönlich verwende Prepared Statements oder noch eine Abstraktionsschicht weiter oben einen ORM. Das ist für Anfänger allerdings eine nicht so leicht zu verstehende Variante. sprintf() in Kombination mit mysql_real_escape_string() ist eigentlich schon ganz gut. Jedenfalls übersichtlicher als die String-Verkettung.
 

Neue Beiträge

Zurück