2012-04-05 5 views
2

Hallo Ich bin Latitude, Longitude Werte in die Datenbank einfügen. Verhindern doppelte Werte in Mysql-Datenbank - wenn bestimmte Spalten ähnlich der zuletzt eingefügten Zeile sind

INSERT INTO `Tracks` (`Latitude`, `Longitude`, `Time`, `Date`, `Speed`) VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed'); 

Der GPS-Empfänger neigt .. die gleichen lat, long-Werte mehr als einmal senden Vor dem Einsetzen, versuche ich die lat langen Spalten der letzten eingefügten Zeile zu überprüfen, und wenn sie übereinstimmen, die Abfrage sollte nicht ausgeführt werden. Sonst sollte die Abfrage ausgeführt werden. Das kann ich momentan nicht! Was ist, wenn keine Zeilen in der Datenbank vorhanden sind und der Code nach der zuletzt eingefügten Zeile sucht?

Auch der Benutzer kann zu einem späteren Zeitpunkt wieder an den gleichen Ort kommen und daher sollten wir nicht die gesamte db für doppelte lat, lange Werte überprüfen. Wie soll ich das dann machen? Kann ich das in PHP selbst machen, ohne die db zu überprüfen? Irgendwelche Ideen/Vorschläge? Danke im Voraus!

+3

Ich würde dies in PHP tun, wie Sie vorgeschlagen. Wenn Sie eine Sitzung haben, speichern Sie einfach den letzten Wert dort. –

+2

Hey, wie soll ich das machen? So was?if ($ _ SESSION ['Latitude'] == $ Latitude && $ _SESSION ['Längengrad'] == $ Längengrad) {$ _SESSION ['Latitude'] = $ Latitude; $ _SESSION ['Längengrad'] = $ Längengrad; } sonst {query} was ist der Anfangswert von $ _SESSION ['Latitude'] und $ _SESSION ['Longitude'] .. ?? – Karthick

+2

Dieser Code ist in Ordnung. Anfangs ist der Wert nicht definiert (NULL). Setzen Sie nach der Abfrage auch die Sitzungsvariable. –

Antwort

1

Wenn Sie MySQL verwenden, eine Sache, die ich denken kann, ist

INSERT INTO Tracks ( Latitude , Longitude , Zeit , Geschwindigkeit ) > VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed');

in

INSERT IGNORE INTO Tracks zu ändern ( Breitengrad , Longitude , Zeit , Geschwindigkeit ) > VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed');

Und ein PRIMARY KEY mit den zwei Feldern (Breite und Länge) einstellen.

Da Sie angegeben without checking the db ist die einzige Lösung, die ich mir vorstellen kann. Wenn Sie versuchen, ein gleiches Paar Langitude, LatitudeINSERT IGNORE Anweisung wird nur ignoriert werden.

+0

ja! Aber wenn der Benutzer nach einiger Zeit an den gleichen Ort kommt, kann ich versuchen, die gleichen lat langen Werte einzufügen. In diesem Fall müssen die Werte eingefügt werden und sollten nicht ignoriert werden! – Karthick

+1

Dies kann durch Hinzufügen eines Felds zum Primärschlüssel umgangen werden, z. B. Hacing Lat, Long und Date, verhindert, dass Duplikate am selben Tag erstellt werden. – StormByte

0

Kann ich dies in PHP selbst tun, ohne die db zu überprüfen?

Wenn Sie überprüfen möchten, ob der Wert bereits vorhanden ist, müssen Sie die Datenbank auf die eine oder andere Weise abfragen.

Sie können eine SELECT auf den letzten Datensatz und vergleichen Sie den Wert in PHP, oder Sie können versuchen, den Wert in die Datenbank einfügen und wenn der Wert bereits vorhanden ist, wählen Sie die Einfügung zu ignorieren.

+0

no. Wir können versuchen, die lat langen Werte in eine temporäre PHP-Variable zu setzen und sie gegen die neuen Lat-Long-Werte zu prüfen. Wenn sie übereinstimmen, wird die Abfrage nicht ausgeführt. Das einzige Problem hier ist, wie würde ich die temporären Variablen initialisieren ?! – Karthick

0

Verwenden Sie anstelle des Einsatzes REPLACE. Sie müssen die Spalte erstellen, die eindeutig in der Datenbank eindeutig sein muss.

Darüber hinaus ist die Art, wie Sie MySQL verwenden, ein großes Sicherheitsrisiko. Das Mindeste, was Sie tun können, ist mysql_real_escape_string. Noch besser ist es, vorbereitete Aussagen zu betrachten.

+0

Die Tabelle muss nicht eindeutig sein ... U kann beliebig oft an dieselbe Stelle kommen. Wenn die Spalte einzigartig ist ... würde sie sagen, dass Sie nur einmal an den Ort gekommen sind ... – Karthick

Verwandte Themen