WinFuture-Forum.de: Preg_match Problem - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Preg_match Problem


#1 Mitglied ist offline   ps915 

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

geschrieben 01. August 2008 - 14:18

Hallo,
ich habe noch ein Problem!

Kurz zum Aufbau:

Es ist ein Script mit dem man einträge machen kann. Jeden Eintrag kann man eins/garkeins/mehrere Bilder/Fotos zuweisen. Es wird so in der Tabelle gespeichtert:
Angehängtes Bild: a45345.JPG

Es gibt dazu eine tabelle in der dann entweder mit einem X doer einem Hacken angezeigt wird ob das Bild in einem Eintrag eingetragen ist oder nicht, nur ich komme da nicht weiter.

So sieht die Tabelle aus, es geht um den grün markierten Bereich:
Angehängtes Bild: asddasdg.JPG

Und hier mein Code!
echo '<p><table  cellpadding="0" class="table">
	<tr>
	  <td class="list_top">Name</td>
	  <td class="list_top">Größe</td>
	  <td class="list_top">Hochgeladen</td>
	  <td class="list_top"></td>
	  <td class="list_top"></td>
	  <td class="list_top"></td>
	</tr>';
 
 foreach ($files as $entry) {
 
 $abfrage = "SELECT pics FROM diary_text";
 $ergebnis = mysql_query($abfrage);
 while($row = mysql_fetch_object($ergebnis)){
 $zeichenkette =trim($row->pics);
 
 }
 $name_script=explode(".",$entry[0] );
 $suchmuster = '/\b'.$name_script[0].'\b/i';
 
 if(preg_match($suchmuster, $zeichenkette, $treffer)){
 
 $st='<img src="images/yes.png" alt="Eingetragen!" width="16" height="16" />';
 
 }else{
 $st='<img src="images/no.png" alt="Nicht Eingetragen!" width="16" height="16" />';
 }
 
   echo '<tr>
	  <td class="list_main">'.$entry[0].'</td>
	  <td class="list_main">'.$entry[2].'</td>
	  <td class="list_main">'.date("H:i:s - d.m.y", $entry[1]).'</td>
	  <td class="list_main"><a href="'.$dir.$entry[0].'" target="_blank"><img src="images/control_play.png" border="no"/></a></td>
	  <td class="list_top"><a href="members.php?page=Upload&name='.$entry[0].'" ><img src="images/delete.png" border="no"/></a></td>
	  <td class="list_top">'.$st.'</a></td>
   </tr>';
 }
 echo '</table>';


Es funktioniert nicht wirklich, ich habe auch die Vermutung dass ich da komplett falsch rangehe, kann aber auf das Feature nicht verzichten!

Kann mir da jemand helfen? :)
0

Anzeige



#2 Mitglied ist offline   bardelot 

  • Gruppe: aktive Mitglieder
  • Beiträge: 517
  • Beigetreten: 20. März 04
  • Reputation: 0

geschrieben 01. August 2008 - 16:36

leicht abgeänderte Variante mit pics als serialisiertes Array

<table  cellpadding="0" class="table">
  <tr>
	<td class="list_top">Name</td>
	<td class="list_top">Größe</td>
	<td class="list_top">Hochgeladen</td>
	<td class="list_top"></td>
	<td class="list_top"></td>
	<td class="list_top"></td>
  </tr>

<?php

// leeres Array
$temp = array();

// alle Bilder auswählen
$result = mysql_query('SELECT pics FROM diary_text');

while ($row = mysql_fetch_object($result))
{
  // pics ist ein serialisiertes Array
  // http://de.php.net/manual/de/function.serialize.php
  $temp = $temp + unserialize($row->pics);
  // $temp = array_merge($temp, unserialize($row->pics));
}

// verwendete Bilder sind in $temp
$used = array_unique($temp);

// nicht verwendete Bilder sind in $diff
// $diff = array_diff($files, $used);
 
foreach ($files as $entry) {

if (in_array($entry[0], $used))
{
  $st ='<img src="images/yes.png" alt="Eingetragen!" width="16" height="16" />';
}
else
{
  $st = '<img src="images/no.png" alt="Nicht Eingetragen!" width="16" height="16" />';
}

?>
  <tr>
	<td class="list_main"><?php echo $entry[0]; ?></td>
	<td class="list_main"><?php echo $entry[2]; ?></td>
	<td class="list_main"><?php echo date("H:i:s - d.m.y", $entry[1]); ?></td>
	<td class="list_main"><a href="<?php echo $dir.$entry[0]; ?>" target="_blank"><img src="images/control_play.png" border="no"/></a></td>
	<td class="list_top"><a href="members.php?page=Upload&name=<?php echo $entry[0]; ?>"><img src="images/delete.png" border="no"/></a></td>
	<td class="list_top"><?php echo $st; ?></a></td>
  </tr>
<?php
}
?>
</table>

0

#3 Mitglied ist offline   ps915 

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

geschrieben 01. August 2008 - 17:22

Zitat

Fatal error: Unsupported operand types in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 65

Ein Fehler in
  $temp = $temp + unserialize($row->pics);

0

#4 Mitglied ist offline   dblay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.246
  • Beigetreten: 18. März 07
  • Reputation: 1

geschrieben 02. August 2008 - 09:43

Hallo Toast,

hier hat sich Bardelot scheinbar vertippt:
  $temp = $temp + unserialize($row->pics);
  // $temp = array_merge($temp, unserialize($row->pics));

Es sollte sicherlich heißen:
  // $temp = $temp + unserialize($row->pics);
   $temp = array_merge($temp, unserialize($row->pics));

Viele Grüße
Zeit ist, was verhindert, dass alles gleichzeitig passiert.
0

#5 Mitglied ist offline   ps915 

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

geschrieben 02. August 2008 - 11:02

Sry aber dann ist es immernoch nicht Fehlerfrei:

Zitat

Warning: array_merge() [function.array-merge]: Argument #2 is not an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 69
Warning: array_merge() [function.array-merge]: Argument #1 is not an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 69
Warning: array_merge() [function.array-merge]: Argument #2 is not an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 69
Warning: array_merge() [function.array-merge]: Argument #1 is not an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 69
Warning: array_merge() [function.array-merge]: Argument #2 is not an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 69

$temp = array_merge($temp, unserialize($row->pics));

Zitat

Warning: array_unique() [function.array-unique]: The argument should be an array in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 77

$used = array_unique($temp);

UNd 25x die hier:

Zitat

Warning: in_array() [function.in-array]: Wrong datatype for second argument in D:\xampp\htdocs\DIARY\snips\uploadlist.php on line 84

if (in_array($entry[0], $used))

Irgendwie ist das alles zu viel auf einmal! :-| Vielleicht kann bardelot nochmal schauen! Das wäre nett!

Gruß,
Toasterfraktion
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 02. August 2008 - 11:44

Wenn man unserialize() benutzen will, dann muss man das Array in pics aber auch serialisiert hineinschreiben.

Ein Beispiel für serialisierte Objekte:
<?php

$bilder = array('fertig.JPG', 'haus.png', 'apfel.gif');

echo '<strong>Bilder:</strong><br />';
print_r($bilder);

$serialized_bilder = serialize($bilder);
echo '<br /><br /><strong>Serialisiertes Array: (Dieser String müsste in der Datenbank stehen)</strong><br />';
echo $serialized_bilder;

$wieder_bilder_array = unserialize($serialized_bilder);
echo '<br /><br /><strong>Unserialisiertes Array:</strong><br />';
print_r($wieder_bilder_array);

?>


Hier mal eine Version deines Skriptes, die dein Format verarbeiten kann (also ohne serialisierte Objekte):
echo '<table  cellpadding="0" class="table">
  <tr>
    <td class="list_top">Name</td>
    <td class="list_top">Größe</td>
    <td class="list_top">Hochgeladen</td>
    <td class="list_top"></td>
    <td class="list_top"></td>
    <td class="list_top"></td>
  </tr>';

// leeres Array
$temp = array();

// alle Bilder auswählen
$result = mysql_query('SELECT pics FROM diary_text;');

while ($row = mysql_fetch_object($result)) {
	$temp = array_merge($temp, preg_split('/[^\S]+/', $row->pics)); //alle zusammenhängede Wörter auslesen
}

$used = array_unique($temp);
unset($temp);

foreach ($files as $entry) {
	if (in_array($entry[0], $used)) {
		$st ='<img src="images/yes.png" alt="Eingetragen!" width="16" height="16" />';
	} else {
		$st = '<img src="images/no.png" alt="Nicht Eingetragen!" width="16" height="16" />';
	}

	echo '<tr>
	      <td class="list_main">'.$entry[0].'</td>
	      <td class="list_main">'.$entry[2].'</td>
	      <td class="list_main">'.date("H:i:s - d.m.y", $entry[1]).'</td>
	      <td class="list_main"><a href="'.$dir.$entry[0].'" target="_blank"><img src="images/control_play.png" border="no"/></a></td>
	      <td class="list_top"><a href="members.php?page=Upload&name='.$entry[0].'" ><img src="images/delete.png" border="no"/></a></td>
	      <td class="list_top">'.$st.'</a></td>
	   </tr>';
}
 
echo '</table>';


Gruß,
Stefan
0

#7 Mitglied ist offline   bardelot 

  • Gruppe: aktive Mitglieder
  • Beiträge: 517
  • Beigetreten: 20. März 04
  • Reputation: 0

geschrieben 02. August 2008 - 14:08

Beitrag anzeigenZitat (Diewie: 02.08.2008, 12:44)

Wenn man unserialize() benutzen will, dann muss man das Array in pics aber auch serialisiert hineinschreiben.

Genau. So war das auch gedacht. Anstatt die Daten immer wieder von String zu Array und umgekehrt zu konvertieren könnten sie in der Datenbank als serialisiertes Array abgespeichert werden.

$temp = $temp + unserialize($row->pics);
$temp = array_merge($temp, unserialize($row->pics));

sind fast gleichwertig, für das reine Anfügen an ein Array sollte sogar erstere Variante verwendet werden.
0

#8 Mitglied ist offline   ps915 

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

geschrieben 02. August 2008 - 14:47

Cool, so funktioniert es Diewi, nur ehrlich gesagt habe ich das noch nicht verstanden.
Ich habe mir mal unserialize() und serialize() auf php.net durchgelesen kann aber den Vorteil nicht erkennen!

Ich verstehe nicht wo der Vorteil ist aus:
Bilder:

Array
(
	[0] => fertig.JPG
	[1] => haus.png
	[2] => apfel.gif
)


sowas
a:3:{i:0;s:10:"fertig.JPG";i:1;s:8:"haus.png";i:2;s:9:"apfel.gif";}
zumachen?

Gruß und danke an bardelot und Diewie, es gibt aber noch klärungsbedarf :D
Toasterfraktion
0

#9 Mitglied ist offline   Diewie 

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

geschrieben 02. August 2008 - 15:31

Beitrag anzeigenZitat (Toasterfraktion: 02.08.2008, 15:47)

Cool, so funktioniert es Diewi, nur ehrlich gesagt habe ich das noch nicht verstanden.
....


Also mein Skript arbeitet nach bardelots Vorlage: Es liest alle bisher verwendeten Bildnamen aus und schreibt diese in ein Array ($temp). Wenn mehrere Bilder in pics aufgeführt sind, spaltet es diese mit preg_split() in ein weiteres Array auf (das \S bedeutet, das alle zusammenhängenden Wörter rausgesucht werden sollen). Mit array_merge() oder auch einfach durch den + Operator werden die Arrays vereinigt. Das array_unique() macht die spätere Suche effizienter, weil es alle Duplikate aussortiert.
Mit in_array() wird schließlich geprüft, ob der gesuchte Dateinamen in dem Array der bisher "getagten" Bilder vorkommt.

Beitrag anzeigenZitat (Toasterfraktion: 02.08.2008, 15:47)

...
Ich habe mir mal unserialize() und serialize() auf php.net durchgelesen kann aber den Vorteil nicht erkennen!

Ich verstehe nicht wo der Vorteil ist aus:
Bilder:

Array
(
	[0] => fertig.JPG
	[1] => haus.png
	[2] => apfel.gif
)


sowas
a:3:{i:0;s:10:"fertig.JPG";i:1;s:8:"haus.png";i:2;s:9:"apfel.gif";}
zumachen?
...


Dieser Repräsentant des Arrays ist quasi eine genaue Anweisung von/für PHP welches Objekt daraus zu machen ist.
a:3:{i:0;s:10:"fertig.JPG";i:1;s:8:"haus.png";i:2;s:9:"apfel.gif";}

a:3: entspricht Array mit 3 Elementen
i:0;s:10:"fertig.JPG"; entspricht Schlüssel Integer 0 => String 10-stellen "fertig.JPG"
usw.

Mit unserialize() kann PHP daraus genau wieder dieses Array herstellen, so wie es vor serialize() war. Wenn man das serialisierte Array nun so als String in der Datenbank speichert, kann man nach dem Auslesen sofort wieder das Ursprungsarray daraus gewinnen ohne irgendwelche splits usw.

Gruß,
Stefan
0

#10 Mitglied ist offline   ps915 

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

geschrieben 02. August 2008 - 18:35

Achso :-) Hört sich nützlich an, danke habs verstanden!

Noch was anderes, ich wollte nicht grade einen neune Threat machen!
Hab mir grade Gedanken um meine Sicherheit gemacht und wollte mich nun vor Mysql Injections schützen.

Reicht es aus die Querys die zu MySQL geschickt werden so zu schützen?
$sql= mysql_real_escape_string("SELECT * FROM hp_partner WHERE status=1 ORDER BY klicks DESC");

Ja, ich weiß da ist keine Eingabe per GET der Post aber mir geht es ums Prinzip! :D

Kann ich dass auch mit den Querys machen die etwas in eine Tabelle schreiben?
Oder ist es besser die gesendeten Daten "Original" zu lassen und beim ausgeben irgendwie zu überprüfen?

Was meint ihr? Welches sind die wichtigsten Funktionen oder Code-Schnipsel gegen Angriffe?

Gruß,
Toasterfraktion
0

#11 Mitglied ist offline   Diewie 

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

geschrieben 02. August 2008 - 18:59

mysql_real_escape_string() ist nicht für die ganze Abfrage gedacht, sondern nur für die einzelnen Strings, die eingefügt werden. (siehe Dokumentation bei php.net). Das kannst und sollst du auch bei den Strings machen, die du in die Datenbank schreibst.
Bei SQL Injections geht es in erster Linie darum, dass man durch malformed Eingaben eigene SQL-Kommandos ausführen kann. Und das muss immer vor der Anfrage an den Datenbankserver verhindert werden.
Ansonsten kannst du eigentlich nicht viel falsch machen. Wenn du XSS und ähnliches verhindern willst, dann lass über alle Ausgaben htmlentities() drüberlaufen.

Gruß,
Stefan
0

#12 Mitglied ist offline   ps915 

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

geschrieben 02. August 2008 - 20:15

Ja, htmlentities() habe ich schon benutzt! Werde deinen Ratschlägen folgen Diewie!

Danke,
Toasterfraktion
0

Thema verteilen:


Seite 1 von 1

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