WinFuture-Forum.de: 2 Arrays Miteinander Vergleichen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

2 Arrays Miteinander Vergleichen php


#1 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 04. August 2008 - 23:16

Hallo,
ich wurschtel mich schon ewig damit ab 2 bzw mehere Arrays aus einer Datenbank mit einer Array aus einem Post zu vergleiche und auszugeben, ja wenn keine übereinstimmungen gefunden wurden und nein wenn eine oder mehr gefunden wurden.

Ich habe das ganze so angedacht:
	$pruef=mysql_query($pruef_sql);
	while($pruef_row=mysql_fetch_array($pruef)){
	
	$pruef_array=array(''.$name.'',''.$link.'',''.$email.'',''.$banner.''); // Array von dem Formular
	
	$pruef_result=array_intersect($pruef_row, $pruef_array);
	
   
if(empty($pruef_result)){
echo" leer ";
}else{
echo" voll ";
}

// Also ich bekomme "leer leer voll" nur so nebenbei

 }


Noch was damit man es auch versteht, ich habe eine Tabelle in einer Db.
In der Tabelle sind verschiedene Datensätze die viele daten in Spalten enthalten.

Der User schickt ein Formular ab und ich möchte sagen Stopp, der Wert/Werte soundso sind schon in der Tabelle. An der Stelle soll das Script abbrechen und halt diese Meldung ausgeben, wenn nichts gefunden wurde soll es einfach weitermachen, denn dann kommt erst der eigentliche code.

Ich hoffe ich konnte es ewas beschreiben!
Und sorry dass ich immer so viele Fragen habe aber ich habe Ferien und da programmiere ich fasst den ganzen Tag! :-P

Gruß,
Toasterfraktion
0

Anzeige



#2 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 08:04

Also ich gehe jetzt mal davon aus, das es reicht, wenn schon der Name einmal vorhanden ist. Oder auch nur einmal der Link usw. Dann dürfte jedoch dein Code ohne weiteres funktionieren. Um den User mitzuteilen, welche Werte schon existieren, kannst du das folgenderweise tun:

$uebereinstimmungen_count = 0; //Anzahl der Übereinstimmungen

$pruef_array = array('Der Name' => $name, 'Der Link' => $link, 'Die E-Mailadresse' => $email, 'Der Banner' => $banner); // Array von dem Formular

$pruef = mysql_query($pruef_sql);

while ($pruef_row = mysql_fetch_array($pruef)) {
	$pruef_result = array_intersect($pruef_array, $aus_datenbank);
	
	foreach ($pruef_result as $key => $wert) {
		echo $key.' "'.htmlentities($wert).'" existiert bereits in der Datenbank.<br />';
		$uebereinstimmungen_count++;
	}
}

echo $uebereinstimmungen_count.' Überseinstimmungen in Datenbank gefunden.';


Dabei solltest du darauf achten, dass du gleich bei deiner MySQL-Abfrage eine WHERE-Klausel mit name='$name' OR link='$link' OR ... verwendest, weil sonst unnötig viele Datensätze abgerufen werden und auch verglichen werden müssen.

Sollen jedoch alle Werte aus einem Datensatz übereinstimmen, so kannst du das auch direkt mit MySQL erledigen. Einfach eine WHERE-Klausel mit name='$name' AND link='$link' AND ... und hier halt dann die Datensatzanzahl zurückgeben.

Ich hoffe, ich habe dir ein wenig weitergeholfen.

Gruß,
Stefan
0

#3 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 05. August 2008 - 09:32

Ja, hat mir weitergeholfen, aber musste damit es funktioniert noch die Variable $aus_datenbank mit $pruef_row ersetzten!



:-)
Gruß,
Toasterfraktion

Dieser Beitrag wurde von Toasterfraktion bearbeitet: 05. August 2008 - 09:42

0

#4 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 09:38

Beitrag anzeigenZitat (Toasterfraktion: 05.08.2008, 10:32)

Ja, hat mir weitergeholfen, aber musste damit es funktioniert noch die Variable $aus_datenbank mit $pruef_row ersetzten!

:-)
Gruß,
Toasterfraktion

Oh, sorry :wink: Ich habe das ganze nur mit Temp-Arrays getestet und dann beim wieder zusammensetzen, das wohl übersehen.
0

#5 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 05. August 2008 - 09:42

Macht nichts, kann passieren! :wink:
Nur noch eins, ich muss alles unabhängig vond er groß und kleinschreibung finden.
Hab es per strtolower() probiert, scheitere aber schon an den Arrays,
und muss ich dann nicht schon in dem SELECT-Syntax strtolower() arbeiten?

Dieser Beitrag wurde von Toasterfraktion bearbeitet: 05. August 2008 - 09:44

0

#6 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 09:52

Das geht direkt in MySQL mit lower().

SELECT ... FROM ... WHERE lower(name)=lower('$name') OR ...
Das zweite lower um die PHP-Variable kannst du weglassen, wenn du $name gleich mit strtolower() "klein" machst.

Oder auch mit Vergleichsfunktionen:
SELECT ... FROM ... WHERE name LIKE '$name' OR ...


Gruß,
Stefan
0

#7 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 05. August 2008 - 10:08

lower() hat mir gefehlt, danke jetzt ist alles nach meinen Vorstellungen!

Was würd ich nru ohne Diewie machen! :-D

Noch was zur Sicherheit, soll ich strinkt alles was aus der Datenbank kommt mit htmlentities() ausgeben? Auch wenn es Bestandteil von < ahref oder <img ist?
Und auch immer das hier:
		lower(name)='".mysql_real_escape_string($name)."'
	OR
		lower(banner)='".mysql_real_escape_string($banner)."'

Und hier muss ich doch nichts beachten weil ich ja nicht mit dem Wert arbeite oder?
<div id="melden" style="
<?php
if($_GET['spoiler_1']){
echo "display:block;";
}else{
echo "display:none;";
}
?>
">

Gruß,
Toasterfraktion

Dieser Beitrag wurde von Toasterfraktion bearbeitet: 05. August 2008 - 10:23

0

#8 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 10:28

Ja, mysql_real_escape_string() auf jeden Fall, weil hier der User direkt mit der Datenbank interagieren kann.
Und um Risiken wie XSS u.ä. zu vermindern, würde ich auch htmlspecialchars() bzw. htmlentities(..., ENT_QUOTES) verwenden.

Gruß,
Stefan
0

#9 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 05. August 2008 - 11:00

Okay,
nur ich hab gemerkt dass das mit dem strtolower() irgendwie nicht geklappt hat.
Ich habe das Script nochmal verändert, da er ja die Namen nicht klein in die Datenbank schreiben soll sondern nur überprüfen, nur wenn jetzt der wert
www.google.de in der Db drin ist und ich versuche www.google.dE einzugeben geht es immernoch ohne Fehler?

Irgendwas ist da kaputt!
Hier mal der Code:
if($_POST['p_submit']){
	$name=$_POST['name'];
	$link=$_POST['link'];
	$email=$_POST['email'];
	$banner=$_POST['banner'];
	$zeit=date("d.m.Y - H:i:s");
	$ip=$_SERVER['REMOTE_ADDR'];
	
	
	if($name and $link and $email and $banner){

	$pruef_sql="
	SELECT
		name,link,email,banner
	FROM
		hp_partner
	WHERE
		lower(name)='".mysql_real_escape_string(strtolower($name))."'
	OR
		lower(banner)='".mysql_real_escape_string(strtolower($banner))."'
	OR
		lower(email)='".mysql_real_escape_string(strtolower($email))."'
	OR
		lower(link)='".mysql_real_escape_string(strtolower($link))."'
	";
	
	$pruef_array = array('Der Name' => strtolower($name), 'Der Link' => strtolower($link), 'Die E-Mailadresse' => strtolower($email), 'Das Banner' => strtolower($banner));
	
	$pruef = mysql_query($pruef_sql);
	while ($pruef_row = mysql_fetch_array($pruef)) {
		$pruef_result = array_intersect($pruef_array, $pruef_row);
			
			foreach ($pruef_result as $key => $wert) {
			echo $negativ." ".$key.' <b>"'.htmlentities($wert, ENT_QUOTES).'"</b> existiert bereits in der Datenbank.<br />';
			$uebereinstimmungen_count++;
			}
	}
	if($uebereinstimmungen_count >= 1){
	
	echo $negativ." <b>".$uebereinstimmungen_count.'</b> Überseinstimmungen in Datenbank gefunden.<br />
	'.$negativ.' Anfrage fehgeschlagen!<br />
	';
	}else{


Ich habe ja nun htmlentities(, ENT_QUOTES) und mysql_real_escape_string() verwendet, ist das Script abgesehen davon dass es nicht korrekt arbeitet gegen Anfriffe ausreichend geschützt?
0

#10 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 11:27

Hm, sehr komisch. MySQL ist normalerweise nicht mal bei = Vergleichen Case-Sensitive. Versuch es mal mit dem LIKE ohne lower() und strtolower(), fallst das auch nicht geht, dann versuch es nochmal mit LIKE und dem lower() und strtolower(). Vielleicht hängt es auch irgendwie mit der verwendeten Collation zusammen.

Ja, "sicher" ist dein Skript so wie es ist.
Nebenbei: Wenn du mit
if($name and $link and $email and $banner){
sicherstellen willst, dass alles einen Inhalt hat, dann mach das besser mit strlen()
if ((strlen($name) > 0) && (strlen($link) > 0) && (strlen($email) > 0) && (strlen($banner) > 0)){
Ist meiner Meinung nach einfach besserer Stil :wink:

Gruß,
Stefan
0

#11 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 05. August 2008 - 19:56

Gut danke für den tipp, aber das Script arbeitet immernoch nicht richtig, auch mit LIKE nicht!

ich habe den sql befehl bevor in mysql_query verarbeitet wird ausgegeben und manuell in phpmyadmin eingegeben und er findet egal welchen buchstaben ich groß oder klein schreibe immer einen Beitrag, so soll es ja auch sein!
Nur im Script lässt er es dann trotzdem durch, es muss am Script liegen.

liegt der Fehler vielleicht heir:
if($uebereinstimmungen_count >= 1){
	
	echo $negativ." <b>".$uebereinstimmungen_count.'</b> Überseinstimmungen in Datenbank gefunden.<br />
	'.$negativ.' Anfrage fehgeschlagen!<br />
	';
	}else{
// daten in die db schreiben


Gruß,
Toasterfraktion
0

#12 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 05. August 2008 - 20:26

Achso, naja dann liegts am ehesten wohl an array_intersect(). Lass mal die beiden Arrays mit print_r() oder var_dump() ausgeben und vergleiche Sie manuell. Gibt es hier irgendwelche gravierenden Mängel/Unterschiede?

Und füge bitte $uebereinstimmungen_count = 0; vor der while-Schleife ein.

Gruß,
Stefan

Dieser Beitrag wurde von Diewie bearbeitet: 05. August 2008 - 20:28

0

#13 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 06. August 2008 - 13:35

So, es war Mixcool.de in der Db eingetragen, und habe nun versucht mixcool.dE einzutragen, es hat funktioniert und er gibt folgende Arrays aus:
array(4) {
  ["Der Name"]=>
  string(10) "mixcool.de"
  ["Der Link"]=>
  string(13) "sdfgsdfgdfasd"
  ["Die E-Mailadresse"]=>
  string(8) "gasdgasd"
  ["Das Banner"]=>
  string(9) "gasdgasdg"
}
NULL
array(0) {
}

Anfrage wurde erfolgreich abgeschickt!


Und das mit folgendem Code:
echo "<pre>";
	
	
	
	$pruef_array = array('Der Name' => strtolower($name), 'Der Link' => strtolower($link), 'Die E-Mailadresse' => strtolower($email), 'Das Banner' => strtolower($banner));
	
	var_dump($pruef_array);
	
	
	$pruef = mysql_query($pruef_sql);
	while ($pruef_row = mysql_fetch_array($pruef)) {
	
	var_dump($pruef_result);
	
	$pruef_result = array_intersect($pruef_array, $pruef_row);
			
			
	var_dump($pruef_result);

Irgendwie gibt er da NULL aus.

Dieser Beitrag wurde von Toasterfraktion bearbeitet: 06. August 2008 - 13:50

0

#14 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 06. August 2008 - 13:54

Statt var_dump($pruef_result); solltest du auch var_dump($pruef_row); schreiben, damit wir die beiden Eingabearrays überprüfen können :) Aber das var_dump($pruef_result); kannst du hinter dem array_intersect() auch noch stehen lassen.

Gruß,
Stefan
0

#15 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 06. August 2008 - 14:14

Gleiche Anfrage:

pruef_array
 array(4) {
   ["Der Name"]=>
   string(10) "mixcool.de"
   ["Der Link"]=>
   string(13) "sdfgsdfgdfasd"
   ["Die E-Mailadresse"]=>
   string(8) "gasdgasd"
   ["Das Banner"]=>
   string(9) "gasdgasdg"
 }
 
 
 pruef_result hinter mysql fetch Array
 NULL
 
 pruef_result hinter array_intersect
 array(0) {
 }
 
 
 pruef_row hinter mysql fetch Array
 array(8) {
   [0]=>
   string(10) "MixCool.de"
   ["name"]=>
   string(10) "MixCool.de"
   [1]=>
   string(21) "http://www.MixCool.de"
   ["link"]=>
   string(21) "http://www.MixCool.de"
   [2]=>
   string(16) "[email protected]"
   ["email"]=>
   string(16) "[email protected]"
   [3]=>
   string(46) "http://www.mixcool.de/banner/mixcool-small.png"
   ["banner"]=>
   string(46) "http://www.mixcool.de/banner/mixcool-small.png"
 }
 
 
 pruef_row hinter array_intersect
 array(8) {
   [0]=>
   string(10) "MixCool.de"
   ["name"]=>
   string(10) "MixCool.de"
   [1]=>
   string(21) "http://www.MixCool.de"
   ["link"]=>
   string(21) "http://www.MixCool.de"
   [2]=>
   string(16) "[email protected]"
   ["email"]=>
   string(16) "[email protected]"
   [3]=>
   string(46) "http://www.mixcool.de/banner/mixcool-small.png"
   ["banner"]=>
   string(46) "http://www.mixcool.de/banner/mixcool-small.png"
 }
 Anfrage wurde erfolgreich abgeschickt! // Soll aber nicht!

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0