Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Doppelter Eintrag vermeiden in Datenbank    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
thorsten
Mitglied
Neuling


Dabei seit: 06.05.2018
Herkunft:
Posts: 3
     Doppelter Eintrag vermeiden in Datenbank Zitat | Bearbeiten

Hallo erstmal,

Ich bin mir sicher das ich hier richtig bin mit meiner Frage, ...!

Also ich bin noch ein Neuling in sachen PHP und SQL und brauche mal einen Gedankenanstoss oder ein bisschen Hilfe bei meinem Vorhaben.

Zuerstmal den Script:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<?php

try {
    
$conn = new PDO("mysql:host=$servername;dbname=$dbname"$username$password);
    
$conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    
$sql "INSERT INTO history (trackimg, artist, title, date, time, year, monthly, day)
    VALUES ('
$trackimg', '$artist', '$title', '$date', '$time', '$year', '$monthly', $day)";
    
$conn->exec($sql);
    
$last_id $conn->lastInsertId();
    echo 
"New record created successfully. Last inserted ID is: " $last_id;
    }
catch(
PDOException $e)
    {
    echo 
$sql "<br>" $e->getMessage();
    }    
$conn null;


Soweit funktioniert alles perfekt, aber bei jeden cronjob request wird der Eintrag wiederholt und alles landet mehrfach in der Datenbank.
Kann mir bitte jemand helfen um dieses kleine Problem zu beseitigen?

Gruss
Thorsten

Grund des Bearbeitens: Code formatiert und schön gemacht.




Post wurde schon 1x editiert, das letzte mal am 17.03.2019 um 00:30 von Htaccess
10.03.2019, 10:35 Profil | PM | E-Mail  
asdf
Mitglied
Guter User


Dabei seit: 26.10.2009
Herkunft: keine Angabe
Posts: 420
      Zitat | Bearbeiten

Verstehe ich das richtig, du willst nur einen Eintrag und dieser soll sich immer aktualisieren? Dann müsstest du nur einmalig "INSERT INTO" SQL-Befehl ausführen (oder manuell erstellen) und anschliessend mit "UPDATE" dieser Eintrag aktualisieren.


10.03.2019, 11:06 Profil | PM | E-Mail  
Htaccess
Mitglied
Sehr guter User


Dabei seit: 22.08.2010
Herkunft: Deutschland
Posts: 699
      Zitat | Bearbeiten

Guten Abend thorsten,

wenn ich das richtig verstanden habe, möchtest du einen Verlauf der zuletzt abgespielten Songs in deine Datenbank eintragen und dieses Script soll sich sekündlich als Cronjob wiederholen.

Als Gedankenanstoss gebe ich dir mit, dass du eine Überprüfung machen solltest, welches der letzte Eintrag in der Datenbank war. Dies machst du am besten damit, indem du zwei Arrays miteinander vergleichst.

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
<?php

/**
 * Hinweis: Dieser Code ist ungetestet, da im Ausgangspost nicht der komplette Code veröffentlicht worden ist.
 */
$track = array(
  
'trackimg' => $trackimg,
  
'artist' => $artist,
  
'title' => $title,
);

try {
  
$conn = new PDO("mysql:host=$servername;dbname=$dbname"$username$password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
  
$conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

  
$q $conn->query('SELECT trackimg, artist, title FROM history ORDER BY history_id DESC LIMIT 1');
  
$last_row $q->fetchAll();

  if (
array_diff($track$last_row[0]) == null) {
    
$ins $conn->prepare("INSERT INTO history (trackimg, artist, title) VALUES (?, ?, ?)");

    if (
$ins->execute(array($track['trackimg'], $track['artist'], $track['title']))) {
      echo 
"New record created. Last inserted ID is: " $conn->lastInsertId();
    }
  }
} catch(
PDOException $e) {
  die(
'Error occurred: ' $e->getMessage());
}
Des weiteren gebe ich dir mit, dass du dir nochmal Gedanken über deine Datenbank machen solltest, da du Einträge mit multiplen Daten speicherst. Ich spreche hier explizit von date, time, year, monthly, day. Sinnvoller wäre es, wenn du einen timestamp in die Datenbank speicherst und nach dieser sortierst. Wenn du diese in deiner Oberfläche ausgeben möchtest, kannst du die DateTime Klasse verwenden. Dies wäre sinnvoller und auch effizienter


LG
Htaccess




Post wurde schon 6x editiert, das letzte mal am 18.03.2019 um 02:59 von Htaccess
17.03.2019, 01:26 Profil | PM | E-Mail  
thorsten
Mitglied
Neuling


Dabei seit: 06.05.2018
Herkunft:
Posts: 3
      Zitat | Bearbeiten

Hallo erstmal htaccess,

Zu der Datum und Zeit in der Datenbank ist deine Idee besser, man lernt eben nicht aus und danke dazu.
Und zu deiner PDO und Funktion sieht es ganz gut aus, aber die Songeintraege rasseln immer noch mehrfach in die Datenbank.
Kann ich nochmal deine Hilfe mit Kniefall in Anspruch nehmen?


15.04.2019, 17:11 Profil | PM | E-Mail  
Htaccess
Mitglied
Sehr guter User


Dabei seit: 22.08.2010
Herkunft: Deutschland
Posts: 699
      Zitat | Bearbeiten

Hallo thorsten,

natürlich kannst du meine Hilfe in Anspruch nehmen. Zu deinem Problem: Meistens hilft es, wenn man den Code debuggen tut. Meiner Annahme nach, wäre es sinnvoll, wenn du nachfolgenden Code hinzufügst und die Ausgaben hier dann postest:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
<?php 

/** 
 * Hinweis: Dieser Code ist ungetestet, da im Ausgangspost nicht der komplette Code veröffentlicht worden ist. 
 */ 
$track = array( 
  
'trackimg' => $trackimg
  
'artist' => $artist
  
'title' => $title
); 

try { 
  
$conn = new PDO("mysql:host=$servername;dbname=$dbname"$username$password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); 
  
$conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 

  
$q $conn->query('SELECT trackimg, artist, title FROM history ORDER BY history_id DESC LIMIT 1'); 
  
$last_row $q->fetchAll();

  
// Debugging lines
  
printf('$track result:<br /><pre>%s</pre>'print_r($tracktrue));
  
printf('$last_row result:<br /><pre>%s</pre>'print_r($last_rowtrue));
  
printf('array_diff result:<br /><pre>%s</pre>'print_r(array_diff($track$last_row[0]), true));

  
/**
   * Temporarily disabled for debugging
   *
   * if (array_diff($track, $last_row[0]) == null) { 
   *    $ins = $conn->prepare("INSERT INTO history (trackimg, artist, title) VALUES (?, ?, ?)"); 
   *
   *    if ($ins->execute(array($track['trackimg'], $track['artist'], $track['title']))) { 
   *      echo "New record created. Last inserted ID is: " . $conn->lastInsertId(); 
   *    } 
   *  }
   */
} catch(PDOException $e) { 
  die(
'Error occurred: ' $e->getMessage()); 
}



30.04.2019, 12:24 Profil | PM | E-Mail  
thorsten
Mitglied
Neuling


Dabei seit: 06.05.2018
Herkunft:
Posts: 3
      Zitat | Bearbeiten

Danke Dir erstmal fuer deinen Einsatz, aber Moeglichkeiten gibt es viele und somit habe ich es so gemacht.

INSERT INTO history SET artist='$artist', title='$title'";

Datum und Zeit geht ueber die Timestamp von MySQL.

und die Error Meldung ausgeschaltet

Habe nun keine doppelten Eintrag mehr, ;-) freu mir wie Bolle ;-)






Post wurde schon 2x editiert, das letzte mal am 29.05.2019 um 20:10 von thorsten
29.05.2019, 20:05 Profil | PM | E-Mail  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2617
      Zitat | Bearbeiten

Die wohl richtige Frage ist, woher kommen die Variablen? Je nach dem woher sie kommen kann man dort etwas machen und entsprechende Überprüfungen einbauen, damit kein Eintrag in die Datenbank gemacht wird.

Jedoch wärs wohl sinnvoller, einfach die Datenbank abzufragen ob einen Eintrag mit den entsprechenden Daten bereits existiert (`SELECT` Abfrage) und dann sofern kein Eintrag existiert, ein `INSERT INTO` durchzuführen.

Man könnte auch ein Unique Index über die Felder anlegen und dann einfach die Fehler beim schreiben in die Datenbank ignorieren. Da der Index eindeutig sein muss, wird beim schreiben der selben Daten ein Fehler erzeugt, der ignoriert werden kann (PostgreSQL hat da eine weitaus bessere Lösung als MySQL-Varianten).

Ich denke, wenn du uns mehr Einblick in dein Script geben könntest, könnten wir dir eine Lösung präsentieren.


31.05.2019, 22:26 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Doppelter Eintrag vermeiden in Datenbank   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz