URL/Eintrag mit Datenbank vergleichen.

pl_90

Angesehenes Mitglied
Hallo,

Ich habe einen Script, wo man URLs eintragen kann.
Jetzt brauche ich so etwas, damit man keine doppelte Einträge machen kann.

Wie kann ich so etwas machen, dass der Script die Domäne aus der Datenbank und der eingegebenen URL (bei Submit) herausnimmt und dann vergleicht, sollten die Domänen gleich sein, dann sollte eine Fehlermeldung kommen... Wie kann man so etwas machen?

Also ich habs bisschen herumprobert, aber nicht geschafft:

CODE
$url = $_POST['url'];
$pruef_url = mysql_query("SELECT url FROM BLBL WHERE url='$url'");

$p_url = preg_match('@^(?:http://)?([^/]+)@i', $url);
$d_url = preg_match('@^(?:http://)?([^/]+)@i', $pruef_url);

$p_url2 = preg_match('/[^.]+\.[^.]+$/', $p_url);
$d_url2 = preg_match('/[^.]+\.[^.]+$/', $d_url);

if ($p_url2 == $d_url2) {
$fehler = "URL schon vorhanden!";
}



Also Beispiel mit zwei URLs:
1. http://www.homepage.de
2. http://www.homepage.de/bla/bla/

-> 1. homepage.de
-> 2. homepage.de

homepage.de == homepage.de
-> Fehler

Wie geht das?


Danke schön im Voraus.
 
Dokumentation lesen kann hilfreich sein:
int preg_match ( string $Suchmuster, string $Zeichenkette [, array &$Treffer [, int $Flags [, int $Versatz]]] )


Hier ist mein grober Absatz dazu, der sich bestimmt noch verbessern lässt, wenn man etwas mehr als 5 bis 10 min dafür aufwendet:
QUOTE $domain = preg_replace('/(.*?\:\/\/)?(.*?\@)?([^\s\/\@]*)(.*)?$/i','\3', $url);
$domain = strtolower($domain);
$sld = preg_replace('/^(.*?\.)?([^\s\/\@]+\.[^\s\/\@]+)$/', '\2', $domain);

if ( is_domain($sld) ) { /* Diese Funktion musst Du Dir selber schreiben und wird auch dringend benötigt, da die Variable $sld auch leer sein kann */
   if ( $result = mysql_query('SELECT COUNT(*) AS count FROM BLBL_DOMAINS WHERE domain = \'' . mysql_real_escape_string($domain) . '\';') ) { /* Grundlegende Mysql-Injektions verhindern! Die count()-Funktion sollte aus Preformencegründen nicht bei InnoDB verwendet werden! */
      if ( $data = mysql_fetch_assoc($result) ) {
if ( $data['count'] ) {
mysql_query('INSERT INTO BLBL_DOMAINS (domain) VALUES(\'' . mysql_real_escape_string($sld) . '\');');
          /* Einfügen der der URL, beim Löschen muss in gleicher Weise auch die dazugehörige Domain aus der Tabelle BLBL_DOMAINS gelöscht werden */
} else {
         $fehler = "URL schon vorhanden!";
}
      }
   }
}
 
QUOTE (Sascha Ahlers @ So 17.06.2007, 17:53) Dokumentation lesen kann hilfreich sein:
int preg_match ( string $Suchmuster, string $Zeichenkette [, array &$Treffer [, int $Flags [, int $Versatz]]] )


Hier ist mein grober Absatz dazu, der sich bestimmt noch verbessern lässt, wenn man etwas mehr als 5 bis 10 min dafür aufwendet:

QUOTE $domain = preg_replace('/(.*?\:\/\/)?(.*?\@)?([^\s\/\@]*)(/.*)?$/i','\3', $url);
$domain = strtolower($domain);
$sld = preg_replace('/^(.*?\.)?([^\s\/\@]+\.[^\s\/\@]+)$/', '\2', $domain);

if ( is_domain($sld) ) { /* Diese Funktion musst Du Dir selber schreiben und wird auch dringend benötigt, da die Variable $sld auch leer sein kann */
  $result = mysql_query('SELECT COUNT(*) FROM BLBL_DOMAINS WHERE domain = \'' . mysql_real_escape_string($domain) . '\';'); /* Grundlegende Mysql-Injektions verhindern! Die count()-Funktion sollte aus Preformencegründen nicht bei InnoDB verwendet werden! */
  if ( mysql_fetch_assoc($result) ) {
      $fehler = "URL schon vorhanden!";
  } else {
      mysql_query('INSERT INTO BLBL_DOMAINS (domain) VALUES(\'' . mysql_real_escape_string($sld) . '\');');
      /* Einfügen der der URL, beim Löschen muss in gleicher Weise auch die dazugehörige Domain aus der Tabelle BLBL_DOMAINS gelöscht werden */
  }
}


Vielen Dank, aber ich bekomme Fehler:
Warning: preg_replace() [function.preg-replace]: Unknown modifier '.' in XXX on line 104

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in XXX on line 113

blink.gif


Und was meinst du mit:

CODE
if ( is_domain($sld) ) { [color=red]/* Diese Funktion musst Du Dir selber schreiben und wird auch dringend benötigt, da die Variable $sld auch leer sein kann */[/color]
 
Vlt. hab ich es auch falsch verstanden, aber geht es nicht, wenn du einen Unique Index in der Datenbank setzt und im Skript einfach die Domain eintragen lässt und wenn die Domain ja schon in der Datenbank ist, dann gibt der Eintragversuch ja einen Fehler Error, da der Unique, beim Schreiben aus und den fängst du einfach ab.

CODE $eintrag="INSERT INTO blabla(x,y,z)
VALUES
('$xxx', '$yyy', '$zzz')";
if (mysql_query("$eintrag")==false)
{
echo "Der einzutragende Inhalt existiert bereits in der Datenbank!";
}
else
{
echo("<p>Ihre Nachricht wurde erfolgreich versendet.Vielen Dank für Ihren Eintrag und Ihre Hilfe den Index aktuell zu halten!</p>\n");
}
 
Der Quellcode ist korrigiert:
QUOTE $domain = preg_replace('/(.*?\:\/\/)?(.*?\@)?([^\s\/\@]*)(.*)?$/i','\3', $url);
$domain = strtolower($domain);
$sld = preg_replace('/^(.*?\.)?([^\s\/\@]+\.[^\s\/\@]+)$/', '\2', $domain);

if ( is_domain($sld) ) { /* Diese Funktion musst Du Dir selber schreiben und wird auch dringend benötigt, da die Variable $sld auch leer sein kann */
   if ( $result = mysql_query('SELECT COUNT(*) AS count FROM BLBL_DOMAINS WHERE domain = \'' . mysql_real_escape_string($domain) . '\';') ) { /* Grundlegende Mysql-Injektions verhindern! Die count()-Funktion sollte aus Preformencegründen nicht bei InnoDB verwendet werden! */
      if ( $data = mysql_fetch_assoc($result) ) {
if ( $data['count'] ) {
mysql_query('INSERT INTO BLBL_DOMAINS (domain) VALUES(\'' . mysql_real_escape_string($sld) . '\');');
          /* Einfügen der der URL, beim Löschen muss in gleicher Weise auch die dazugehörige Domain aus der Tabelle BLBL_DOMAINS gelöscht werden */
} else {
         $fehler = "URL schon vorhanden!";
}
      }
   }
}





QUOTE (pl_90 @ So 17.06.2007, 19:35)Und was meinst du mit:

CODE
if ( is_domain($sld) ) { [color=red]/* Diese Funktion musst Du Dir selber schreiben und wird auch dringend benötigt, da die Variable $sld auch leer sein kann */[/color]


Ich weiß nicht was daran unterverständlich sein soll... Es heißt aber grob, die Funktion wird benötigt, und Du muss diese selber schrieben, bzw. Dir irgendwo her besorgen (bspw. PEAR).
 
QUOTE (kekskruemel @ So 17.06.2007, 21:01) [...] wenn du einen Unique Index in der Datenbank setzt und im Skript einfach die Domain eintragen lässt und wenn die Domain ja schon in der Datenbank ist, dann gibt der Eintragversuch ja einen Fehler Error, da der Unique, beim Schreiben aus und den fängst du einfach ab. [...]

Man kann die Kontrolldomain dort als Unique-Schlüssel in der vorhanden Datenbank benutzen, aber nur diese Form der Kontrolle alleine wird nicht ausreichen, wenn eine URL angegeben wird.
 
Ok, jetzt wird das witzig...
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource

Irgendwie mag er das nicht... hehe...


Kann man das nicht so machen, wie ich oben geschrieben habe, bzw:
das, habe ich gerade gemachtz und
CODE
$pruef_url = mysql_query("SELECT url FROM ".$mysql_table_prefix."sites WHERE url='$url'");

while($row=mysql_fetch_array($pruef_url)) {
$url2 = $row['url'];
}

preg_match('@^(?:http://)?([^/]+)@i', $url, $treffer);
preg_match('@^(?:http://)?([^/]+)@i', $url2, $treffen);

$host = $treffer[1];
$hosta = $treffen[1];

preg_match('/[^.]+\.[^.]+$/', $host, $treffer);
preg_match('/[^.]+\.[^.]+$/', $hosta, $treffen);

if ($treffer[0] == $treffen[0]) {
$fehler = "URL schon vorhanden!";
}


funktioniert bei Echo und so, aber mit der Datenbank gibts nen streit...

Hat jemand ne Ahnung?
 
QUOTE (pl_90 @ So 17.06.2007, 22:21) Ok, jetzt wird das witzig...
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
[...]

So, ich habe den nochmal korrigiert, habe lange nicht mehr mit count() in MySQL gerarbeitet. Alles andere sollte eigentlich nur Fehler erzeugen, wenn das Feld oder die Tabelle nicht existiert...
 
Ok.. Er scheint dich irgendwie nicht zu mögen... hehe... Er check gar nichts... "Er tut so als nichts passiert wäre und geht einfach weiter..."...
Also du weißst woum es geht oder?
Also Er soll von der URL die geschickt wurde die Domäne rausholen also, z.B. http://www.google.de/search -> google.de
und von MySQL das gleiche und dan soll er das vergleichen ob die identisch sind, wenn ja = Fehler, wenn nicht = weiter...

Danke schön nochmals...
 
QUOTE (pl_90 @ So 17.06.2007, 23:05) [...]
und von MySQL das gleiche und dan soll er das vergleichen ob die identisch sind, wenn ja = Fehler, wenn nicht = weiter...
[...]

Preformencetechnisch ist das unsinnig, da die entsprechende Domain auch mehrmals gefunden werden kann bei einer Abfragen mittel LIKE. Darum wird ein extra Feld benötigt, welches er nach der Domain durchsucht, und darauf baut das Script von mir auch auf.

Deine beiden Scripte scheinen auch irgendwie einen Denkfehler in der beschriebenen Problematik aufzuweisen - selbst wenn Deine IMHO unsinnige Vorgehensweise verwendet wird -, entweder wird nur das letzte gefunde Eintrag, oder der erste gefunde Eintrag, mit der URL verglichen. Ergo kann es sein, dass keine URL mit der gleichen Domain gefinden, obwohl bereits eine URL mit entsprechender Domain in der Datenbank sein kann.
 
Ich meine das so, dass man keine doppelten Einträge machen soll.. Das geht auch schnell if ($url == $d_url) { ... blablabla, aber es ist ein scheiß Nachteil dabei, dass wenn man am Ende ein Strich oder was anderes (bei der URL Eingabe) eingibt, dann ist das schlecht, wird trotzdem bearbeitet, da das teorätisch nicht gleich ist, deswegen suche ich Hilfe, dass der Script iregndwie das vergleichen kann, ob www. vorne oder /index.html hinden, soll s... egal sein - nur die Domäne (domain.tld) soll wichtig sein.. Weiß du was ich meine? Wie kann man das den machen? Also mit dem oberen Script von mir nimmt er schon die Domäne Raus nu weiter weiß ich nicht...
 
Ok, ich habe es geschafft und dieser Check klappt super!
NUr habe ich jetzt folgendes Problemmchen...


Wenn ich auf Absenden klicke ohne was einzutragen kommt das:

Notice: Undefined variable: domaih in XXX on line 65
Notice: Undefined variable: domain in XXX on line 65

Und wenn ich was Eintrage dann checkt er alles ganz normal,
nur wenn alles gecheckt ist und alles OK ist, dann sollte
der Formular abgeschickt werden, tut er aber nicht, stattdessen
kommt das hier:

Notice: Undefined variable: p_url in XXX on line 34
Notice: Undefined offset: 1 in XXX on line 35
Notice: Undefined offset: 0 in XXX on line 37

Und das komische daran ist, dass gestern noch alles OK war,
ich hab das gesetern noch getestet und heute guck ich - und kommt der Mist.


Kann mir jemand bitte helfen... Bitte...

Hier der ganze Script:

CODE
<?php
session_start();

define('IN_SCRIPT', true);
error_reporting(E_ALL);

$settings_dir = "XXX";
include "$settings_dir/XXX";

$ms[1] = "<div class=\"error\">URL ungültig!</div>";
$ms[2] = "<div class=\"error\">URL fehlt!</div>";
$ms[3] = "<div class=\"error\">Sicherheitscode falsch!</div>";
$ms[4] = "<div class=\"error2\">Sie dürfen erst in 10 Minuten eine weitere Webseite eintragen!</div>";
$ms[5] = "<div class=\"error2\">Ihre URL scheint nicht erreichbar zu sein!</div>";
$ms[6] = "<div class=\"error\">URL bereits vorhanden!</div>";



if (isset($_POST['submit'])) {
$error = '';

if (!empty($_POST['url']) && !empty($_POST['authcodecheck']) && isset($_POST['submit'])) {
preg_match('@^(?:http://)?([^/]+)@i', $_POST['url'], $treffen);
$hosk = $treffen[1];
preg_match('/[^.]+\.[^.]+$/', $hosk, $treffen);
$domaih = $treffen[0];

$pruef_url = mysql_query("SELECT url FROM XXX WHERE url LIKE '%$domaih%'");

while($row=mysql_fetch_array($pruef_url)) {
$p_url = $row['url'];
}

preg_match('@^(?:http://)?([^/]+)@i', $p_url, $treffer);
$host = $treffer[1];
preg_match('/[^.]+\.[^.]+$/', $host, $treffer);
$domain = $treffer[0];
} else
{}

if (empty($_POST['url'])) {
$error = $ms[2];
}

if ($_POST['url'] == "") {
$error = $ms[2];
}

if (!(preg_match('#http://(.*).(.*).(.*)?$#i', $_POST['url']))) {
$error = $ms[1];
}

if (empty($_POST['authcodecheck'])) {
$error = $ms[3];
}

if ($_POST['authcodecheck'] == "") {
$error = $ms[3];
}

/*if (!@fopen($url,"r")) {
$error = $ms[5];
}*/

if ($domain == $domaih) {
$error = $ms[6];
}

if (!isset($_POST['authcodecheck']) || $_SESSION['image_auth_code'] != $_POST['authcodecheck']) {
$error = $ms[3];
}

if (!$error) {
include('send.php');
exit;
}
}

if(!isset($_POST['submit']) || !empty($error)) {
?>

<!-- Formular -->


<?php
}
?>



Bitte bitte helft mir...


Vielen Dank im Voraus....
 
Das musst Du richtig abfangen, wenn eine Variable nicht gesetzt ist, muss Du diese setzen.
Alternativ kannst Du mittels error_reporting die Fehlerbenachrichtung heruntersetzen.

Ersteres ist natürlich besser.
 
Das mit diesem Reporting weiß ich, aber es funktioniert seit heute gar nichts, nur checken geht noch, wenn ich reports unterdrücke, dann kommt beim erfolgreichen checken ne leere seite, aber die Variablen dind doch gesetzt, alles ist doch da... ???
ohmy.gif
blink.gif

Was ist los?
 
QUOTE (pl_90 @ Di 19.06.2007, 19:45) [...] aber die Variablen dind doch gesetzt, alles ist doch da... ???
ohmy.gif
blink.gif

Was ist los?

Das kann ja nicht stimmen, sonst würde ja auch nicht die Fehlermeldung erscheinen.

Beispielsweise in der Zeile $domain = $treffer[0] kann $treffer[0] undefiniert sein, so erhält $domain keinen Wert und ist somit undefiniert, so wird vermutlich spätens wenn das Programm zu dieser Zeile kommt, einen Hinweis auswerfen:

CODE if ($domain == $domaih) {



Fazit: Der Hinweis kommt nur, weil nicht sauber programmiert wurde, weswegen Abfangroutinen fehlen.
 
Zurück
Oben