[PHP] Aufruf eines geschachtelten Arrays

Original geschrieben von micha
Werde mal die Singlequotes entfernen.
Besser ist das. Tabellen und Spaltennamen gehören, wenn, dann in Backticks ` in Singlequotes stehen in SQL Query Strings und mit denen kannst du wenig anfangen als Spaltenbezeichner ;)
 
Danke, werd mich dran halten.

Dummerweise finde ich nun ausschließlich Einträge der Mitarbeiternummer. Selbst den Eintrag mit dem Namen "?" Findet er in der Mitarbeitertabelle. Das kann nicht sein.

Ich schreibe den Teil nochmal neu und lasse mir die SQL Befehle ausgeben, trage die im phpmyadmin ein und teste die , ob die dort gehen.

Ich melde mich nochmal mit aktuellem Code, sollte mein Problem bestehen.

Danke schonmal für die bisher entgegengebrachte Hilfe.
 
Zuletzt bearbeitet:
Wie gesagt habe ich den ganzen Kram neu geschrieben.
Nun funktioniert das Abgefrage auch ganz gut, nur bekomme ich diesmal auf Grund meiner viele IF Blöcke Probleme beim Eintragen in die Datenbank.

Ich erhalte jeweils die Fehlermeldung Duplicate Entry.
Wird am Primary Key liegen, der ist ja schon vorhanden.

Ich hatte also anfangs in jeder SQL INSERT Anweisung noch den Primary Key enthalten. Das hatte garnicht funktioniert, also habe ich nun als erste Anweisung der Schleife geschrieben in die Datenbank die Zählvariable als Primary Key einzutragen. Das funktioniert auch wunderbar, aber ich muss im Laufe meiner IF Abfragen manchmal den Datensatz mehr als einmal ändern. Sobald dies Auftritt bekomme ich die Fehlermeldung, dass der Entry Duplicate sei.

Wie kann ich das verhindern? Im Grunde müsste INSERT doch vorhandene Daten überschreiben, anstatt mir einen Fehler zurückzugeben, dass das Feld schon belegt sei....

Code:
PHP:
  elseif($temp[8]=='D' OR $temp[8]=='d'){ 
		echo "Drucker von $temp[3] <font color=blue>";  // ( $temp[9] $temp[10] )  
//----------------------------------------------------------------------------------------------------------------PRIMARY KEY
        $prikeydru = "INSERT INTO `drucker`   (`druckernr`) values ('".$i."')";
		$resultprikeydru = mysql_query ($prikeydru);
		if(!$resultprikeydru) echo mysql_error(); // debugger
		else echo "PRIKEY $i angelegt ";	//debugger
//-----------------------------------------------------------------------------------------------------------------------MANR
		//starte sql abfrage nach manr, sofern name in db vorhanden
		  if(!$temp[3]==''){// IF MANR ausgefüllt? auf
			if(strstr($temp[3],'leih') OR strstr($temp[3],'LEIH') OR strstr($temp[3],'Ersatz') OR strstr($temp[3],'ersatz') OR strstr($temp[3],'austausch') OR strstr($temp[3],'Austausch')) {//IF Ring auf
			  $manfredsIDeintragen = "INSERT INTO `drucker`  (`MANr`) values ('345')"; 
			  $resultring = mysql_query ($manfredsIDeintragen);
			  if(!$resultring) echo mysql_error(); // debugger
			  else echo "MANR auf 345(Manfred Ring)";	//debugger
			  if (strstr($temp[3],'Schrott') OR strstr($temp[3],'schrott')){//IF SCHROTT BEI LEIHGERÄTEN AUF
			    $verbleibschrott = "INSERT INTO `drucker`   (`verbleibnr`) values ('1')";
				$resultschrott = mysql_query ($verbleibschrott);
				if(!$resultring) echo mysql_error(); // debugger
			    else echo "Verbleib:SCHROTT";	//debugger
			  }//IF SCHROTT BEI LEIHGERÄTEN ZU
			  else {//ELSE SCHROTT BEI LEIHGERÄTEN AUF
			    $verbleibschrott = "INSERT INTO `drucker`   (`verbleibnr`) values ('4')";
				$resultschrott = mysql_query ($verbleibschrott);
				if(!$resultring) echo mysql_error(); // debugger
			    else echo "Verbleib:aktiv";	//debugger
			  } //ELSE SCHROTT BEI LEIHGERÄTEN ZU
			}//IF Ring zu
			else{//Else RING auf
			  if (strstr($temp[3],'Schrott') OR strstr($temp[3],'schrott')){//IF SCHROTT BEI LEIHGERÄTEN AUF
			    $verbleibschrott = "INSERT INTO `drucker`   (`verbleibnr`) values ('1')";
				$resultschrott = mysql_query ($verbleibschrott);
				if(!$resultring) echo mysql_error(); // debugger
			    else echo "Verbleib:SCHROTT";	//debugger
			  }//IF SCHROTT BEI LEIHGERÄTEN ZU
			  else {//ELSE SCHROTT BEI LEIHGERÄTEN AUF
			    $verbleibschrott = "INSERT INTO `drucker`   (`verbleibnr`) values ('4')";
				$resultschrott = mysql_query ($verbleibschrott);
				if(!$resultring) echo mysql_error(); // debugger
			    else echo "Verbleib:aktiv";	//debugger
			    $getMANR = "SELECT `manr` FROM `mitarbeiter` WHERE `name` LIKE '".$temp[3]."'";
			    $resultMANR = mysql_query ($getMANR);
		        if(!$resultMANR) echo mysql_error(); // debugger
			    else echo "MANRgefunden";	//debugger
				$insertMANR = "INSERT INTO `drucker`   (`MANR`) values ('".$resultMANR."')"; 
			    $resultinsertMANR = mysql_query ($insertMANR);
				if(!$resultinsertMANR) echo mysql_error(); // debugger
			    else echo "MANReingetragen";	//debugger
			  } //ELSE SCHROTT BEI LEIHGERÄTEN ZU
			}//else Ring zu
		  }// IF MANR ausgefüllt? zu
		  else {// Else MANR ausgefüllt? auf
		    $query = "INSERT INTO `drucker`   (`MANr`) values ('')";
			$result = mysql_query ($query);
			if(!$result) echo mysql_error(); // debugger
			else echo "MANR auf blank gesetzt, weil Name nicht ausgefüllt";	//debugger
		  }// IF MANR ausgefüllt? zu

Fehler:
PHP:
21) D - Drucker von Müller, Norbert <font color=blue>PRIKEY 21 angelegt Duplicate entry '0' for key 1MANRgefundenDuplicate entry '0' for key 1<u><b>KAUF</b></u> <u><b>SAPKONTO </b></u> <br></font>


Mir kam da grad so eine Idee:
Wenn ich in der ersten Zeile, wo ich den primary Key setze auch den Rest der Spalten mit Nullen fülle, kann ich innerhalb der IF Blöcke ja dann mit UPDATE Table arbeiten.
Damit müsste sich das ganze doch umgehen lassen.
Ich werde es mal testen,
alldieweil shconmal danke fürs Lesen und Mitfiebern und ggf. Tipps geben :)
 
Zuletzt bearbeitet:
Mit dem Update funktioniert es jetzt.

Nun wird es langsam kompliziert.

Die Benutzer der alten Datenbank, haben das Feld NAMEN etwas ungünstig belegt. Dem NAMEN ist ein Drucker als Gerät zugeteilt. Im NAMEN ist jedoch auch enthalten, was mit dem Gerät eigentlich ist (sofern etwas besonderes ist):

Sofern es Schrott ist, lautet der Syntax: Schrott/ Nachname oder Schrott/Nachname oder Schrott
Sofern es ein Leihgerät ist, Leih/ Nachname oder Leih/ Nachname oder Leihgerät
Sofern es ein Ersatzgerät ist, Ersatz/ Nachname oder Ersatz/Nachname oder Ersatz

Problem 1:

Bis dahin nicht sooo schlimm, das Problem habe ich schon fast gelöst. Dazu verwende ich eine Function, die den String auf besagte Teilstrings checkt und die dann durch "" ersetzt. In der Therorie sieht das dann so aus: (hab mich einer alten bbcode umschreib function bedient, die ich irgendwo noch hatte)

PHP:
	//funktion zum entfernen der schrott leih austausch ersatz und / strings aus dem NAMEN über PREG_REPLACE
	function unstrip($text){

    $bborig = array("/%leih%/", "/%Leih%/","/%austausch%/", "/%Austausch%/", "/%ersatz%/", "/%Ersatz%/", "/%schrott%/", "/%Schrott%/");
    $bbrepl = array("repl","repl","repl","repl","repl","repl","repl","repl");
    $text = preg_replace($bborig, $bbrepl, $text);
   
    return $text;
    }
	//funktion zum entfernen der schrott leih austausch ersatz und / strings aus dem NAMEN über STR_REPLACE -> Kein Mitarbeitername enthält in der DB einen dieser Strings
	function unstrip2($text){
	
    $bborig = array("%leih%", "%Leih%","%austausch%", "%Austausch%", "%ersatz%", "%Ersatz%", "%schrott%", "%Schrott%", "%/");
    $bbrepl = array("repl","repl","repl","repl","repl","repl","repl","repl","repl");
	$text = str_replace ( $bborig,$bbrepl,$text);
	
    return $text;
	}

Doch da gibt es nun das Problem, dass er mir nicht den Text enstripped.
Da ich ja schleifenweise die Zeilen der CSV auslese, setze ich zu Beginn jedes Schleifendurchlaufes $entstriptertext = "nichtgeklappt" und rufe dann im Verlauf meiner IF Abfragen die Function unstrip($text) auf. $entstriptertext = unstrip($text).
An dieser Stelle sollte er also die alte Variable überschreiben, selbst wenn er nichts entstrippt. Aber wenn ich mir $entstriptertext am Ende der Schleife (nachdem die unstrip Function drübergelaufen ist) aufrufe, gibt er mir nachwievor aus: nichtgeklappt.

Hier der Code vom Call der function:

PHP:
if (strstr($temp[3],'Schrott') OR strstr($temp[3],'schrott')){//IF SCHROTT BEI LEIHGERÄTEN AUF
			    $verbleibschrott = "UPDATE drucker SET verbleibnr='1' WHERE druckernr LIKE '".$i."'";
				$resultschrott = mysql_query ($verbleibschrott);
				if(!$resultschrott) echo mysql_error(); // debugger
			    else echo "Schrott: $resultschrott ";	//debugger
				//Entstrippen
				$entstripped2 = unstrip2($temp[3]);
				echo " Unstripped -><b>$entstripped</B><-";
			    $getMANR2 = " SELECT manr FROM mitarbeiter WHERE name LIKE '".$entstripped2."' ";
			    $resultMANR2 = mysql_query ($getMANR2);
		        if(!$resultMANR2) echo mysql_error(); // debugger
			    else echo "MANR $resultMANR2 gefunden ";	//debugger
				$insertMANR2 = "UPDATE drucker SET manr='".$resultMANR2."' WHERE druckernr LIKE '".$i."'"; 
			    $resultinsertMANR2 = mysql_query ($insertMANR2);
				if(!$resultinsertMANR2) echo mysql_error(); // debugger
			    else echo "MANR $resultinsertmanr2 eingetragen ";	//debugger

			  }//IF SCHROTT BEI LEIHGERÄTEN ZU


Problem 2

Dummerweise gibt es darüberhinaus bei den über 500 Mitarbeitern mehrere, die den gleichen Nachnamen tragen. Da aber dann nur der erste dieser Mitarbeiter der Datenbank sämtliche Drucker zugeteilt bekommen würde, muss da eine Unterscheidung gemacht werden. Glücklicherweise haben meine Mitarbeiter in den meisten Fällen dann den Namen auf diese Art und Weise geschrieben:

Nachname, Vorname

Das ist natürlich dann auch wieder beliebig oft mit Schrott/ und Ersatz/ etc. kombinierbar.

Ich muss also die Datenbankabfrage so starten, dass er mir Nachname UND Vorname abfragt, sofern in der Namenszeile der CSV Datei, die ich ja bekanntlich importiere, ein "," vorkommt und ansonsten nur den Namen verwendet.

Ich hatte mir das so gedacht, dass ich dazu das so mache:
Den String irgendwie abschneiden hinterm Komma und diesen Teilstring als $vorname speichern, vom restlichen String das "," Strippen und als $Nachname speichern.

Mein Problem ist nun, welche Funktion ich dafür am besten verwende. Das meiste habe ich schon im Tutorial zu ereg und str von Tim gelesen, aber ich bin mir nicht sicher, was für meinen konkreten Fall das beste ist.

Wenn Ihr Tipps und Ratschläge zu den beiden Problemen habt, bin ich Euch nachwievor dankbar für alles :)
 
Zu Problem 1:

Warum verwendest Du denn zwei verschiedene Funktionen? Kannst es doch über die erste (mittels preg_replace) lösen? Aber wenn Du unbedingt zwei Funktionen haben willste, bitte :)

PHP:
function unstrip2($text){ 
    $bborig = array("leih", "Leih","austausch", "Austausch", "ersatz", "Ersatz", "schrott", "Schrott", "/");
    $bbrepl = array("repl","repl","repl","repl","repl","repl","repl","repl","repl");
    return str_replace($bborig,$bbrepl,$text);
}

echo unstrip2("Ersatz/Nachname");
Ausgabe:

Code:
replreplNachname
Außerdem packst Du die gestrippte (oha! ;) ) Variable in $entstripped2 lässt Dir dann aber $entstripped ausgeben.

Zu Problem 2:

PHP:
$strName = "foo,bar";
$aName = explode(",",$strName);
echo 'vorname: '.$aName[0].'<br>';
echo 'nachname: '.$aName[1].'<br>';
Ausgabe:

Code:
vorname: foo
nachname: bar
 
Ich sehe gerade ein Problem auf mich zukommen.

Bisher dachte ich, dass wenn ich Leih erkenne, ich damit alle Leihgeräte identifizieren kann. Das stimmt soweit auf. Beim identifizieren von Leihgeräten und dem Einordnen dieser in die Leihgerätetable, tut das gute Dienste, jedoch kann ich nicht einfach Leih aus dem Namen strippen (Name muss ja mit dem Gerät, aber ohne dem ganzen Gemurks gespeichert werden) Sonst bleibt entweder garnix da stehen (dann hats zufälligerweise geklappt, oder es bleibt eine der unten genannten 6 Möglichkeiten stehen, nur ohne "Leih").

Die tolen Leute, die die alte Datenbank vermurkst haben, haben nämlich (hab nachgezählt) 6! verschiedene Arten von Syntax eingeführt haben ...

Hier alle Möglichkeiten:
Leih-Pc
Leihgerä
Leihgerät
Leih
Leih-Monitor
SAFLeih

Wie kann ich beim Strippen Joker setzen ? Geht das mit "%" oder so wie Tim in seinem Tutorial schrieb mit "." (<- da macht man doch alles folgende auch mit weg oder) ? Weil derzeit strippt er mir ja nur das Leih raus und nicht den Rest auch !
Leih* steht immer hinter dem Namen. Man könnte also mit Leih.$ arbeiten? Das müsste alle Worte liefern, die mit der Strkette Leih beginnen und bis zum ende ($)des Wortes eine (.) beliebige Zeichenkette haben

Läuft das ganze dann auf eine If Abfrage bei Leihgeräten mit 6 Möglichkeiten hinaus, wo ich jedesmal eine andere Function verwende ? Oder denke ich auch da wieder zu umständlich ?

Werde mich danach mal mit dem foo,bar befassen.

Btw. is das Fubar eigentlich auf mich bezogen ;) ?


EDIT:

Das gesamte Problem hat sich damit erledigt, da ich alle Datensätze, die LEIH SCHROTT oder so enthalten auf den ADMIN umbiegen soll.
 
Zuletzt bearbeitet:
Zurück