2016-08-09 176 views
1

Ich versuche, dem Benutzer eine Ja/Nein-Bestätigung zu geben, bevor er einen Autor aus einer Mysql-Datenbank löscht. Wenn ein Benutzer in der Datei authors.html.php auf Delete klickt, fügt der Controller eine confirm.php hinzu. Die confirm.php fragt den Benutzer nach einem Ja oder Nein zur Bestätigung. Wenn der Ja-Knopf gedrückt wird, soll die confirm.php die ID an den Controller zurückgeben, der dann prüft, ob die Aktion gesetzt ist, und wenn ja, den Autor basierend auf der ID löschen.Datensatz löschen mit PHP Eingabeaufforderung bestätigen

Leider wird der Autor nicht gelöscht, so ist das Problem mit der Aufnahme der Bestätigungsaufforderung. Ohne das Bestätigungs-Include funktioniert das Skript einwandfrei, aber ich möchte herausfinden, was falsch läuft und es ist einfach, Javascript zu verwenden.

Jede Hilfe wird geschätzt.

Mein Controller: index.php

//inlcude the data connection. 
include $_SERVER['DOCUMENT_ROOT'] . '/authors/includes/db.inc.php'; 

try 
{ 
    $result = $pdo->query('SELECT id, name FROM author'); //Rows of a result set returned by fetch are represented as associative arrays, 
} 
catch (PDOException $e) 
{ 
    $error = 'Error fetching authors from the database!'; 
    include 'error.html.php'; 
    exit(); 
} 

foreach ($result as $row) 
{ 
    $authors[] = array('id' => $row['id'], 'name' => $row['name']); 
} 

include 'authors.html.php'; 


if(isset($_POST['action']) and $_POST['action'] == 'Delete') { 

include "confirm.php"; 

    if(isset($_POST['action']) and $_POST['action'] == 'Yes') { 

    try { 
     $sql = 'DELETE FROM author WHERE id = :id'; 
     $s = $pdo -> prepare($sql); 
     $s->bindValue(':id', $_POST['id']); 
     $s->execute(); 
    } 

    catch (PDOException $e) { 
     $error = "Error deleting author."; 
     include 'error.html.php'; 
     exit(); 
    } 

    header('Location: .'); 
    exit(); 

    }// if yes 

} // end if isset delete 

Die authors.html.php dann eine Liste der Autoren zeigt:

<?php foreach ($authors as $author): ?><!-- loop through the list of authors pulled from the database by the controller --> 
    <li> 
     <form action="" method="post"> 
     <div> 
      <?php htmlout($author['name']); ?> <!--display a list of authors and an edit and delete button--> 
      <input type="hidden" name="id" value="<?php 
       echo $author['id']; ?>"> 
      <input type="submit" name="action" value="Edit"> 
      <input type="submit" name="action" value="Delete"> 
     </div> 
     </form> 
    </li> 
    <?php endforeach; ?> 

confirm.php ......

<form action="" method="post"> 
<input type="hidden" name="id" value="<?php echo $author['id']; ?>"> 
<input type="submit" name="action" value="Yes"> 
<!--input type="submit" name="action" value="No"--> 
</form> 
+0

Ihr Bestätigungsformular ist falsch.Es sollte '$ _POST ['id']' sein, also erfassen Sie die ID des Autors, der zum Löschen ausgewählt wurde, ** NOT ** '$ author ['id']', welcher der letzte Autor ist, der ausgegeben wurde in der Liste der Autoren. –

+1

Hm, ich verstehe nicht wirklich, wie das funktionieren soll ... Sie sind sich bewusst, dass Sie ein solches Bestätigungsskript nur in ein vollständiges Nachladen der im Browser angezeigten Seite mittels PHP einfügen können? Das klingt sehr unintuitiv. Wäre es nicht sinnvoller, den Bestätigungsschritt basierend auf einer reinen clientseitigen Logik (Javascript) oder einem Ajax-Aufruf (auch auf Javascript basierend) durchzuführen, wenn der Server zwischen den Schritten konsultiert werden muss? – arkascha

+0

Markieren Sie B, wenn Sie den Wert des versteckten Feldes in $ _POST ['id'] ändern, funktioniert es immer noch nicht. – Hexana

Antwort

1

streng in Bezug auf PHP sprechen, statt zu versuchen, alles in einer einzigen action Datei (Controller in MVC) zu verarbeiten, was Sie tun sollen, ist .. Machen Sie die zweite Form an einen anderen Controller zu senden.

Angenommen, Sie haben ein Formular/eine Tabelle, die die Schaltfläche/das Formular enthält, die den Autor löscht. Lassen Sie dieses Formular/button rufen Sie eine Datei mit dem Namen confirm.php mit der id dieses Autors bestanden.

Innerhalb der Bestätigungsseite rendern Sie das Bestätigungsformular mit dem yes/no Eingang. Und dann wird diese confirm.php an eine delete.php posten, die überprüfen wird, ob der Bestätigungswert innerhalb der $_GET/$_POST gesetzt ist und als solche fortfahren.

Auch auf einer Seitennotiz empfehle ich, dass Sie einige sehr grundlegende Javascript lernen und die confirm() Funktion verwenden.

Auch auf einer Seite Seite Hinweis, ich empfehle dringend, dass Sie einige Validierung, Bereinigung, Entkommen und über Sitzungen lernen.

+1

Hallo Mohd, die Veröffentlichung in eine separate delete.php hat das Problem gelöst. Vielen Dank :) – Hexana

1

Entschuldigung, ich kann keinen Kommentar in Ihren Post setzen, nur eine Antwort (ich habe keinen Ruf verlangt).

Also, Ihre Logik falsch ist, siehe:

if(isset($_POST['action']) and $_POST['action'] == 'Delete') { 

include "confirm.php"; 

    if(isset($_POST['action']) and $_POST['action'] == 'Yes') { 

Wenn die $_POST['action'] == 'Yes' das Skript das nicht passieren:

try { 
     $sql = 'DELETE FROM author WHERE id = :id'; 
     $s = $pdo -> prepare($sql); 
     $s->bindValue(':id', $_POST['id']); 
     $s->execute(); 
    } 

Da die $_POST['action'] nicht 'Löschen' ist mehr.

Ich denke, die Bedingung if(isset($_POST['action']) and $_POST['action'] == 'Yes') muss außerhalb der if(isset($_POST['action']) and $_POST['action'] == 'Delete') sein.

+0

Danke für Ihre Antwort Lucas, aber wenn Sie den Namen und den Wert auf der Bestätigungsseite auf Ja ändern, und überprüfen Sie, ob (iset ($ _ POST ['ja'))) in der Steuerung, daher Konflikte zu vermeiden, noch nicht Arbeit. – Hexana

+0

Wenn die YES-Bedingung innerhalb der DELETE bleibt, müssen Sie möglicherweise den 'auch in Form von confirm.php platzieren. Denn, wie auch immer, du hast die ** Aktion == Löschen ** (Entschuldigung für mein Englisch) verpasst. –

+0

Lucas deine Vorschläge waren sehr hilfreich. Vielen Dank für Sie Hilfe – Hexana