Veröffentlicht 19. Mai 201114 j Hey zusammen! Kurz vorweg - Ich programmiere ein Koch- und Backbuch für eine Bekannte... Ich möchte an einer Stelle ermitteln, ob sich die Zutat in einem Array schon in der Datenbank befindet. Hier mein Code: $Counter = 0; // In $Abfrage ist das Ergebnis meiner Abfrage gespeichert $Abfrage = Query("SELECT ZUTAT FROM zutaten"); // weil man fetch_object scheinbar nur einmal pro abfrage aufrufen kann, schiebe ich einfach zeile für zeile in ein neues array "$ZutatenDB" while($Zeile = $Abfrage->fetch_object()) { $ZutatenDB[$Counter] = $Zeile->ZUTAT; $Counter++; } // hier werden die Zutaten von der Seite durchlaufen for($x = 2; $x < count($Zutaten); $x = $x+3) { $vorhanden = 0; // und hier die aus der datenbank for($y = 0; $y < count($ZutatenDB); $y++) { // ich lasse mir extra die werte vor dem if ausgeben - so kann ich kontrollieren was in den variablen steht echo("vergleiche: '" . $Zutaten[$x] . "'" . " == " . "'" . $ZutatenDB[$y] . "'"); // hier wird verglichen if($Zutaten[$x] == $ZutatenDB[$y]) { // zur kontrolle ein TRUE ausgegeben echo(" TRUE"); $vorhanden = 1; // vorhanden wird auf 1 gesetzt und die innere schleife wird verlassen break; } echo("<br>"); } // weitere Verarbeitung - das ist erstmal egal... if($vorhanden == 0) { // Zutat noch nicht vorhanden - eintragen } else { // Zutat ist schon vorhanden - nicht eintragen } echo("<br>"); } [/PHP] Jedoch sieht meine Ausgabe wie folgt aus: [b]vergleiche: 'Zucker' == 'Zucker' TRUE // das ist ja OK![/b] vergleiche: 'Kokosflocken' == 'Zucker' vergleiche: 'Kokosflocken' == 'Eier' vergleiche: 'Kokosflocken' == 'Mehl' vergleiche: 'Kokosflocken' == 'Backpulver' vergleiche: 'Kokosflocken' == 'Sahnesteif' vergleiche: 'Kokosflocken' == 'Tortenguss' vergleiche: 'Kokosflocken' == 'Himbeeren' vergleiche: 'Kokosflocken' == 'Sahne' vergleiche: 'Kokosflocken' == 'Butterkekse' vergleiche: 'Kokosflocken' == 'Puderzucker' vergleiche: 'Kokosflocken' == 'Vanillinzucker' vergleiche: 'Kokosflocken' == 'Buttermilch' [b]vergleiche: 'Kokosflocken' == 'Kokosflocken'[/b] // aber das!?! kein TRUE steht da - er hätte doch in den if-zweig gehen sollen und TRUE ausgeben vergleiche: 'Kokosflocken' == 'Butter' vergleiche: 'Kokosflocken' == 'Heidelbeeren' vergleiche: 'Kokosflocken' == 'Erdbeeren' vergleiche: 'Kokosflocken' == 'Putenfleisch' vergleiche: 'Kokosflocken' == 'Trockenhefe' vergleiche: 'Kokosflocken' == 'Hefe' vergleiche: 'Kokosflocken' == 'Stärkemehl' Hat jemand eine Ahnung warum "Kokosflocken" == "Kokosflocken" nicht true ergibt? Hoffe ich habe mein Problem gut formuliert... Danke schonmal für eure Hilfe, Luk Bearbeitet 19. Mai 201114 j von LukOnline
19. Mai 201114 j Irgendwie scheint mir das nicht so ganz einleuchtend. Wenn ich das sehe, dann habe ich ein Rezept in der Datenbank und zu jedem Rezept n Zutaten, wobei jede Zutat innerhalb des Rezeptes eindeutig ist, d.h. ich kann im Grunde mit select * from rezept join zutaten on rezept.id = zutaten.rezeptid where rezeptname = ??? direkt alle Zutaten zu einem Rezept passend holen. Mir scheint irgendetwas in Deinem Datenmodell ist nicht richtig
20. Mai 201114 j Autor Hey, danke für deine Antwort. Nein, das geht um etwas anderes.^^ Ich habe eine Tabelle Zutaten(Z_ID, ZUTAT), eine Tabelle Rezepte (R_ID, REZEPT,...) und eine Tabelle Rezepte_Zutaten(Z_ID, R_ID). Der Benutzer kann nun die Zutaten aus der Tabelle Zutaten aus einem <select> Feld wählen. Sollte aber eine Zutat nicht dabei sein, dann soll er sie in ein Textfeldschreiben können. Das heißt ich habe nach dem POST unter Umständen auch Zutaten in meinem Array (-> $Zutaten), die noch nicht in der Tabelle Zutaten stehen. Bevor ich nun die Tabelle Rezepte_Zutaten mit den ganzen IDs fülle, muss ich ja die neuen Zutaten noch in die Tabelle Zutaten schreiben (Sonst gibt es ja keine ID für die Zutaten). Und dann bin ich an der Code-Stelle. Überprüfen, ob die aktuelle Zutat schon in der Tabelle Zutaten ist, wenn ja, dann zur nächsten Zutat, wenn nein, dann mit einem INSERT eintragen... Hoffe das war gut erklärt^^
20. Mai 201114 j Überprüfen, ob die aktuelle Zutat schon in der Tabelle Zutaten ist, wenn ja, dann zur nächsten Zutat, wenn nein, dann mit einem INSERT eintragen... Mach das doch mit einem "insert ignore into", dann kannst Du auswählen und wenn das Textfeld mit einer schon vorhandenen Zutat eingefügt wird, ist es egal. Du musst dann nur auf korrekte Schlüssel innerhalb der Tabellen achten und generell solltest Du String mit PHP: strcmp - Manual bzw PHP: strcasecmp - Manual vergleichen
22. Mai 201114 j Autor Danke für deine Antwort! INSERT IGNORE INTO ZUTATEN (ZUTAT) VALUES ("Zucker"); schreibt bei mir ein zweites mal Zucker in die DB. Der PK ist halt anders... Die strcmp Funktionen teste ich gleich mal...
22. Mai 201114 j schreibt bei mir ein zweites mal Zucker in die DB. Der PK ist halt anders... Natürlich, da sich das ignore auf die Schlüssel bezieht. Ändere / ergänze die Schlüssel richtig, dann tritt dies nicht mehr auf (es gibt bei mySQL mehrere Möglichkeiten Schlüssel und Indizes zu setzen)
22. Mai 201114 j Nein, man kann auch zusätzlich zu einem bestehenden PK noch weitere Schlüssel auf eine Tabelle setzen.
23. Mai 201114 j Autor Das kann ich noch versuchen, aber ich verstehe das trotzdem nicht: $Zutaten[5] enthält Zucker. Ein echo beweist mir das! $SQL = "SELECT COUNT(*) FROM ZUTATEN WHERE ZUTAT = ?"; $Query = $DB->prepare($SQL); $Query->bind_param('s', $Zutaten[5]; $Query->execute(); $Query->bind_result($ANZAHL); while($Query->fetch()) { echo($ANZAHL . "<br>"); } $Query->close();[/PHP] Ich bekomme eine 0 zurück, obwohl Zucker in der Tabelle steht. Wenn ich das SQL direkt im PHPMyAdmin ausführe klappt das doch auch. Kennt niemand die Ursache? EDIT: Die DB-Verbindung steht. Zutaten[2] gibt mir eine 1 zurück....
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.