Achot: Prüfen ob ein Produkt bereits in der MySQL Tabelle existiert

Hallo,

ich habe folgenden Code:

if(isset($_POST['artikel_merken'])){

 if ($stmt = $mysqli->prepare("INSERT INTO artikel_merken_temporaer (userid, artikelid, menge, datum) 
	                           VALUES (?, ?, ?, ?)")) { 
	    
	$userid  	 = $user->id;
	$artikelid       = $artikel;
	$menge  	 = $_POST["menge"];
	$datum		 = time();      
	      
     $stmt->bind_param("ssss", $userid, $artikelid, $menge, $datum);
     $stmt->execute();

     $_SESSION['success_merken'] = 1;
     
     header("Location: artikel.php?kat=$kategorie&artikel=$artikel#succes");
     exit;		
 } else {
    echo $mysqli -> error;
  }
}

Mit diesem Code speichere ich neue Artikel in meiner Datenbank. Jetzt möchte ich erreichen bevor das Insert passiert soll geschaut werden ob sich das entsprechende Produkt bereits in der Tabelle befindet, wenn ja soll er nur die Anzahl erhöhen. Wenn nicht gefunden wird, einfach ein normales Update.

Meine Frage dazu, kann dieses bereits die Datenbank checken oder muss ich noch ein Code schreiben er erst einmal schaut ist etwas vorhanden, wenn ein JA zurück kommt dann mach ein Update sonst ein Insert?

akzeptierte Antworten

  1. Hallo Achot,

    Meine Frage dazu, kann dieses bereits die Datenbank checken oder muss ich noch ein Code schreiben er erst einmal schaut ist etwas vorhanden, wenn ein JA zurück kommt dann mach ein Update sonst ein Insert?

    Das kann die Datenbank für dich machen, du suchst INSERT ... ON DUPLICATE KEY UPDATE.

    Gruß,
    Tobias

    1. Hallo,

      Das kann die Datenbank für dich machen, du suchst INSERT ... ON DUPLICATE KEY UPDATE.

      danke für dein Link. Das heißt also ich müsste ein UNIQUE auf meine Spalte artikelid setzen? Das würde aber nach hinten los gehen? Denn ein anderer User kann natürlich diesen Artikel in die Datenbank legen.

      1. Hallo Achot,

        Das heißt also ich müsste ein UNIQUE auf meine Spalte artikelid setzen? Das würde aber nach hinten los gehen? Denn ein anderer User kann natürlich diesen Artikel in die Datenbank legen.

        Nein, du brauchst einen Key auf userid und artikelid - ein jeder User kann jeden Artikel vermutlich nur einmal anlegen, oder?

        Gruß,
        Tobias

        1. Hallo Tobias,

          Nein, du brauchst einen Key auf userid und artikelid - ein jeder User kann jeden Artikel vermutlich nur einmal anlegen, oder?

          richtig, ein User kann nur einmal einen jeweiligen Artikel anlegen. Ein anderer User kann natürlich den gleichen Artikel wiederum anlegen.

          1. Hallo Tobias,

            Nein, du brauchst einen Key auf userid und artikelid - ein jeder User kann jeden Artikel vermutlich nur einmal anlegen, oder?

            das war wohl keine gute Idee. Ich habe auf userid und artikelid ein Key gelegt. Jetzt kann ich nur noch ein Artikel in die Tabelle speichern obwohl ich zwei unterschiedliche genommen habe.

            Nochmals zur Erklärung

            User 1 legt folgende Artikel in die Tabelle

            • A
            • B
            • C

            User 2 legt ebenfalls folgende Artikel in die Tabelle

            • B
            • C

            User 1 entscheidet sich jetzt nochmals den Artikel A in die Tabelle zu legen, dann soll ein Update gemacht werden mit der neuen Anzahl + die Anzahl die bereits vorhanden ist.

            1. Hallo Achot,

              das war wohl keine gute Idee. Ich habe auf userid und artikelid ein Key gelegt. Jetzt kann ich nur noch ein Artikel in die Tabelle speichern obwohl ich zwei unterschiedliche genommen habe.

              Du hast aber schon einen Key über beide Spalten angelegt, oder?

              Gruß,
              Tobias

              1. Hallo Tobias,

                Du hast aber schon einen Key über beide Spalten angelegt, oder?

                eigentlich ja

                http://www.bilder-upload.eu/upload/713e9c-1483646788.jpg

                1. Hallo Achot,

                  Hallo Tobias,

                  Du hast aber schon einen Key über beide Spalten angelegt, oder?

                  eigentlich ja

                  http://www.bilder-upload.eu/upload/713e9c-1483646788.jpg

                  Wie sieht die Ausgabe von SHOW CREATE TABLE artikel_merken_temporaer aus? Über die Knöpfe kann man keinen Index über mehrere Spalten anlegen, das geht nur in dem Bereich "Indizes" unter der Tabelle.

                  Gruß,
                  Tobias

                  1. Hallo Tobias,

                    Wie sieht die Ausgabe von SHOW CREATE TABLE artikel_merken_temporaer aus? Über die Knöpfe kann man keinen Index über mehrere Spalten anlegen, das geht nur in dem Bereich "Indizes" unter der Tabelle.

                    also meine Tabelle schaut so aus

                    --
                    -- Tabellenstruktur für Tabelle `artikel_merken_temporaer`
                    --
                    
                    CREATE TABLE `artikel_merken_temporaer` (
                      `id` int(11) NOT NULL,
                      `userid` varchar(100) NOT NULL,
                      `artikelid` varchar(100) NOT NULL,
                      `menge` varchar(10) NOT NULL,
                      `datum` varchar(50) NOT NULL
                    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
                    
                    --
                    -- Indizes der exportierten Tabellen
                    --
                    
                    --
                    -- Indizes für die Tabelle `artikel_merken_temporaer`
                    --
                    ALTER TABLE `artikel_merken_temporaer`
                      ADD PRIMARY KEY (`id`),
                      ADD UNIQUE KEY `userid` (`userid`),
                      ADD UNIQUE KEY `artikelid` (`artikelid`);
                    
                    --
                    -- AUTO_INCREMENT für exportierte Tabellen
                    --
                    
                    --
                    -- AUTO_INCREMENT für Tabelle `artikel_merken_temporaer`
                    --
                    ALTER TABLE `artikel_merken_temporaer`
                      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
                    

                    Wenn ich dein SHOW CREATE TABLE artikel_merken_temporaer im Bereich SQL ausführe erhalte ich folgende Meldung / Design

                    Alternativ-Text

                    1. Tach!

                      ALTER TABLE `artikel_merken_temporaer`
                        ADD PRIMARY KEY (`id`),
                        ADD UNIQUE KEY `userid` (`userid`),
                        ADD UNIQUE KEY `artikelid` (`artikelid`);
                      

                      Das sind zwei Indexe über jeweils eine Spalte und nicht nur ein Index über zwei Spalten.

                      dedlfix.

                      1. Hallo,

                        ALTER TABLE `artikel_merken_temporaer`
                          ADD PRIMARY KEY (`id`),
                          ADD UNIQUE KEY `userid` (`userid`),
                          ADD UNIQUE KEY `artikelid` (`artikelid`);
                        

                        Das sind zwei Indexe über jeweils eine Spalte und nicht nur ein Index über zwei Spalten.

                        und wie schaffe ich es einen Index über beide Spalten zu legen? Und wie kann ich die bestehenden Indexe wieder löschen? Die Buttons sind deaktiviert.

                        1. Tach!

                          und wie schaffe ich es einen Index über beide Spalten zu legen? Und wie kann ich die bestehenden Indexe wieder löschen? Die Buttons sind deaktiviert.

                          Wurde bereits gesagt. Es gibt im phpMyAdmin eine Indexverwaltung abseits der Buttons. Wenn du es lieber als SQL-Statement haben möchtest, schau ins Handbuch, die Syntax hab ich nicht im Kopf.

                          dedlfix.

                    2. Hallo Achot,

                      ALTER TABLE `artikel_merken_temporaer`
                        ADD PRIMARY KEY (`id`),
                        ADD UNIQUE KEY `userid` (`userid`),
                        ADD UNIQUE KEY `artikelid` (`artikelid`);
                      
                      

                      Wie schon vermutet, du hast zwei unabhängige Keys für die Felder userid und artikelid, du brauchst einen Key für beide. Anlegen kannst du den entweder über phpMyAdmin oder direkt über den Query

                      ALTER TABLEADD UNIQUE KEY keyname (userid,artikelid)
                      

                      (keyname kannst du selbst vergeben).

                      Außerdem: es hat zwar nichts mit dem Problem zu tun aber warum sind die Felder userid, artikelid und menge vom Type varchar und nicht ein int-Typ? Und warum ist das Feld datum nicht vom Typ DATE (oder DATETIME wenn noch eine Zeit mit drinsteht)?

                      Gruß,
                      Tobias

                      1. Hallo,

                        Wie schon vermutet, du hast zwei unabhängige Keys für die Felder userid und artikelid, du brauchst einen Key für beide. Anlegen kannst du den entweder über phpMyAdmin oder direkt über den Query

                        ALTER TABLEADD UNIQUE KEY keyname (userid,artikelid)
                        

                        (keyname kannst du selbst vergeben).

                        Ok, ich habe die Tabelle nochmals neu angelegt und dein SQL Befehl ausgeführt. Jetzt sieht es so aus

                        --
                        -- Tabellenstruktur für Tabelle `artikel_merken_temporaer`
                        --
                        
                        CREATE TABLE `artikel_merken_temporaer` (
                          `id` int(11) NOT NULL,
                          `userid` int(100) NOT NULL,
                          `artikelid` int(100) NOT NULL,
                          `menge` int(10) NOT NULL,
                          `datum` date NOT NULL
                        ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
                        
                        --
                        -- Indizes der exportierten Tabellen
                        --
                        
                        --
                        -- Indizes für die Tabelle `artikel_merken_temporaer`
                        --
                        ALTER TABLE `artikel_merken_temporaer`
                          ADD PRIMARY KEY (`id`),
                          ADD UNIQUE KEY `artikelMerken` (`userid`,`artikelid`);
                        
                        --
                        -- AUTO_INCREMENT für exportierte Tabellen
                        --
                        
                        --
                        -- AUTO_INCREMENT für Tabelle `artikel_merken_temporaer`
                        --
                        ALTER TABLE `artikel_merken_temporaer`
                          MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
                        

                        Was hat dieser keyname zu bedeuten? Ich habe ihn jetzt einfach mal artikelMerken genannt.

                        Außerdem: es hat zwar nichts mit dem Problem zu tun aber warum sind die Felder userid, artikelid und menge vom Type varchar und nicht ein int-Typ? Und warum ist das Feld datum nicht vom Typ DATE (oder DATETIME wenn noch eine Zeit mit drinsteht)?

                        Habe ich ebenfalls verbessert. Wollte erst einmal schauen ob es funktioniert.

                        1. Hallo und guten Abend,

                          Ok, ich habe die Tabelle nochmals neu angelegt und dein SQL Befehl ausgeführt. Jetzt sieht es so aus

                          nur zur Info: Drop Index

                          Grüße
                          TS

                          --
                          es wachse der Freifunk
                          http://freifunk-oberharz.de
                        2. Hallo Achot,

                          Was hat dieser keyname zu bedeuten? Ich habe ihn jetzt einfach mal artikelMerken genannt.

                          Normal wirst du den Namen des Keys nicht brauchen, deswegen ist es nicht so wichtig wie er genau heißt :-)

                          Gruß,
                          Tobias

                          1. Hallo Tobias,

                            Normal wirst du den Namen des Keys nicht brauchen, deswegen ist es nicht so wichtig wie er genau heißt

                            OK :-) Ich habe jetzt zwei Artikel in die Tabelle gelegt und wollte den ersten noch einmal rein legen, ging zum Glück nicht. Ich denke jetzt kommt ON DUPLICATE KEY UPDATE ins Spiel? http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html Muss ich mal schauen, wie ich dieses in meinen Code einbauen kann.

                            1. Ich verstehe leider nicht wie ich das auf meinen Code übertragen kann und dazu kommt, dass mein Englisch nicht das beste ist. Werde wohl über mehrere Abfrage nicht drumherum kommen. Danke für deine Hilfe.

                              1. Hallo,

                                hab doch noch eine erste Lösung gefunden

                                INSERT INTO artikel_merken_temporaer 
                                	(userid, artikelid, menge, datum) 
                                		VALUES ('U01', 'A1', '3', '1483651824')
                                ON DUPLICATE KEY UPDATE artikelid = 'A1', menge = '5';
                                

                                Was ich aber nicht verstehe ist, wie bekomme ich beim ON den neuen Wert in die menge? Er soll ja den Wert der aktuell im Feld steht nehmen und den neuen Wert hinzufügen?

                                1. Hallo und guten Morgen,

                                  Hallo,

                                  hab doch noch eine erste Lösung gefunden

                                  INSERT INTO artikel_merken_temporaer 
                                  	(userid, artikelid, menge, datum) 
                                  		VALUES ('U01', 'A1', '3', '1483651824')
                                  ON DUPLICATE KEY UPDATE artikelid = 'A1', menge = '5';
                                  

                                  Was ich aber nicht verstehe ist, wie bekomme ich beim ON den neuen Wert in die menge? Er soll ja den Wert der aktuell im Feld steht nehmen und den neuen Wert hinzufügen?

                                  Wie sieht denn ein normales Udate aus, das einen Wert inkrementiert?

                                  Update TABELLE set SPALTE = SPALTE + 1 where id = 3544;

                                  Das musst Du nun nur mit deinem Insert kombinieren.
                                  Grüße
                                  TS

                                  --
                                  es wachse der Freifunk
                                  http://freifunk-oberharz.de
                                  1. Hallo,

                                    Wie sieht denn ein normales Udate aus, das einen Wert inkrementiert?

                                    Update TABELLE set SPALTE = SPALTE + 1 where id = 3544;

                                    ich dachte erst so

                                    INSERT INTO artikel_merken_temporaer 
                                    	(userid, artikelid, menge, datum) 
                                    		VALUES ('U01', 'A1', '3', '1483651824')
                                    ON DUPLICATE KEY UPDATE artikelid = 'A1', menge = '5';
                                    UPDATE artikel_merken_temporaer SET menge=menge+5 WHERE id=1;
                                    

                                    Dadurch wird ein neuer Datensatz in der Tabelle angelegt, was nicht der Sinn ist.

                                    Auf http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html hier steht da Update ganz zum Schluss wie ich es auch habe.

                                    1. Hallo und gute Nacht ,

                                      Wie sieht denn ein normales Udate aus, das einen Wert inkrementiert?

                                      Update TABELLE set SPALTE = SPALTE + 1 where id = 3544;

                                      ich dachte erst so

                                      INSERT INTO artikel_merken_temporaer 
                                      	(userid, artikelid, menge, datum) 
                                      		VALUES ('U01', 'A1', 3, '1483651824')
                                          ON DUPLICATE KEY UPDATE set menge = menge + 3, datum = '1483651824';
                                      
                                      

                                      Der Datensatz ist doch schon identifiziert durch den Kombinationsschlüssel.

                                      Grüße
                                      TS

                                      --
                                      es wachse der Freifunk
                                      http://freifunk-oberharz.de
                                      1. Hallo,

                                        INSERT INTO artikel_merken_temporaer 
                                        	(userid, artikelid, menge, datum) 
                                        		VALUES ('U01', 'A1', 3, '1483651824')
                                            ON DUPLICATE KEY UPDATE set menge = menge + 3, datum = '1483651824';
                                        
                                        

                                        Der Datensatz ist doch schon identifiziert durch den Kombinationsschlüssel.

                                        da bekomme ich leider einen Fehler

                                        #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'set menge = menge + 2, datum = '1483651824' in Zeile 4

                                        1. Hallo und guten Morgen,

                                          Hallo,

                                          INSERT INTO artikel_merken_temporaer 
                                          	(userid, artikelid, menge, datum) 
                                          		VALUES ('U01', 'A1', 3, '1483651824')
                                              ON DUPLICATE KEY UPDATE set menge = menge + 3, datum = '1483651824';
                                          
                                          

                                          Der Datensatz ist doch schon identifiziert durch den Kombinationsschlüssel.

                                          da bekomme ich leider einen Fehler

                                          #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'set menge = menge + 2, datum = '1483651824' in Zeile 4

                                          Das SET ist zuviel. Sorry.

                                          Grüße
                                          TS

                                          --
                                          es wachse der Freifunk
                                          http://freifunk-oberharz.de
                                          1. Hallo,

                                            Das SET ist zuviel. Sorry.

                                            VIELEN Dank! Du hast mir die Nacht gerettet. Es funktioniert zumindest im phpMyAdmin. Später, schau ich mal wie ich dieses in meinen oben genannten Code bekomme.

                                            Danke nochmals für deine Hilfe und Geduld.

                                            1. Hallo und gute Nacht,

                                              Danke nochmals für deine Hilfe und Geduld.

                                              Gerne geschehen.

                                              Vergiss das Escapen nicht!

                                              Grüße
                                              TS

                                              --
                                              es wachse der Freifunk
                                              http://freifunk-oberharz.de
                                              1. Hallo,

                                                Vergiss das Escapen nicht!

                                                wenn ich $mysqli->prepare nutze, wird das Escapen doch intern erledigt ohne dass ich mich selber darum kümmern muss?

                                                1. Hallo und guten Morgen,

                                                  Vergiss das Escapen nicht!

                                                  wenn ich $mysqli->prepare nutze, wird das Escapen doch intern erledigt ohne dass ich mich selber darum kümmern muss?

                                                  Ja.

                                                  Grüße
                                                  TS

                                                  --
                                                  es wachse der Freifunk
                                                  http://freifunk-oberharz.de
                                                2. Tach!

                                                  Vergiss das Escapen nicht!

                                                  wenn ich $mysqli->prepare nutze, wird das Escapen doch intern erledigt ohne dass ich mich selber darum kümmern muss?

                                                  Nein. Wenn du Prepared Statements verwendest, ist ein Escapen prinzipbedingt nicht notwendig, wenn man sie per Bind übergibt.

                                                  Du kannst zwar die Werte auch weiterhin ins Statement einbauen - und dann müssen sie wie üblich maskiert werden - oder gar ein gemischtes Statement erstellen, aber dann wäre der Vorteil weg.

                                                  Wenn du lediglich die Menge erhöhen und keine weiteren Werte ändern möchtest, dann kannst du die Formel spalte = spalte + 1 auch direkt notieren und musst nichts zusätzliches maskieren, was nicht schon vor dem Umbau des Statements maskiert war.

                                                  dedlfix.

                                                  1. Hallo,

                                                    ich habe es jetzt so umgesetzt. Gibt es daran etwas auszusetzen?

                                                    if(isset($_POST['artikel_merken'])){
                                                    
                                                     if ($stmt = $mysqli->prepare("INSERT INTO artikel_merken_temporaer (userid, artikelid, menge, datum) 
                                                    	                VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE menge = menge + VALUES(menge) ")) { 
                                                    	    
                                                       $userid  	 = $user->id;
                                                       $artikelid    = $artikel;
                                                       $menge  	 = $_POST["menge"];
                                                       $datum	 = time();      
                                                    	      
                                                     $stmt->bind_param("ssss", $userid, $artikelid, $menge, $datum);
                                                     $stmt->execute();
                                                    
                                                     $_SESSION['success_merken'] = 1;
                                                     
                                                    header("Location: artikel.php?kat=$kategorie&artikel=$artikel#succes");
                                                    exit;		
                                                    
                                                    } else {
                                                      echo $mysqli -> error;
                                                     }
                                                    }
                                                    
                                                    1. Tach!

                                                      ich habe es jetzt so umgesetzt. Gibt es daran etwas auszusetzen?

                                                      Nur eine Kleinigkeit, oder zwei.

                                                      $_SESSION['success_merken'] = 1;

                                                      Natürlich merkt man sich in Variablen (auch in Session-Variablen) Werte. Das ist so essenziell, dass man nicht dazuschreiben muss, dass man sich sich dort was merkt. Es reicht also, den Eintrag nur success zu benennen. Zudem sieht mir das nach einem booleschen Wert true/false aus und nicht danach, dass man 1 bis viele Status auseinanderhalten soll. Also nimm lieber ein true statt einer 1, das drückt die Intention besser aus als ein Zahlenwert.

                                                      header("Location: artikel.php?kat=$kategorie&artikel=$artikel#succes");

                                                      Die URL ist ein Kontext mit bestimmten Regeln. Will man dort Werte einfügen, muss man sich an die Regel halten, damit diese unbeschadet am Ende ankommen. $kategorie und $artikel müssen URL-kodiert werden. urlencode() oder rawurlencode() kannst du dafür nehmen (an der Stelle ist urlencode() richtiger, aber rawurlencode() passt da auch).

                                                      dedlfix.

                                                    2. Hi,

                                                       if ($stmt = $mysqli->prepare("INSERT INTO artikel_merken_temporaer (userid, artikelid, menge, datum) 
                                                      	                VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE menge = menge + VALUES(menge) ")) { 
                                                      

                                                      was soll VALUES(menge) an der Stelle?

                                                      Gibt es eine Funktion VALUES() in MySQL?

                                                      Außerdem willst Du doch eher einen anderen (von außen in das prepared-Statement einzubindenden) Wert zur Spalte Menge addieren als den Inhalt der Spalte ...

                                                      cu,
                                                      Andreas a/k/a MudGuard

                                                      1. Tach!

                                                         if ($stmt = $mysqli->prepare("INSERT INTO artikel_merken_temporaer (userid, artikelid, menge, datum) 
                                                        	                VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE menge = menge + VALUES(menge) ")) { 
                                                        

                                                        was soll VALUES(menge) an der Stelle?

                                                        Es nimmt den neuen, übergebenen Wert und nicht den bereits vorhandenen Wert in der Spalte.

                                                        Gibt es eine Funktion VALUES() in MySQL?

                                                        Ja.

                                                        Außerdem willst Du doch eher einen anderen (von außen in das prepared-Statement einzubindenden) Wert zur Spalte Menge addieren als den Inhalt der Spalte ...

                                                        Genau das macht er damit. Man muss den Wert nicht zweimal binden.

                                                        dedlfix.

                                                      2. Hi,

                                                        was soll VALUES(menge) an der Stelle?

                                                        Ich ziehe alles zurück - damit greift man auf die Spalte aus den VALUES des INSERTs zu. Sorry, hätte zuerst ins Handbuch gucken sollen.

                                                        cu,
                                                        Andreas a/k/a MudGuard

                  2. Hallo und guten Morgen,

                    Wie sieht die Ausgabe von SHOW CREATE TABLE artikel_merken_temporaer aus? Über die Knöpfe kann man keinen Index über mehrere Spalten anlegen, das geht nur in dem Bereich "Indizes" unter der Tabelle.

                    Da empehle ich neben dem Erlernen der MySQL-Syntax (ich übe auch noch) den Einsatz von Heidi SQL. Das GUI ist inzwischen wirklich gut.

                    Grüße
                    TS

                    --
                    es wachse der Freifunk
                    http://freifunk-oberharz.de
                    1. Hallo und guten Abend*,

                      Da empehle ich neben dem Erlernen der MySQL-Syntax (ich übe auch noch) den Einsatz von Heidi SQL. Das GUI ist inzwischen wirklich gut.

                      von Heidi SQL habe ich auch schon gehört. Allerdings muss die Datenbank nach außen offen sein was viele Anbieter nicht erlauben? Oder verwechsel ich da jetzt etwas?

                      • bei mir ist es derzeit 22:12, deshalb guten Abend :)
                      1. Hallo und guten Abend,

                        Hallo und guten Abend*,

                        Da empehle ich neben dem Erlernen der MySQL-Syntax (ich übe auch noch) den Einsatz von Heidi SQL. Das GUI ist inzwischen wirklich gut.

                        von Heidi SQL habe ich auch schon gehört. Allerdings muss die Datenbank nach außen offen sein was viele Anbieter nicht erlauben? Oder verwechsel ich da jetzt etwas?

                        • bei mir ist es derzeit 22:12, deshalb guten Abend :)

                        Tablet und begrenzte Sicht, weil ich für meine dicken Finger eine große Tastatur benötige...

                        Ja, das mit dem Port stimmt. Ich habe mir dafür aber einen eigenen User mit beschränkten Rechten angelegt und über den Port geht nur SSL. Heidi verwaltet den Private Key. Und fail2ban bewacht das MySQL-Error-Log, das ich für Fehlanmeldungen eingerichtet habe.

                        Aber zum Üben geht das ja auch lokal mit XAMPP und Heidi.

                        Übers Netz benutze ich meistens den original MySQL-Client in der Remote-Konsole von PuTTY oder JuiceSSH.

                        Grüße
                        TS

                        --
                        es wachse der Freifunk
                        http://freifunk-oberharz.de
                        1. Da empehle ich neben dem Erlernen der MySQL-Syntax (ich übe auch noch) den Einsatz von Heidi SQL. Das GUI ist inzwischen wirklich gut.

                          von Heidi SQL habe ich auch schon gehört. Allerdings muss die Datenbank nach außen offen sein was viele Anbieter nicht erlauben? Oder verwechsel ich da jetzt etwas?

                          Ja, das mit dem Port stimmt. Ich habe mir dafür aber einen eigenen User mit beschränkten Rechten angelegt und über den Port geht nur SSL. Heidi verwaltet den Private Key. Und fail2ban bewacht das MySQL-Error-Log, das ich für Fehlanmeldungen eingerichtet habe.

                          Übers Netz benutze ich meistens den original MySQL-Client in der Remote-Konsole von PuTTY oder JuiceSSH.

                          Ich kann den Hype für sowas wie Heidi-SQL nicht ganz nachvollziehen. Es ist m.E. einfacher (und dadurch tendentiell sicherer), einen phpMyAdmin hinter ein SSL-geschütztes HTAUTH + Login zu legen. Der phpMyAdmin bietet mir alles, was ich in einer DB-Gui brauche. Für große Datenmengen / Admin-Aufgaben verwendet man direkt den MySQL-Client via SSH, klar.

                          Last, but not least: den phpMyAdmin kann ich direkt, ohne Installations- und Konfigurationswand beim Client sofort benutzen.

                          1. Hallo und guten Abend,

                            Ich kann den Hype für sowas wie Heidi-SQL nicht ganz nachvollziehen. Es ist m.E. einfacher (und dadurch tendentiell sicherer), einen phpMyAdmin hinter ein SSL-geschütztes HTAUTH + Login zu legen. Der phpMyAdmin bietet mir alles, was ich in einer DB-Gui brauche. Für große Datenmengen / Admin-Aufgaben verwendet man direkt den MySQL-Client via SSH, klar.

                            Last, but not least: den phpMyAdmin kann ich direkt, ohne Installations- und Konfigurationswand beim Client sofort benutzen.

                            Es ist aber eine monströse PHP-Anwendung, die augrund ihrer Bauart (meistens) Kontrolle über den gesamten Host übernehmen kann. Das kann mein Heidi nicht. Da kann ich dem User XY beruhigt eine Version auf seinen Facharbeitsplatzrechner montieren und ein passendes Grant einrichten.

                            Grüße
                            TS

                            --
                            es wachse der Freifunk
                            http://freifunk-oberharz.de
                            1. [...] Last, but not least: den phpMyAdmin kann ich direkt, ohne Installations- und Konfigurationswand beim Client sofort benutzen.

                              Es ist aber eine monströse PHP-Anwendung, die augrund ihrer Bauart (meistens) Kontrolle über den gesamten Host übernehmen kann.

                              Mag sein, deshalb ja: "hinter ein SSL-geschütztes HTAUTH + Login legen".

                              Das kann mein Heidi nicht. Da kann ich dem User XY beruhigt eine Version auf seinen Facharbeitsplatzrechner montieren und ein passendes Grant einrichten.

                              OK, Du hast einen Anwendungsfall, wo es stimmig sein mag und Du hast es durch den gesonderten User gut abgesichert. Moment... Apropos... Wenn Du es so machst, dann brauchst Du den Mysql-Port doch gar nicht zu öffnen und kannst einfach über die SSH-Verbindung tunneln?!

                              Dann wäre nämlich auch ein weiteres Problem an Deinem Setup behoben: der Mysqld selbst kann einen Bug haben. Wenn der Port zu bleibt, fällt der Angriffsvektor dafür schonmal weg.

                              Wie auch immer: man kann das schon so machen, aber eine generelle Empfehlung würde nicht aussprechen wollen, gerade nicht hier im Forum.

                              1. Hallo und gute Nacht,

                                Worauf soll ich denn Tunneln, wenn nicht auf einen Port?

                                und Du meinst, dass ein phpMyAdmin sicherer ist, als eine spezifizierte Anwendung, die über einen Port nur spezielle Dinge tun kann?

                                Grüße
                                TS

                                --
                                es wachse der Freifunk
                                http://freifunk-oberharz.de
                                1. Worauf soll ich denn Tunneln, wenn nicht auf einen Port?

                                  Auf die schnelle gegoogelt.

                                  und Du meinst, dass ein phpMyAdmin sicherer ist, als eine spezifizierte Anwendung, die über einen Port nur spezielle Dinge tun kann?

                                  Du verdrehst meine Aussagen. Ich habe gesagt, dass Dein Setup nicht zur generellen Empfehlung geeignet ist, weil es im Setup komplexer als mein Vorschlag und damit per Definition schon fehleranfälliger ist. Es mag für Dein Szenario "mit Deinen Usern" sinnvoll sein. Die potentielle Anfälligkeit eines Monsters wie phpMyAdmin, lässt sich, wie ich schon schrieb, gut absichern.

                                  Dein Setup reißt hingegen durch den offenen Mysql-Port derzeit zusätzlich eine potentielle Lücke. Aber das kannst Du mit dem Tunnel beheben.

                                  1. Hallo und guten Morgen,

                                    Dein Setup reißt hingegen durch den offenen Mysql-Port derzeit zusätzlich eine potentielle Lücke. Aber das kannst Du mit dem Tunnel beheben.

                                    Ok, einverstanden.

                                    Aber ohne Aufsicht von fail2ban nebst recidive (∞) würde ich den Port auch nicht lassen. Seitdem ich an einer Bewertungsplattform arbeite, wird die Datenbank immer begehrter ;-O

                                    Grüße
                                    TS

                                    --
                                    es wachse der Freifunk
                                    http://freifunk-oberharz.de
          2. richtig, ein User kann nur einmal einen jeweiligen Artikel anlegen. Ein anderer User kann natürlich den gleichen Artikel wiederum anlegen.

            Wie meinen? Für einen Artikel gibt es so viele Stammsätze, wie es User gibt? Das kann nur dann funktionieren, wenn jeder User seinen eigenen Bestand hat. Zum Beispiel in seinem Werkstattwagen.

            Aber ich würde einen Werkstattwagen eher als Lager betrachten, nicht als das persönliche Eigentum eines Users.

            Dein Konzept ist überhaupt nicht rübergekommen.

            Linuchs

            1. Hallo,

              Dein Konzept ist überhaupt nicht rübergekommen.

              Ich weiß nicht was daran nicht zu verstehen ist.

              Ein Artikel kann von mehreren Usern gemerkt werden, in einem Shop ist dieses mit einem Warenkorb zu vergleichen. Wenn ich bei eBay einen Artikel mehrfach in den Warenkorb lege wird nur die Anzahl erhöht und nicht jeder Artikel mehrmals abgelegt.

              Genau dieses möchte ich auch erreichen.

  2. Lieber Achot,

    deine Beschreibung ist für mich nicht nachvollziehbar: "Wenn nicht gefunden wird, einfach ein normales Update." Ein update kann man nur auf vorhandene, also gefundene Datensätze anwenden, sonst wäre es ein insert.

    Habe ich es richtig verstanden, dass du Warenzugänge buchen möchtest, und die artikelid neu anlegen, falls in der EDV noch nicht vorhanden?

    Dann ist es ein Denkfehler, den Bestand = Wareneingangsmenge zu setzen, es könnte schon ein (der EDV unbekannter) Bestand im Lager sein.

    Kenne deine Anwendung nicht, aber es scheint kein professionell geführtes Lager zu sein.

    Zugänge und Entnahmen speichert man nicht (nur) als Bestandsänderung, sondern (auch) als Buchungssätze, damit es nachvollziehbar bleibt.

    Linuchs

    1. Hallo Linuchs,

      Habe ich es richtig verstanden, dass du Warenzugänge buchen möchtest, und die artikelid neu anlegen, falls in der EDV noch nicht vorhanden?

      leider hast du es nicht richtig verstanden bzw. ich habe es falsch erklärt. In meiner Datenbank gibt es ein paar Artikel die sich ein User merken kann. Dazu die Stückzahl wie viel er davon möchte.

      Wenn ein User sich ein Artikel bereits in die Tabelle gelegt hat, diesen aber nochmals möchte, sollen nicht wie jetzt zwei Einträge vorhanden sein sondern sich der bereits in der Datenbank hinterlegte Artikel geupdatet werden.

      1. leider hast du es nicht richtig verstanden bzw. ich habe es falsch erklärt. In meiner Datenbank gibt es ein paar Artikel die sich ein User merken kann. Dazu die Stückzahl wie viel er davon möchte.

        Wenn ein User sich ein Artikel bereits in die Tabelle gelegt hat, diesen aber nochmals möchte, sollen nicht wie jetzt zwei Einträge vorhanden sein sondern sich der bereits in der Datenbank hinterlegte Artikel geupdatet werden.

        Okay, dann geht es um das Anlegen und Korrigieren einer Bestellung? Der Begriff "user" (= firmen-mitarbeiter) hat mich verwirrt, ich hätte den Begriff "kunde" gewählt.

        1. Hallo,

          Okay, dann geht es um das Anlegen und Korrigieren einer Bestellung? Der Begriff "user" (= firmen-mitarbeiter) hat mich verwirrt, ich hätte den Begriff "kunde" gewählt.

          genau :) Nur bei mir kann man nichts bestellen, wie man es von einem Shop gewohnt ist sondern dieses passiert nur intern auf dem jeweiligen Profil.