php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 14-01-2015, 09:03
Peh4pe
 Registrierter Benutzer
Links : Onlinestatus : Peh4pe ist offline
Registriert seit: Nov 2011
Beiträge: 41
Peh4pe befindet sich auf einem aufstrebenden Ast
Standard Dubletten anhand von longtext finden

Einen Guten Morgen wünsche ich!!

Meine Situation:
Ich möchte über ein cronjob mehrere hundert Datensätze täglich in eine Tabelle schreiben. Ein Datensatz besteht unter anderem aus einem Longtext (einer description), einem Titel und einer zugehörigen location (PLZ und Ort). Es kann nun vorkommen, dass Titel und location gleich sind, jedoch die description verschieden ist. Es bleibt mir also leider nichts übrig als vor jedem Insert zu prüfen, ob diese description bereits vorhanden ist. Problem ist, dass jeweils mehrere tausende Datensätze verglichen werden müssen und das dauert bei der Prüfung ewig denke ich...

Meine Frage:
Wie prüft man sowas am besten?
Oder bleibt mir nur eine Variante wie:

PHP-Code:
$sql 'SELECT title, locationdata_id, description FROM tbl WHERE title = "'.$title.'" AND locationdata_id = '.$locationdata_id.' AND description = "'.$description.'"';
$result mysql_query($sql);
$rowcheck mysql_fetch_assoc($result);

if(!
$rowcheck) {
    
// Inserte

Was haltet ihr von einem unique auf die description spalte in der DB?

Ich habe noch folgendes gelesen:
Zitat:
Ich hab noch nen interessanten Ansatz für nen Work around, man verwendet nen Sha1 Hashwert den man in nen VarChar schreibt und diesen auf Unique setzt. Dadurch kann man dann auch Elemente vom Typ "SmallText", "LongText" und "Text" einwandfrei auf Duplicate prüfen.
Ist das evtl eine Lösung?

Bisher musste ich so große Texte noch nicht vergleichen vielleicht habt ihr einen Guten Ansatz für mich.
Grüße
Mit Zitat antworten
  #2 (permalink)  
Alt 14-01-2015, 11:01
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von Peh4pe Beitrag anzeigen
Es kann nun vorkommen, dass Titel und location gleich sind, jedoch die description verschieden ist. Es bleibt mir also leider nichts übrig als vor jedem Insert zu prüfen, ob diese description bereits vorhanden ist.
Hast du das aus Versehen falsch formuliert oder versteh ich es nur nicht?
Wenn Titel und location ggf. gleich sind und nur die description unterscheidet sich, warum willst du dann die description auf mögliche Duplikate prüfen?
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #3 (permalink)  
Alt 14-01-2015, 11:29
Peh4pe
 Registrierter Benutzer
Links : Onlinestatus : Peh4pe ist offline
Registriert seit: Nov 2011
Beiträge: 41
Peh4pe befindet sich auf einem aufstrebenden Ast
Standard

Eher unverständlich formuliert..

also es Darf sein, dass Titel und Location gleich sind.. wenn dazu noch die description gleich wäre, wäre es eine dublette..

ich will checken:

wenn
titel_aus_db, location_aus_db,description_aus_db
gleich
titel_neu, location_neu,description_neu
dann
gebe mir datensatz_aus_db wieder um etwas zu mergen.

theoretisch würde es auch langen nur die description zu checken.. aber so wie gerade beschrieben wäre es optimal.
Mein Bedenken ist nur, dass so wie ich es aktuell prüfen will (mit dem $rowcheck) wahrscheinlich sehr unperformant sein wird?
Mit Zitat antworten
  #4 (permalink)  
Alt 14-01-2015, 12:17
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Peh4pe Beitrag anzeigen
Eher unverständlich formuliert..

also es Darf sein, dass Titel und Location gleich sind.. wenn dazu noch die description gleich wäre, wäre es eine dublette.
...
Mein Bedenken ist nur, dass so wie ich es aktuell prüfen will (mit dem $rowcheck) wahrscheinlich sehr unperformant sein wird?
Erstmal solltest du es ausprobieren, sprich: messen. Dann kannst du versuchen, die Geschwindigkeit zu steigern, falls nötig.

Alle deine Vorschläge|Ideen|gelesenen Tricks lassen sich kombinieren.
Um einen sehr langen Text mit einer Liste von sehr langen Texten effizient zu vergleichen, geht man in der Reihenfolge vom geringsten zum höchsten Aufwand vor:

1.) Länge vergleichen. Sind die Texte nicht gleich lang, sind sie auch nicht gleich.

2.) Prüfsumme|Hash-Wert oder ähnliches berechnen und vergleichen. Sind sie unterschiedlich, sind es auch die Texte. Hier musst du beachten, dass die verwendete Hash-Funktion über den gesamten Text läuft.

3.) Schließlich der mühsame Vergleich des Volltextes. Hier hilft die Datenbank, wenn sie entsprechende Indizes erstellen kann. Dann werden die Texte quasi vorsortiert und der Vergleich kann effizienter erfolgen. Im komfortabelsten Fall hat die entsprechende Spalte in der Tabelle den Constraint UNIQUE, so dass die Datenbank schon beim Einfügen eines neuen Datensatzes bescheid geben kann. Wie sich MySQL hier anstellt, musst du allerdings selbst rausfinden ... Dieses Gewürge mit den unterschiedlichen String|Text-Typen; die sich in Verbindung mit den unterschiedlichen Storage-Engine-Typen unterschiedlich verhalten, würde ich mir nur ungern antun.

Ein Problem mit Dubletten-Erkennung von Texten ist allerdings, dass Texte, die (in der Rohfassung) für Maschinen ungleich sind, für menschliche Betrachter trotzdem gleich "aussehen" können. Dann müssen alle drei Vergleichsstufen daran angepasst werden. Also bspw.:

1.) Länge: Nicht nur Bytes zählen, sondern nur Nicht-Whitespace-Zeichen.

2.) Prüfsumme|Hash-Wert: Groß-Klein-Schreibung, Whitespace usw. ignorieren.

3.) Volltextvergleich: wie 2.

--

Gemecker zum Schluss: Verwende PDO oder mysqli und binde Benutzereingaben als Parameter an Prepared Statements (siehe auch). Wenn du die ungeprüft mit SQL-Syntax zusammenklebst, musst du dir keine Sorgen um Effizienz machen, weil du dir vorher größere Probleme einhandelst.
Mit Zitat antworten
  #5 (permalink)  
Alt 14-01-2015, 13:03
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

@fireweasel

ich hab auch grad die ganze Zeit überlegt - ein Volltextindex bringt bei seiner Frage eher wenig bzw. ist unnütz oder täusch ich da? Es muss ja nur die komplette Zeichenkette geprüft werden und nicht einzelne "Wörter".
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #6 (permalink)  
Alt 14-01-2015, 15:54
Peh4pe
 Registrierter Benutzer
Links : Onlinestatus : Peh4pe ist offline
Registriert seit: Nov 2011
Beiträge: 41
Peh4pe befindet sich auf einem aufstrebenden Ast
Standard

Also erstmal danke für die Denkanstöße!

Ich habe es aktuell so gelöst, dass ich eine neue Spalte mit dem md5 hash von der description angelegt habe und beim insert die dann auch checke.

Läuft fix und macht das was es sollte.

PDO und/oder mysqli stehen auf der Todo

Danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 14-01-2015, 19:51
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Leg’ auf die MD5-Spalte einen Unique Index, und baue den MD5-Wert dann gleich ins INSERT-Statement mit ein … dann kriegst du im Falle der Verletzung des U.I. eine eindeutige Fehlernummer, die sich gezielt auswerten lässt.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
doppelt, dublette, duplicate, longtext, unique


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Funktion zum Zeichnen von Polylinien anhand von Strecken und Winkeln Malachite Projekthilfe 2 17-11-2011 17:09
Anhand Tags den ähnlichsten Eintrag finden (eine Art Scoring) st@tic BRAINSTORMING PHP/SQL/HTML/JS/CSS 4 15-07-2009 16:04
Vorwahlen anhand eine PLZ finden. Skaschy Apps und PHP Script Gesuche 5 29-11-2005 19:37
[MySQL 4.0] Datensatz anhand der ersten beiden Stellen finden Schoppy SQL / Datenbanken 4 20-10-2005 12:53
Übergabe von Variable (longtext) mit Returns mchashi PHP Developer Forum 4 21-01-2003 22:30

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:58 Uhr.