2 Arrays vergleichen und einträge ind DB anlegen oder löschen

TheSun851

Mitglied
Moin Moin,

Diesmal hab ich folgendes Problem!
Und zwar bekommt die function ein Array mit den ID's der Artikel und eine ID nachder die sql1 abfrage gestaltet ist. Die soll dann (nach meinen anderen Nachforschungen) in ein array gespeichert werden. Dann sollen die beiden arrays mit array_diff verglichen werden (was anscheinend auch passiert).

Nun zu der If-abfrage: da ich als unterschied ja nur das zurück bekommen was im 2ten array nicht vorhanden ist hab ich die abfrage einmal so array_diff( $test, $ArtIdDb); und einmal so array_diff( $test, $ArtIdDb); geschrieben, denn eigentlich sollen Einträge vorgenommen werden wenn die ArtikelID noch nicht in der Tabelle (ich ich mit der sql1 abfrage bekommen habe, und das auch nur eine spalte ist mit mehreren Zeilen) vorhanden ist.
Andersrum sollen eben Einträge gelöscht werden wenn die in der Tabelle(von sql1) vorhanden sind aber eben nicht im übergebenen array von $artArr.



Die Funktion dazu sieht wie folgt aus:
PHP:
function artikelVerarbeiten($artArr, $VAID){
   include "db.inc.php";
   $con=mysqli_connect($sqlServer, $sqlBenutzer, $sqlPasswort, $dbName);
   $sql1 = "SELECT ArtikelID FROM verarbeitung WHERE verarbeitungsartID LIKE '$VAID'";
   $erg = mysqli_query($con, $sql1);

Einerseits macht die function irgendwie weder einen eintrag noch löscht er einen eintrag.
Und ich bin mir auch nicht sicher ob die variable $a2 bei der sql3 abfrage so richtig ist.


   $b = count($artArr);
   for ($i=0; $i < $b; $i++) {
       $test = $artArr[$i];
   }
   while($zeile=mysqli_fetch_array($erg)){
       $ArtIdDb[] = $zeile['ArtikelID'];
       $a1 = array_diff($ArtIdDb, $test);
       $a2 = array_diff( $test, $ArtIdDb);

       if ($a1 != "") {
           $sql2 = "DELETE FROM verarbeitung WHERE";
           $erg2 = mysqli_query($con, $sql2);
       }elseif ($a2 != "") {
           $sql3 = "INSERT INTO verarbeitung (verarbeitungsartID, ArtikelID) VALUES ('$VAID', '$a2')"  ;
           $erg3 = mysqli_query($con, $sql3);
       }else{
           echo "Es ist ein Fehler aufgetreten";
       }
   }
}

Ich hoffe ich konnte mein Problen gut schildert und meine Fragen auch verständlich stellen.
Falls noch fragen bestehen bitte fragen.

Liebe Grüße
Sunny
 
1) $test ist kein Array sonder nur die letzte ID des $artArr.
2) Zudem bringt es doch nix. Bei jeder Zeile den aufbauenden $ArtIdDb mit der Eingabe zu vergleichen.
3) Dein Delete-SQL ist unvollständig und muss zwangsläufig einen Fehler verursachen

Hier mal mein ungetester Vorschlag
PHP:
function artikelVerarbeiten($artArr, $VAID){
    include "db.inc.php";
    $con=mysqli_connect($sqlServer, $sqlBenutzer, $sqlPasswort, $dbName);
    $sql1 = "SELECT ArtikelID FROM verarbeitung WHERE verarbeitungsartID LIKE '$VAID'";
    $erg = mysqli_query($con, $sql1);

    //alle ids aus der Tabelle auslesen
    while($zeile=mysqli_fetch_array($erg)){
        $ArtIdDb[] = $zeile['ArtikelID'];
    }

    //Alle Insert bestimmen
    // Das sind die, welche NICHT in der DB vorhanden sind
    $ArtiIdInsert = array_diff($artArr, $ArtIdDb);

    //Alle Delete bestimmen
    // Das sind diejenigen, die in DB sind, aber nicht im Argument
    $ArtIdDelete = array_diff($ArtIdDb, $artArr);

    //Insert ausführen. Annahme: ArtikelID ist eine Zahl
    foreach ($ArtiIdInsert as $id) {
        $sql = "INSERT INTO verarbeitung (verarbeitungsartID, ArtikelID) VALUES ('{$VAID}', {$id})";
        $erg2 = mysqli_query($con, $sql);
    }
   
    //Delete ausführen. Annahme: ArtikelID ist eine Zahle
    $ids = implode(',', $ArtIdDelete);
    $sql = "DELETE FROM verarbeitung WHERE ArtikelID IN({$ids})";
    $erg2 = mysqli_query($con, $sql);
}
 
Hi,
danke für die schnelle antwort.
Jap beim Delete hab echt die hälfte vergessen (wo war ich nur mit meinen Gedanken :oops:).

Wenn ich deinen code teste dann bekomme ich folgendes:

Notice: Array to string conversion in C:\xampp\htdocs\www\pa.inc.php on line 212

Notice: Array to string conversion in C:\xampp\htdocs\www\pa.inc.php on line 216

Notice: Array to string conversion in C:\xampp\htdocs\www\pa.inc.php on line 220

Dabei handelt es sich dann ausgehend von deinem Skript umd die zeilen:

212 -> $ArtiIdInsert = array_diff($artArr, $ArtIdDb);
216 -> $ArtIdDelete = array_diff($ArtIdDb, $artArr);
220 -> $sql = "INSERT INTO verarbeitung (verarbeitungsartID, ArtikelID) VALUES ('{$VAID}', {$id})";

Igrnedwie steh ich grade total auf dem Schlauch :(
 
Zuletzt bearbeitet:
Sit dieID eine Zahl?

Was ist $artArr?
Lass dir den mal mit einem var_dump() ausgeben und poste hier das Resultat
 
ÄH!?!
Das hab ich noch nie gemacht! :(
Kannst du mir das bitte erklären?

Nachtrag:
ich hab jetzt den dump gemacht befor ich das array an die function übergebe und raus kam dabei das bei den aktuell übergebenden werten:
array(1) { [0]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } } array(1) { [0]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } }
 
Zuletzt bearbeitet:
Auf jeden fall kommt $artArr
vom skript artikel:
PHP:
<!DOCTYPE html>
<?php
   session_start();
   include("pa.inc.php");
?>
<html>
<head>
   <meta charset="utf-8">
   <title>Benutzer Verwalten</title>
   <link type="text/css" rel="stylesheet" href="pa.css">
</head>
<body>
<?php 

$verArtID = $_GET['Artikel'];
$_SESSION['verArtID'] = $_GET['Artikel'];
   echo "<h2>Artikel</h2>";
switch ($verArtID) {
   case '1':
       echo "<h3>Halbzeugs</h3>";
       artikel($verArtID,$_SESSION['VerwaltungsBID']);
       break;
   case '2':
       echo "<h3>Produkte</h3>";
       artikel($verArtID,$_SESSION['VerwaltungsBID']);
       break;
   case '3':
       echo "<h3>Sonstiges</h3>";
       artikel($verArtID,$_SESSION['VerwaltungsBID']);
       break;
 
   default:
       echo "Fehler ausgetreten";
       break;
}
?>
</body>
</html>

Die Function artikel dazu sieht wie folgt aus:
PHP:
function artikel($verArtID,$BID){
   include "db.inc.php";
   $con=mysqli_connect($sqlServer, $sqlBenutzer, $sqlPasswort, $dbName);  
   $sql="Select a.ID as AID, a.ArtikelName, a.ArtikelNr, bv.benutzerID, va.ID as VAID FROM artikel a INNER JOIN verarbeitung v ON a.ID=v.ArtikelID INNER JOIN verarbeitungsart va ON va.ID=v.VerarbeitungsartID LEFT JOIN benutzerverarbeitung bv ON bv.VerarbeitungsID=v.ID WHERE va.ID LIKE '$verArtID' ";
   $erg = mysqli_query($con, $sql);
   echo "<table border='1' align='center'>";
   echo "<form action='verwaltungB.php' method='GET'";
       echo "<tr>";
           echo "<td>&nbsp;</td>";
           echo "<td>Artikelname</td>";
           echo "<td>Artikelnummer</td>";
       echo "</tr>";  
   while($Artikel=mysqli_fetch_array($erg)){
       if ($Artikel['benutzerID'] == $BID) {
           echo "<tr><td>";
           echo "<input type='checkbox' name='A[]' checked='checked' value='$Artikel[AID]'></input>";
           echo "</td>";
           echo "<td>&nbsp; $Artikel[ArtikelName]</td>";
           echo "<td>$Artikel[ArtikelNr]</td>";
          
       }else{
           echo "<tr><td>";
           echo "<input type='checkbox' name='A[]' value='$Artikel[AID]'></input>";
           echo "</td>";
           echo "<td>&nbsp; $Artikel[ArtikelName]</td>";
           echo "<td>$Artikel[ArtikelNr]</td>";
       }
   }
   echo $verArtID;
   echo "<br><input style='width:250px' type='submit' name='aenerung' value='Benutzerdaten ändern' onClick='window.location.href=\"verwaltungB.php\"'>";
   echo "<input style='width:250px' type='button' value='zurück' onClick='window.location.href=\"verwaltungB.php?\"'><br><br>";
   echo "</form>";
   echo "</tr></table>";
 }

Hier geht es dann wieder zurück wo dann auch die fuction zum einfügen und löschen aufgerufen werden soll!
PHP:
<!DOCTYPE html>
<?php
   session_start();
   include("pa.inc.php");
?>
<html>
<head>
   <meta charset="utf-8">
   <title>Benutzer Verwalten</title>
   <link type="text/css" rel="stylesheet" href="pa.css">
</head>
<body>
<?php 
if(isset($_GET['BenutzerID'])){
       $_SESSION['VerwaltungsBID'] = $_GET['BenutzerID'];
}else{
   $_SESSION['VerwaltungsBID'];
}

echo "<h2>Mitarbeiter Verwaltung</h2><br>";

// übergebene Daten in die Datenbank schreiben oder löschen
    if (isset($_GET['aenerung']) && isset($_GET['A']))   // Submit-Schaltfläche der Artikelmaske
    {
           $a = array($_GET['A']);
           artikelVerarbeiten($a, $_SESSION['verArtID']);
     }

# Auswahlliste für Verarbeitungsarten
   selectVerarbeitungsart();


   echo "<form action='verwaltungA.php' method='Get'>";

# Benutzerdaten ausgeben
   holeBenutzerdaten($_SESSION['VerwaltungsBID']);

# Checkbox Benutzer Registrieren
   echo "<table align='center'><tr>";
       echo "<td>";

       if(BenutzerRegistrieren($_SESSION['VerwaltungsBID']) == '1'){
           echo "<input type='checkbox' name='registr' checked='checked' >&nbsp;Benutzer Registrieren</input>";
       }else{
           echo "<input type='checkbox' name='registr'>&nbsp;Benutzer Registrieren</input>";
       }
       echo "</td>";
       echo "<td>&nbsp;</td>";
       echo "<td>";
# Checkbox Benutzer Verwalten
       if(BenutzerVerwalten($_SESSION['VerwaltungsBID']) == '2'){
           echo "<input type='checkbox' name='verwalten' checked='checked' >&nbsp;Benutzer Rechte Verwalten</input>"; 
       }else{
           echo "<input type='checkbox' name='verwalten'>&nbsp;Benutzer Rechte Verwalten</input>";
       }
       echo "</td>";
       echo "</tr>";

       echo "<tr>";
           echo "<td> &nbsp;</td>";
           echo "<td>&nbsp;</td>";
           echo "<td> &nbsp;</td>";
       echo "</tr>";
   echo "</table>";

# Checkbox Benutzerkonto-Aktiv
       echo "<table align='center'>";
       echo "<tr><td>";
           if (kontoAktiv($_SESSION['VerwaltungsBID']) == '1') {
               echo "<input type='checkbox' name='aktiv' checked='checked' >&nbsp;Benutzerkonto Aktiv</input><br><br>"; 
           }else{
               echo "<input type='checkbox' name='aktiv'>&nbsp;Benutzerkonto Aktiv</input><br><br>";
           }
       echo "</td></tr></table>";





# Buttons zur Bestätigung der Änderungen oder zum zurückkehern
   echo "<input style='width:250px' type='submit' name='aenerungsEingabe' value='Benutzerdaten ändern' onClick='window.location.href=\"verwaltungA.php\"'><br>";
   echo "<input style='width:250px' type='button' value='zurück zur Verwaltunsübersicht' onClick='window.location.href=\"verwaltungA.php\"'>";

   echo "</form>";
 
?>
</body>
</html>

Ich weiß auch das die methode GET nicht gut ist, sie dient mir jetzt nur als hilfe um zu sehen ob ich auch die daten und werte übertragen bekomme die ich möchte und es wird 100%ig noch auf POST umgestellt.
 
Sorry, Hab grad keine Zeit alles durchzulesen.

2 ganz einfache Sachen.
1) Ist ArtikelId Text oder Zahle
2) Gleich Anfangs der Funktion ein var_dump($artArr); einfügen. Der Macht eine Ausgabe wennd ie die Seite aufrufst. Diese Ausgabe kopierst du hierher
Wenn du einen Befehl nicht kennst, zB. var_dump() dann gibt es ganz viele Hilfeseiten (zB. bei php.net selber), wo zu lesen ist was der Befehl macht.

Leider ist PHP so fehlerhaft, dass man keine Variablendeklarationen braucht. Somit weiss man nie, ob in der Variable ein ganzes Haus oder nur die Hausnummer steckt.
 
Nachtrag:
ich hab jetzt den dump gemacht befor ich das array an die function übergebe und raus kam dabei das bei den aktuell übergebenden werten:
array(1) { [0]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } }
array(1) { [0]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } }

Macht ja nicht wenn du keine zeit hast ich kann ja auch googeln ;)

Ha halt er gibt mir das 2 mal aus weil ich die funtion 2 mal eigeführt habe einmal vor der übergabe und einmal innerhalb der funktion.
Demnach sind es aber keine zahlen sondern strings die im array stehen verstehe ich das so richtig?
Nur ist mein array jetzt ein array oder ein string ??? o_O daraus werd ich grade nicht schlau
 
Zuletzt bearbeitet:
Ah ich glaub jetzt hab ich es zumindest einen teil:
array(1) { [0]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } }
ab hier bekomme mitgeteilt das mein array die größe 2 hat gefolgt vom 1.datentyp und wert und 2.datentyp und wert.
 
Oha Strings mit Zahlen drin. Nicht schön.
Und dann auch noch ein doppelter Array.
Code:
array(1) {
    [0]=> array(2) {
            [0]=> string(1) "2"
            [1]=> string(1) "3"
    }
}

Somit vergleichenwir Ids mit Array.
Schreib mal ganz oben in die Funktion um den Array um eine Stufe zu reduzieren.
PHP:
$artArr = $artArr[0];
 
Zurück