2016-07-27 10 views
0

Ich baue ein Projekt mit eckigen und PHP, ich habe eine "Kunden" Tabelle, die ich alle Daten abrufen kann, aber ich habe ein Problem mit dem Löschen einer Zeile. Wenn der "Kunde" "Bestellungen" hat, kann ich die (Zeile) "Kunde" nicht löschen. Wenn der "Kunde" keine "Bestellungen" hat, kann ich ohne Probleme löschen. Dies ist der Fehler, den ich bei phpmyadmin = # 1451 bekomme - Kann eine Eltern-Zeile nicht löschen oder aktualisieren: Eine Fremdschlüssel-Einschränkung schlägt fehl. kann jemand helfen?kann eine Datenbankzeile nicht löschen, da sie einen Fremdschlüssel hat

PHP-Code zum Löschen:

<?php 
header('Content-Type: text/html; charset=utf-8'); 
$connect=mysqli_connect("localhost", "root", "", "hamatkin"); 

    include_once 'Customer.php'; 
mysqli_query($connect,"SET character_set_client = utf8"); 
mysqli_query($connect,"SET character_set_connection = utf8"); 
mysqli_query($connect,"SET character_set_results = utf8"); 
// Check connection 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$data = json_decode(file_get_contents("php://input")); 
$x=$data->customer_id; 
$customer_id = $data->customer_id; 
$del = "DELETE FROM customers WHERE customer_id=".$customer_id; 
    mysqli_query($connect, $del); 
} 
$newURL = "/hamatkin/#/customerCards"; 
header('Location: '.$newURL); 
?> 

Controller:

$scope.delete = function(deletingId, $index) { 

     var params = $.param({"customer_id":deletingId}); 
     $http.post('api/customers-tab/delete-customer.php',{"customer_id":deletingId}) 
      .success(function(data){ 
      var arr=JSON.parse(JSON.stringify(data)); 
      $scope.customerDetails = arr; 
      var arr2 = arr.split(","); 
       arr2.splice($index, 1); 
       $route.reload(); 
     }); 
     } 

HTML-Code:

<tr ng-repeat="x in customers | filter:search_query | orderBy: order_query:reverse_query"> 

      <td>{{ x.customer_id}}</td> 
      <td>{{ x.kind_Of_Customer}}</td> 
      <td>{{ x.full_name}}</td>    <td> {{ x.id}} </td> 
      <td> {{ x.city}} </td> 

      <td><a href="/hamatkin/index.html#/customerCardDetails/{{ x.customer_id}}" class="btn btn-primary btn- active">הצג פרטי לקוח </a></td> 

      <td><a ng-click="delete(x.customer_id, $index)" class="btn btn-primary btn- active">מחיקה</td> 
+3

Hilfe mit was? Sie versuchen etwas zu tun, das gegen eine Einschränkung in Ihrer Datenbank verstößt. Entfernen Sie die Einschränkung oder befolgen Sie sie. Und beachten Sie, dass Sie anfällig für [sql Injektion Angriffe] sind (http://bobby-tables.com) –

+0

@MarcB nichts anderes, was ich tun kann? – tanyaa

+1

"nichts anderes, was Sie tun können" ist nicht, was ich von Marcs Kommentar genommen hätte. Sie haben die Wahl, nichts zu tun oder die Fremdschlüsselbindung aus dieser Tabelle zu entfernen. – castis

Antwort

2

Sie einen CascadeDelete zu Ihrer Tabelle hinzufügen könnte, so dass, wenn eine übergeordnete Datensatz ist gelöscht es ist Kinder sind auch gelöscht. Sie können auch Code schreiben, um das Schlüsselfeld des ausgewählten Kunden zu verwenden, um die Aufträge zuerst im Hintergrund zu löschen, und anschließend den Kunden löschen. Aber Angular wird Ihre Datenbankbeschränkungen nicht außer Kraft setzen.

3

Ihr Schema ist mit einer Einschränkung versehen, die Sie dazu verpflichtet, alle Aufträge eines Kunden vor dem Löschen des Kunden zu löschen. Solange Aufträge für einen Kunden bestehen, lässt MySQL Sie den Kunden nicht löschen.

Welche geschäftliche Bedeutung hat das Löschen einer Kundenzeile? Viele Kunden-Tracking-Systeme löschen solche Zeilen nicht. stattdessen fügen sie eine active Spalte hinzu und setzen sie auf Null, wenn ein Kunde nicht mehr aktiv ist. Wenn Sie einen Kunden mit einer Bestellhistorie löschen, kann das am Ende des Jahres Verwirrung stiften, wenn Sie versuchen, Dinge miteinander in Einklang zu bringen.

Wenn Sie eine Entwicklungs- oder Testdatenbank bereinigen, löschen Sie einfach die Reihenfolgezeilen, bevor Sie die Kundenzeile löschen.

Wenn Sie eine aktuelle MySQL-Version haben, können Sie in der Definition Ihrer Integritätsbedingung ON DELETE CASCADE angeben, wie shown here. Aber das ist ein skizzenhafter Weg.

+0

ok, vielen Dank! – tanyaa

Verwandte Themen