PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   preg_match in while schleife (https://www.php-resource.de/forum/php-developer-forum/102679-preg_match-in-while-schleife.html)

rammi22 21-02-2012 13:35

preg_match in while schleife
 
Hallo,

eine schleife liest mir einen content aus einer datenbank.
der string $content enthaelt bilder, welche ich mit preg_match innerhalb der schleife rausfilter im dritten argument speicher und dann mit einer foreach() zur ausgabe vorbereite.
das klappt soweit.
allerdings, in der ausgabe, welche innerhalb der schleife erfolgt, werden die aufbereiteten bilder der aktuellen schleife in die nächste while schleife mitgenommen und angezeigt, will sagen, die bilder des vorangegengenden schleifendurchlaufs summieren ich in der nächsten schleife, und zwar so:

schleife 0, content hat bild 1 $imagen_hyper in der ausgabe -> bild 1
schleife 1 , content hat bild 2 und 3 $imagen_hyper in der ausgabe -> bild 1, bild 2, bild 3


WARUM???

script:
PHP-Code:

...
$sql_hyper_news=mysql_query("SELECT
id, asunto, DATE_FORMAT(datum,'%d.%m.%Y') AS datum, content
FROM news ORDER BY datum"
);
echo 
mysql_error();
while(
$zeile_hyper_news=mysql_fetch_array($sql_hyper_news,MYSQL_BOTH))
{
preg_match('|<img src="/imagen/imagen_news/[^>]+>|',$zeile_hyper_news["content"],$treffer);
foreach(
$treffer AS $img_tag)
{
$imagen_hyper.= str_replace('>',' width=50px>',str_replace('src="/','src="../',$img_tag)).'&nbsp;';
}

echo
'
<strong>Modificar mensajes</strong><br><br>
<div style="
padding:5px;
border:solid 1px black;
margin-bottom:5px;
width:350px;
">
<strong>ID:</strong> '
.$zeile_hyper_news["id"].'<br>
<strong>Asunto:</strong> '
.$zeile_hyper_news["asunto"].'<br>
<strong>Escrito en:</strong> '
.$zeile_hyper_news["datum"].'<br>
<strong>Imagen/es:</strong><br>'
.$imagen_hyper.'<hr>
<div align="right"><a href="admin_news.php">
modificar</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="">
eliminar</a></div></div>'
;
}} 

danke für jegliche hilfe

streuner 21-02-2012 14:13

Crossposting: preg_match in while schleife - php.de

mfg streuner

rammi22 21-02-2012 14:27

wie schliesse ich das thema???

streuner 21-02-2012 14:31

Wenn Du schon Crossposting machst, dann weiße darauf hin! Jeder hat ein Thema wo er nicht weiter kommt, oder das wichtig ist - durch öfteres posten in mehreren Bereichen wird das nicht besser!

Lass doch die entsprechenden Variablen in der Schleife ausgeben! Mach richtiges Debugging!

mfg streuner

rammi22 21-02-2012 15:13

war ja nicht in verschiedenen bereichen, sondern auf verschiedenen foren, aber ich habs ja verstanden und entschuldige mich...
im allgemeinen, wenn ich ein problem habe, schau ich ja auch in verschiedene bücher oder frage unterschiedliche personen, das war mein ansatz, ok geht ja nun mal nicht, falsch gedacht...

wenn es dann doch möglich wäre, auf das eigentliche problem zurückzukommen,
also, wie ich dich verstehe, soll ich die geformte variable in der schleife ausgeben lassen. ich meine, ich mach das doch:

while-schleife sucht eintrag in der datenbank -> gefunden, $zeile_hyper_news -> in der while-schleife preg_match des gefundenen content ($zeile_hyper_news) -> variable gebildet ($imagen_hyper) und ausgegeben -> while durchlauf beendet und neu betreten...
das $imagen_hyper soll ja nur für die aktuelle while-schleife existieren und in der folgenden neu gebildet werden auf der grundlage der neuen $zeile_hyper_news...
auch das zurücksetzen der variablen $imagen_hyper mit unset() oder $imagen_hyper='' am ende der while-schleife gibt nicht das gewünschte ergebniss, da jetzt nur noch das erste match ausgegeben wird...

danke rammi

streuner 21-02-2012 15:34

Lass Dir doch die $treffer variable mal ausgeben und schau mal, was da alles drin steckt!

mfg streuner

rammi22 21-02-2012 16:31

hab es jetzt ein weinig umgebaut, ohne wirkliches zufriedenstellendes ergebniss

PHP-Code:


while($zeile_hyper_news=mysql_fetch_array($sql_hyper_news,MYSQL_BOTH))
{
echo 
'<strong>ID:</strong>'.$zeile_hyper_news['id'].'<br>'.
'<strong>Fecha:</strong>'.$zeile_hyper_news['datum'].'<br>'.
'<strong>Asunto:</strong>'.$zeile_hyper_news['asunto'].'<br>';
preg_match('|<img src="/imagen/imagen_news/[^>]+>|',$zeile_hyper_news["content"],$treffer);
foreach(
$treffer AS $img_tag)
{
$img.=str_replace('>',' width=50px>',str_replace('src="/','src="../',$img_tag)).'&nbsp;';
{echo 
$img;}
}

echo 
'<hr>';
}} 


PHP-Code:

foreach($treffer AS $img_tag)
{echo 
$img_tag;} 

Ergebniss: jede schleife mit(!) bild zeigt korrekt 1. match

PHP-Code:

foreach($treffer AS $img_tag)
{
$img.=$img_tag;
echo 
$img;


Ergebniss: schleifen ohne Bild ($treffer) bleiben leer, Schleifen mit Bild ($treffer) werden mit dem alten $img ausgegeben...

-> 1. Schleife Content hat kein bild, $img leer
-> 2. Schleife Content hat 1 bild,
- error_reporting: Notice: Undefined variable: img in C:\xampp\htdocs\puertadelsol1\admin\admin_general.php on line 31
- $img zeigt bild

glaube hier wirds schon klar das problem, die erste foreach sagt das variable img nicht definiert ist...
woher kommt die den? die schleife wurde doch neu angefangen...
zweite foreach zeigt das bild, und dieses bild wird nun in den nächsten schleifen ausgegeben und der eigentliche match der aktuellen schleife in der ausgabe angehangen, allerdings nur bei schleifen mit einem match (sprich bild)...
es bleibt alles beim selben problem, die variable wird an die neue schleife übergeben, und wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben

rammi

streuner 21-02-2012 16:55

Zitat:

es bleibt alles beim selben problem, die variable wird an die neue schleife übergeben, und wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben
ist ja auch logisch! Wenn das Problem nur bei Schleifendurchgängen ohne Bild ist, solltest Du das mit einem If Statement abgreifen/prüfen.

mfg streuner

ezkimo 21-02-2012 17:08

Moin,

Zitat:

Zitat von rammi22 (Beitrag 659491)
glaube hier wirds schon klar das problem, die erste foreach sagt das variable img nicht definiert ist...
woher kommt die den? die schleife wurde doch neu angefangen...

Ebentuell solltest Du Dich noch mal im PHP Manual umschauen und Dich über die Definition einer Variablen erkundigen. Hier mal ein kleines Beispiel, wie es sauber funktioniert.
PHP-Code:

$meineVariableIstEinString '';
foreach (
$datenContainer as $rowset) {
    
$meineVariableIstEinString .= $rowset['irgendEtwas'];


Dein Problem ist doch ganz offensichtlich. Zunächst definierst Du Deine Variable $img nicht außerhalb der Schleife. PHP weiß überhaupt nicht, woher diese Variable kommt und schmeißt somit eine Notice.

Darüber hinaus erweiterst Du in Deinem Code Deine $img Variable immer wieder um das neu gefundene Bild. Alte Daten werden nicht gelöscht. Nehme einfach mein obiges Beispiel und schau Dir das hier an:
PHP-Code:

foreach ($pdo->fetchAll(PDO::FETCH_ASSOC) as $row) {
    
$meineDaten '';
    foreach (
$verschatelteDaten as $daten) {
        
$meineDaten .= $daten;
    }


Du musst PHP schon sagen, dass Dein String, den Du ermitteln willst, immer wieder neu beginnen muss, wenn ein neues Rowset aus der Datenbank ausgelesen wird. Das machst Du nämlich nicht und deswegen hängt PHP alle neuen Strings an den bereits vorhandenen an.

Ein eigentlich einfaches Logikproblem.

ezkimo 21-02-2012 17:13

Darüber hinaus solltest Du ebentuell Deine Datenbankstruktur überdenken. Bilder aus einem HTML Text zu suchen, der aus der Datenbank kommt, ist zwar machbar, aber nicht gerade Performance schonend. Normalisiere Deine Daten und speichere die Bilder eventuell schon vorher in einer separaten Datenbanktabelle. Das macht alles sehr viel einfacher.

rammi22 21-02-2012 17:24

jetzt wirds unübersichtlich für mich...
was wäre logisch?

Zitat:

variable wird an die neue schleife übergeben
wenn ja warum, wenn sie doch erst im preg_match gebildet wird...

oder
Zitat:

wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben
oder beides???
könnte auch sein, das ich den wald vor baumen nicht mehr sehe, meine sitze an diesem teil schon einige stunden...

im jeden fall versuchte ich
PHP-Code:

if(isset($treffer))
{foreach(
$treffer AS $img_tag

selbes fehlerhaftes ergebniss

PHP-Code:

foreach($treffer AS $img_tag)
{if(isset(
$img_tag)) 

selbes fehlerhaftes ergebniss

und egal ob ich unset() oder $img='' mit einbaue, alles provoziert dasselbe verhalten wie ohne if prüfung...

trotzdem danke für deine ratschläge

rammi22 21-02-2012 17:38

Zitat:

Darüber hinaus solltest Du ebentuell Deine Datenbankstruktur überdenken. Bilder aus einem HTML Text zu suchen, der aus der Datenbank kommt, ist zwar machbar, aber nicht gerade Performance schonend. Normalisiere Deine Daten und speichere die Bilder eventuell schon vorher in einer separaten Datenbanktabelle. Das macht alles sehr viel einfacher.
ja, das könnte mir gefallen und alles vereinfachen. aber der content wird mit js über einem editor, welcher das upload von bildern erlaubt, aufbereitet , und der komplette html code in die db gespeichert.
jetzt will ich die möglichekeit geben, auf einer benutzeroberfläche den tabellen eintrag zu löschen und damit auch das bild aus der dem entsprechenden archiv zu tilden...
dafür brauch ich halt den pfad zum bild, deshalb versuche ich ihn aus dem string herrauszufiltern.
gut, das mal ein wenig worum es im allgemeinen geht, und jetzt werde ich mal schauen, wie und ob ich deine tipps für ein positives ergebniss umsetzen kann...
rammi

rammi22 21-02-2012 18:31

problem gelöst...
 
nach schweren stunden des nichts verstehens, ist dann doch die Lösung aufgetaucht, ist auf einem Parralellboard und nachdem ich hier ja drauf hinmgewiesen wurde, weiss ich nicht ob ich den link dahin veröffentlichen darf, wenn es keine probleme verusracht, würde ich es gerne machen, damit nutzer von hier davon auch nutzen tragen können.

Danke an alle beteiligten

gruss rammi

streuner 21-02-2012 18:50

Ich denke nicht, dass jemand damit ein Problem hat (falls ich mich irre, bitte korrigieren!).

mfg streuner

rammi22 21-02-2012 19:05

na dann...
Lösung


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:24 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG