Probleme bei der ID-Übermittlung

WebMarco

Mitglied
Guten Tag liebe Helfergemeinde,

ich probiere mich gerade an der Erstellung einer Kommentarfunktion für Blog-Beiträge aus. Diese Funktioniert auch bereits einwandfrei. Für den Administratorbereich möchte ich nun eine Übersicht schaffen, auf der alle Kommentare zusammengefasst werden. Dort soll dann der Administrator die Möglichkeit haben, Kommentare freizugeben oder wieder zu sperren.

Hier das Skript:
PHP:
<!-- Übergeordneter <form> und <input> in der index.php für alle Senden-Ausführen-Funktionen der Seite -->
<form action="" method="post" id="form">
<input name="action" type="hidden" />
<input name="id" type="hidden" />
<!-- ENDE -->

<!-- Das eigentliche Skript -->
<?php
// Artikel-Kommentare
function artikel_kommentare($conid)
{
  if($conid)
  {
    if(isset($_GET['seite']))
    {
      $seite = $_GET['seite'];
    }
    else
    {
      $seite = 1;
    }
    $startseite = ($seite-1) * 10;
    $select = "SELECT
      `id`,
      `artikel_id`,
      `name`,
      `email`,
      `url`,
      `status`,
      `kommentar`,
      DATE_FORMAT(`update`,'am %d.%m.%Y um %H:%i Uhr') AS `kommentarzeit`
    FROM
      `artikel_kommentare`
    ORDER BY `kommentarzeit` DESC
    LIMIT $startseite, 10";
    $ergebnis = mysql_query($select, $conid);
    if(@mysql_num_rows($ergebnis) > 0)
    {
      while($zeile = mysql_fetch_array($ergebnis))
      {
        $datensatz[$zeile['id']]['id']            = $zeile['id'];
        $datensatz[$zeile['id']]['artikel_id']    = $zeile['artikel_id'];
        $datensatz[$zeile['id']]['name']          = $zeile['name'];
        $datensatz[$zeile['id']]['email']         = $zeile['email'];
        $datensatz[$zeile['id']]['url']           = $zeile['url'];
        $datensatz[$zeile['id']]['status']        = $zeile['status'];
        $datensatz[$zeile['id']]['kommentar']     = $zeile['kommentar'];
        $datensatz[$zeile['id']]['kommentarzeit'] = $zeile['kommentarzeit'];
      }
    }
    mysql_free_result($ergebnis);
    return $datensatz;
  }
}

// Artikel-Kommentare laden
$artikel_kommentare = artikel_kommentare($conid);

// Status ändern
if(isset($_POST['status_update']))
{
  $id = $_POST['id'];
  $select = "
  UPDATE `artikel_kommentare` SET
    `status` = '". $_POST['status'][$id] ."',
  WHERE `id` = '". $id ."'
  ";
  mysql_query($select);
  if(mysql_affected_rows () > 0)
  {
    header('Location: '. $_GET['url'] .'?status_update_hinweis=1');
  }
  else
  {
    header('Location: '. $_GET['url'] .'?status_update_fehler=1');
  }
}

echo '<div id="artikel_kommentare">'."\n";
echo ''. $lang_artikel_kommentare_ueberschrift .''."\n";
if(is_array($artikel_kommentare))
{
  foreach ($artikel_kommentare as $kommentare)
  {
    echo '<div class="kommentar_feld">'."\n";
    echo '<span class="fett">'. $kommentare['name'] .':</span> <div class="info_kommentarzeit"><span class="infotext_klein">'. $kommentare['kommentarzeit'] .'</span></div>'."\n";
    echo '<br />'."\n";
    echo ''. $kommentare['kommentar'] .''."\n";
    echo '<br />'."\n";
    if($kommentare['url'] == TRUE)
    {
    echo '<a href="'. $kommentare['url'] .'" rel="nofollow">'. $kommentare['url'] .'</a>'."\n";
    }
    if($kommentare['status'] == 0)
    {
    echo '<select name="status['. $kommentare['id'] .']">'."\n";
    echo '  <option value="0" selected="selected">'. $lang_artikel_kommentare_status_gesperrt .'</option>'."\n";
    echo '  <option value="1">'. $lang_artikel_kommentare_status_freischalten .'</option>'."\n";
    echo '</select>'."\n";
    }
    elseif($kommentare['status'] == 1)
    {
    echo '<select name="status['. $kommentare['id'] .']">'."\n";
    echo '  <option value="0">'. $lang_artikel_kommentare_status_sperren .'</option>'."\n";
    echo '  <option value="1" selected="selected">'. $lang_artikel_kommentare_status_freigeschaltet .'</option>'."\n";
    echo '</select>'."\n";
    }
    echo '<br />'."\n";
    echo '<input name="id" type="hidden" value="'. $kommentare['id'] .'" />'."\n";
    echo '<input type="submit" name="status_update" value="'. $lang_artikel_kommentare_status_update .'" />'."\n";
    echo '</div>'."\n";
  }
}
else
{
  echo '<p class="kommentar_feld">'. $lang_artikel_kommentare_kein_kommentar .'</p>'."\n";
}
// Seitennavigation
if($conid)
{
  $select = "SELECT
  COUNT(`id`)
  FROM `artikel_kommentare`
  ";
  $ergebnis = mysql_query($select, $conid);
  $zeilen = mysql_fetch_row($ergebnis);
  $gesamt_eintraege = $zeilen[0];
  $gesamt_seiten = ceil($gesamt_eintraege / 10);
    echo ''. $lang_artikel_kommentare_seite .'';
    for($i= 1; $i <= $gesamt_seiten; $i++)
    {
      echo '<a href="'. $_GET['url'] .'?seite='. $i .'">['. $i .']</a> ';
    }
}
    echo '</div>'."\n";
?>
<!-- Skript-ENDE -->

</form>

Leider wird jedoch beim ändern der Option und betätigen des Sendenbuttons immer ein Fehler ausgegeben (header('Location: '. $_GET['url'] .'?status_update_fehler=1')). Ich gehe davon aus, dass die ID des zu betreffenden Kommentarstatus nicht richtig übergeben wird. Habe jetzt auch schon eine Nacht darüber geschlafen und mich heute erneut versucht, finde aber einfach nicht den Fehler.

Über einen kleinen Hinweis oder Tipp bin ich wirklich froh und dankbar.

Viele Grüße
Marco

p.s.: die $lang_etc. sind ausgelagerte Texte
 
Zuletzt bearbeitet:
Eine weitere Variante, die leider aber auch nicht funktioniert,...

PHP:
<?php
// Artikel-Kommentare
function artikel_kommentare($conid)
{
  if($conid)
  {
    if(isset($_GET['seite']))
    {
      $seite = $_GET['seite'];
    }
    else
    {
      $seite = 1;
    }
    $startseite = ($seite-1) * 10;
    $select = "SELECT
      `id`,
      `artikel_id`,
      `name`,
      `email`,
      `url`,
      `status`,
      `kommentar`,
      DATE_FORMAT(`update`,'am %d.%m.%Y um %H:%i Uhr') AS `kommentarzeit`
    FROM
      `artikel_kommentare`
    ORDER BY `kommentarzeit` DESC
    LIMIT $startseite, 10";
    $ergebnis = mysql_query($select, $conid);
    if(@mysql_num_rows($ergebnis) > 0)
    {
      while($zeile = mysql_fetch_array($ergebnis))
      {
        $datensatz[$zeile['id']]['id']            = $zeile['id'];
        $datensatz[$zeile['id']]['artikel_id']    = $zeile['artikel_id'];
        $datensatz[$zeile['id']]['name']          = $zeile['name'];
        $datensatz[$zeile['id']]['email']         = $zeile['email'];
        $datensatz[$zeile['id']]['url']           = $zeile['url'];
        $datensatz[$zeile['id']]['status']        = $zeile['status'];
        $datensatz[$zeile['id']]['kommentar']     = $zeile['kommentar'];
        $datensatz[$zeile['id']]['kommentarzeit'] = $zeile['kommentarzeit'];
      }
    }
    mysql_free_result($ergebnis);
    return $datensatz;
  }
}

// Artikel-Kommentare laden
$artikel_kommentare = artikel_kommentare($conid);

// Artikel-Kommentare aktivieren
if(isset($_POST['status_aktivieren']))
{
  $id = $_POST['status_id'];
  $select = "
  UPDATE `artikel_kommentare` SET
    `status` = '1',
  WHERE `id` = '". $id ."'
  ";
  mysql_query($select);
  if(mysql_affected_rows () > 0)
  {
    header('Location: '. $_GET['url'] .'?status_aktivieren_hinweis=1');
  }
  else {
    header('Location: '. $_GET['url'] .'?status_aktivieren_fehler=1');
  }
}

// Artikel-Kommentare deaktivieren
if(isset($_POST['status_deaktivieren']))
{
  $id = $_POST['status_id'];
  $select = "
  UPDATE `artikel_kommentare` SET
    `status` = '0',
  WHERE `id` = '". $id ."'
  ";
  mysql_query($select);
  if(mysql_affected_rows () > 0)
  {
    header('Location: '. $_GET['url'] .'?status_deaktivieren_hinweis=1');
  }
  else {
    header('Location: '. $_GET['url'] .'?status_deaktivieren_fehler=1');
  }
}

echo '<div id="artikel_kommentare">'."\n";
echo ''. $lang_artikel_kommentare_ueberschrift .''."\n";
if(is_array($artikel_kommentare))
{
  foreach($artikel_kommentare as $kommentare)
  {
    echo '<div class="kommentar_feld">'."\n";
    echo '<span class="fett">'. $kommentare['name'] .':</span> <div class="info_kommentarzeit"><span class="infotext_klein">'. $kommentare['kommentarzeit'] .'</span></div>'."\n";
    echo '<br />'."\n";
    echo ''. $kommentare['kommentar'] .''."\n";
    echo '<br />'."\n";
    if($kommentare['url'] == TRUE)
    {
    echo '<a href="'. $kommentare['url'] .'" rel="nofollow">'. $kommentare['url'] .'</a>'."\n";
    }
    // Artikel-Kommentare Status
    switch($kommentare['status'])
    {
      case 0:
      $ausgabe_status = '<p class="fehlermeldung">Kommentar wird nicht angezeigt</p>';
      break;
      case 1:
      $ausgabe_status = '<p class="hinweismeldung">Kommentar wird angezeigt</p>';
      break;
      }
    echo ''. $ausgabe_status .''."\n";
    echo '<input type="submit" name="status_aktivieren" value="aktivieren" />'."\n";
    echo '<input type="submit" name="status_deaktivieren" value="deaktivieren" />'."\n";
    echo '<input name="status_id" type="hidden" value="'. $kommentare['id'] .'" />'."\n";
    echo '</div>'."\n";
  }
}
else
{
  echo '<p class="kommentar_feld">'. $lang_artikel_kommentare_kein_kommentar .'</p>'."\n";
}
// Seitennavigation
if($conid)
{
  $select = "SELECT
  COUNT(`id`)
  FROM `artikel_kommentare`
  ";
  $ergebnis = mysql_query($select, $conid);
  $zeilen = mysql_fetch_row($ergebnis);
  $gesamt_eintraege = $zeilen[0];
  $gesamt_seiten = ceil($gesamt_eintraege / 10);
    echo ''. $lang_artikel_kommentare_seite .'';
    for($i= 1; $i <= $gesamt_seiten; $i++)
    {
      echo '<a href="'. $_GET['url'] .'?seite='. $i .'">['. $i .']</a> ';
    }
}
    echo '</div>'."\n";
?>

Diese Variante ist mir sogar lieber, sofern denn der UPDATE funktionieren würde,... :(

Es wird auch wieder je nachdem welcher Button geklickt wird,
- header('Location: '. $_GET['url'] .'?status_aktivieren_fehler=1'); oder
- header('Location: '. $_GET['url'] .'?status_deaktivieren_fehler=1');
ausgegeben.
 
Zuletzt bearbeitet:
Ich habe jetzt mal einen var_dump($_POST); in die Ergebnisausgabe (statt header('Location: '. $_GET['url'] .'?status_etc.) eingebaut und bekomme, egal welchen Eintrag ich de- oder aktivieren will fogende Ausgabe:

Kommentar mit ID 1, Stautus 0 (deaktiviert) auf Button aktivieren geklickt:
- array(3) { ["action"]=> string(0) "" ["id"]=> string(1) "1" ["status_aktivieren"]=> string(10) "aktivieren" }

Kommentar mit ID 2, Stautus 0 (deaktiviert) auf Button aktivieren geklickt:
- array(3) { ["action"]=> string(0) "" ["id"]=> string(1) "1" ["status_aktivieren"]=> string(10) "aktivieren" }

Also, egal bei welchem Kommentar ich auf Aktivieren klicke, werden immer die selben Werte übermittelt.
 
Also mal davon abgesehen, dass mehrfach Postings unerwünscht sind, präsentierst du uns hier eine Codemasse, die ich für mich gesprochen (und bestimmt noch einige andere) nicht gerne durchgucke.
Kopiere doch mal den entsprechenden Teil heraus, in dem du den Fehler vermutest ( +/- 5 Zeilen dazu ist meistens ausreichend). Wenn wir doch mehr Code brauchen, werden wir dir das schon sagen.
 
Hallo timestamp,

tut mir sehr leid, dass ich mich aus Unwissenheit nicht ganz an die Forenregeln gehalten habe. Natürlich schützt Unwissenheit vor Strafe nicht; ich gelobe Besserung. Ich will mich nun auf den Teil beschränken, der meiner Meinung nach fehlerhaft sein müsste.

Dies ist die aufzurufende Funktion, die ein Kommentar mit dem Status von "0" auf den Status "1" ändern soll. Die andere Funktion, die Gegenteiliges tut, lasse ich außen vor, da ich davon ausgehe, dass bei beiden der gleiche Fehler vorliegt:

PHP:
// Artikel-Kommentare aktivieren
if(isset($_POST['status_aktivieren']))
{
  $id = $_POST['id'];
  $select = "
  UPDATE `artikel_kommentare` SET
    `status` = '1',
  WHERE `id` = '". $id ."'
  ";
  mysql_query($select);
  if(mysql_affected_rows () > 0)
  {
    header('Location: '. $_GET['url'] .'?status_aktivieren_hinweis=1');
  }
  else {
    header('Location: '. $_GET['url'] .'?status_aktivieren_fehler=1');
  }
}

Aufrufen und übermitteln der Informationen möchte ich das Ganze mit diesem Skriptteil:

PHP:
if(is_array($artikel_kommentare))
{
  foreach($artikel_kommentare as $kommentare)
  {
    // echo des Kommentar
    // Über diese Buttons rufe ich die jeweilige Funktion auf, was auch korrekt ausgeführt wird
    echo '<input type="submit" name="status_aktivieren" value="aktivieren" />'."\n";
    echo '<input type="submit" name="status_deaktivieren" value="deaktivieren" />'."\n";
    // Hier gebe ich ja die ID des jeweiligen Kommentar aus
    echo '<input name="id" type="hidden" value="'. $kommentare['id'] .'" />'."\n";
    echo '</div>'."\n";
  }
}
 
Zuletzt bearbeitet:
zu 1)
Vielen Dank für den Hinweis mit dem mysql_real_escape_string(). Bedeutet das, dass ich bei jeder Datenbankabfrage für jeden abzufragenden Wert diesen mit dem mysql_real_escape_string() maskieren muss? Bei dem Beispiel wird von einem SQL Injection Angriff bezüglich eines Loginskriptes gesprochen.

zu 2)
Egal bei welchem Kommentar ich auf den Button "status_aktivieren" klicke, wird immer string(1) "1" ausgegeben. Ich habe den var_dump wie folgt eingebaut:

PHP:
  if(mysql_affected_rows () > 0)
  {
    var_dump($_POST['id']);
  }
  else {
    var_dump($_POST['id']);
  }
 
Gehört zwar nicht zum eigentlichen Thema, aber nocheinam zu Punkt 1)
Ich habe ein Loginskript, wo ich den mir nun bekannten mysql_real_escape_string() eingebaut habe. Ist das so korrekt?

PHP:
    $select = "
    SELECT
      `id`,
      `nachname`,
      `vorname`,
      `admin`
    FROM `benutzer`
    WHERE
      (vorname  like '".mysql_real_escape_string($_REQUEST["vorname"][0])."') AND
      (nachname like '".mysql_real_escape_string($_REQUEST["nachname"][0])."') AND
      (kennwort = '".mysql_real_escape_string(md5($_REQUEST["pwd"][0]))."')
    ";
 
md5 benötigt das nicht, weil md5 nur aus hexadezimal zahlen besteht. bei dem Rest ist es aber richtig angewendet.

1)
Existiert die ID in der Datenbank?
Wir der Datensatz geupdatet? Oder ist sie schon bei 1? Wenn ja gibt mysql_affected_rows 0 zurück, da der Datensatz nicht geupdatet wird, wenn er den Wert schon hat.
 
Zurück