Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
If (mysql_query) [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
If (mysql_query)


 
sepp
27-04-2011, 03:21 
 
Hallo zusammen

Ich finde nirgens einen Ansatz für mein Anfängerproblem, vielleicht kann mir hier jemand einen Tipp geben. Wäre schön.

Folgendes:

Ich habe eine IF Bedingung in diesem Style:
If ($test == "wert1" or $test == "wert2" ...usw.){}

Jetzt kommen aber die Werte aus einer MySql - abfrage:
$query_test = "SELECT * FROM $tab ";
$test = mysql_query($query_test , $conn) or die(mysql_error());
$row_test = mysql_fetch_assoc($test);
$totalRows_test = mysql_num_rows($test);
do{$werte= $row_test['werte'];}
while ($row_test = mysql_fetch_assoc($test));

Wie muss ich nun vorgehen um die werte aus der Abfrage in die if bedingung zu bringen?

 
combie
27-04-2011, 07:55 
 
Mach das doch im SQL!

Und fast 180 Postings, da kannst du dich nicht mehr mit Anfänger raus reden.
Das riecht schon nach selber denk Verweigerung.

 
TobiaZ
27-04-2011, 11:20 
 
es funktioniert auch

if($test == $wert_aus_der_db)

Man kann durchaus auch zwei Variablem miteinander vergleichen.

Vielleicht ist aber auch in_array() für dich interessant.

 
sepp
27-04-2011, 12:54 
 
Ja TobiaZ

Das geht so nur wenn ich mehrere Bedingungen will scheitere ich

if($test == $wert_aus_der_db or $test == $wert_aus_der_db2)

muss es wohl in ein array packen dann oder?

 
combie
27-04-2011, 12:59 
 
Oder besser schon im SQL Statement unterbringen.

 
TobiaZ
27-04-2011, 13:07 
 
die Frage ist halt, was überhaupt erreicht werden soll.

Bisher kann ich nicht erkennen, welche werte, wie worin gespeichert sind. Auch scheint die Variablenbenennung bisher willkürlich und teilweise ungültig.

 
sepp
27-04-2011, 13:55 
 
Ich will eine if Bedingung mit den Bedingungen mit Werten die in der DB gespeichert sind. Sprich die Werte sind nicht manuell gesetzt sondern kommen dynamisch von der Datenbank.

 
boeserfrosch
27-04-2011, 14:58 
 
Aber die Werte aus "$test" müssen doch auch manuell irgendwoher kommen.
Schreibe doch einfach in dein statement rein

where spalte1 = ".$test." or spalte2 = ".$test." ...

 
TobiaZ
27-04-2011, 16:06 
 
Man merkt dann doch, wie die hohe Anzahl Postings und der geringe Kenntnisstand zusammen gehen: Absolut nicht in der Lage eine Problembeschreibung, geschweige denn eigene Ansätze zu liefern!

1) welche Daten stehen in der DB?
2) was soll mit diesen Daten passiern?

Den Ist- und Sollzustand zu posten, kann doch nicht so schwer sein!

 
sepp
27-04-2011, 17:50 
 
also hier die funktionierende Bedingung
if($date != $date_from && ($date < new DateTime("2011-04-24") or $date > new DateTime("2011-05-07")) && ($date < new DateTime("2010-12-20") or $date > new DateTime("2011-01-08")))

nun will ich die Daten (zbsp.2011-05-07) aus der DB nehmen und nicht manuell eingeben, da ich verschiedene Daten habe und diese nicht immer die selben sind versuche ich die aus der DB zu fischen
$abfrage_kalenderdaten = mysql_query ("SELECT * FROM $tab_kalenderdaten");
while ($row = mysql_fetch_array ($abfrage_kalenderdaten))
{
$event_von = $row["datum_event"];
$event_bis = $row["datum_event_end"];

}
also so zu beispiel:
&& ($date < new DateTime("$event_von") or $date > new DateTime("$event_bis"))

das geht auch ausserhalb der while Schleife einwandfrei, nur nimmt er natürlich dann nur den letzten ausgelesenen Datensatz.

 
wahsaga
27-04-2011, 17:57 
 
das geht auch ausserhalb der while Schleife einwandfrei, nur nimmt er natürlich dann nur den letzten ausgelesenen Datensatz.
Na dann pack's in die While-Schleife, genauer in deren Anweisungsblock.

 
sepp
27-04-2011, 22:01 
 
Sorry, wie meinst Du das?

Ich will ja nicht die koplette IF Bedingung in der Schlaufe haben, die soll nur einmal ausgeführt werden. Es soll nur innerhalb der Klammer bei der IF Bedingung die vergleiche Dynamisch ausgeben.

Ich stehe auf dem Schlach, bin vielleicht auch zu doof oder habe Alzheimer....aber ich komme einfach nicht auf die Lösung....HILFE

 
combie
28-04-2011, 08:53 
 
Du denkst zu klein....

Meines Erachtens nach bist du auf einem falschen Weg. Aber dass kann ich dir nur beweisen, wenn ich das GANZE Problem kenne.
Aber den großen Rahmen hältst du geheim.


Behauptungen:
SELECT * FROM $tab_kalenderdaten
Ein Select mit Stern ist immer falsch, und sagt mir auch nichts über die verwendeten Felder.
Ein Select ohne Where ist selten sinnvoll, wann braucht man schon ALLE Daten?
Und zusätzlich vermisse ich dort ORDER BY und LIMIT.

Was von diesen Behauptungen richtig oder falsch ist, entscheidet sich anhand deiner Problemstellung, die ist aber leider geheim.

Deine Idee das im PHP if abzuhandeln kommt mir total seltsam vor, ungewöhnlich, Performance verplempernd. Aber auch das kann ich erst konkretisieren, bzw. eine bessere Lösung anbieten, wenn du dein Problem mal richtig schilderst....

Tipp:
Zeige die Tabellenstruktur und ein paar Testdaten.
Sage was du WIRKLICH erreichen willst.
Beharre nicht auf deinem Weg, denn er könnte/wird falsch sein.

 
sepp
28-04-2011, 12:20 
 
Nein geheim ist nichts.

Ich stelle Kalenderdaten eines bestimmten Wochentag in einem bestimmten Zeitraum dar.

$date_from = new DateTime("2010-08-22");
$date_to = new DateTime("2011-07-22");

for ($date = clone $date_from; $date <= $date_to; $date->modify('next monday'))
{
// hier werden mit der IF Bedingung gewisse Tage ausgeblendet.
if($date != $date_from && ($date < new DateTime("2010-12-20") or $date > new DateTime("2011-01-05")))
{
$tag =$date->format('d');
$monat =$date->format('M');
$woche =$date->format('W');
$jahr =$date->format('Y');
echo $tag.'-'. $monat.'-'.$jahr.'--'.$woche.$i.'<br />';
}

}

Jetzt habe ich aber verschiedene Zeitspannen (Tag) die ich ausblenden will, nicht nur wie im Beispiel vom 20.12.2010 - 05.01.2011.

Die Tabelle beinhaltet nur die Daten der Ausblendzeiten und somit hat diese nur 3 Felder
ID|datum_event_start|datum_event_end

1|20-12-2010|05-01-2011
2|22-10-2010|02-11-2010
3|19-04-2011|30-04-2011

Darum habe ich keine where bedingung oder kein Limit und noch kein Order - weil ich alle Felder und alle Daten darin brauche und diese Tabelle eigens zu diesem Zweck erstellt wurde. Später erstelle ich ein Formular wo ich zusätzliche Daten in diese Tabelle einfügen kann für Tage die auch ausgebelendet werden müssen.

 
combie
28-04-2011, 12:37 
 
Geht doch!
So wirds deutlicher!

Ich würde da ganz stumpf ran gehen...

Weg 1:
Alle Daten in ein Array knallen
Die Daten aus der DB in ein anderes.
Array_Filter() darauf los lassen

Weg 2:
Einen DatumIterator basteln
Die Daten aus der DB in ein Array.
Den DatumIterator mit einem FilterIterator dekorieren

 
AmicaNoctis
28-04-2011, 12:38 
 
Dann musst du in deiner for-Schleife noch eine foreach-Schleife einbauen, welche die (vorher abgerufenen und in einem Array gespeicherten) Ausblendzeiten durchrattert.

Übrigens: $date->format("d-M-Y--W") wäre einfacher als alles einzeln abzurufen und selbst zusammenzustückeln.

 
sepp
29-04-2011, 03:44 
 
ja, richtig ich kann das Array durchrattern lassen.
foreach( $datum_event_von as $var_von ){echo "(".$var_von.")";}

Habe aber 2 array die miteinanderverbunden sind, ich kann ja nciht 2 array in einer foreach schleife haben, wenn ich 2 schleifen machen und diese miteinander verschachtle - dann duchlääuft er eine Schaufe doppelt und es werden wilkürliche Daten ausgegeben.

 
AmicaNoctis
29-04-2011, 06:48 
 
Welche foreach-Variante gibt es denn noch außer dieser?: foreach (... as ...)

Richtig: foreach (... as ... => ...)

Man bekommt für jedes Element eines Array (oder "des einen Array") den Schlüssel und den Wert. Was könnte man wohl mit dm Schlüssel anstellen, wenn es noch mehr Arrays gibt, die mit dem aktuellen verbunden sind?

 
sepp
01-05-2011, 02:10 
 
Ja, klar wie hirnlos von mir, so sollte die Foreach aussehen.
foreach( $datum_event_von as $var => $i)
{
echo= "(".$datum_event_von[$var]."bis".$datum_event_bis[$var].")";
}

Jezt habe ich aber das sêlbe Problem wie wenn ich direkt die While Schleife in die For schleife bauen würde.

 
sepp
03-05-2011, 01:58 
 
Ich verzweifle an dem Problem....

Wie um alles in der Welt soll ich es nur angehen.

Eine Foreach schleife ist gleich viel wert wie die while schleife. Ich muss ein $string zusammen bauen lassen in der Schleife die alle Werte enthält die später dann ich die Bedingung kommt.

Nur wie mache ich das?

Denn wenn ich innerhalb der Schleife folgendes ausgebe
echo"&& ($date < new DateTime(".$datum_event.") or $date > new DateTime(".$datum_event_end."))";


bekomme ich den richtigen String zu sehen - wie kann ich den aber in eine $var stecken?

So wird die variable bei jedem durchgang ja wieder neu geschrieben, bzw. überschieben.
$var = "&& ($date < new DateTime(".$datum_event.") or $date > new DateTime(".$datum_event_end."))";

 
AmicaNoctis
03-05-2011, 06:49 
 
Hallo,

das sieht ja aus, als wolltest du PHP-Code dynamisch erzeugen. Warum? Das ist nämlich in 99% aller Fälle eine schlechte Idee.

Ursprünglich wolltest du bestimmte Daten ausblenden, was gleichbedeutend ist mit: alles anzeigen, was nicht so ein bestimmtes Datum ist. Die Daten die angezeigt werden sollen, was passiert dann mit denen? Darauf solltest du dich konzentrieren, statt irgendwelche merkwürdigen PHP-Code-Strings zusammenzubasteln.

Gruß,

Amica

 
sepp
03-05-2011, 16:15 
 
Ja, da hast Du recht, ich suchte einfach nach Möglichkeiten.

Nun habe ich alles in die While schleife gepackt und versuche so auszugrenzen das nicht alle Daten bei jedem Durchlauf immer wieder angezeigt werden und die angegebenen Daten ebenso ausgrenzt.

Also bin ich bereits auf Deiner Spur und überlege mir wie was angezeigt werden muss.

Leider noch immer ohne Erfolg....bastle weiter

Mein Gott ich verzweifle echt an dieser Sch....! Kann mir denn niemand einen Tipp geben wie ich es angehen kann - finde nirgens einen Ansatz weder auf Google noch sonst wo....HIIIILLLLFFFEEEEEEE


Wenn ich die while Schleife innerhalb der for-Schleife mache habe ich zum einen folgendes Problem - alle Daten werden je Anzahl Datenzatzeiträge bzw. zeilen Duchläufe vervielfacht.

while ($row_test = mysql_fetch_assoc($test))
{
$datum_event=$row_test['datum_event'];
$datum_event_end=$row_test['datum_event_end'];

if($date >= new DateTime($datum_event) && $date <= new DateTime($datum_event_end))
{
$date1=$date->format("Y-m-d");
echo $date1<br />';
}

So bekomme ich nun alle Tage die nicht angezeigt werden sollten.

wenn ich nun folgend die Bedingun schreibe

if ($date != new DateTime($date1))
{
echo $tag.'-'. $monat.'-'.$jahr.'--'.$woche.'+'.$i.'<br />';
}

so wird zwar das Datum ausgeblendet aber nur von einem zeile der DB beim nächsten Durchlauf nimmt er diesen wieder mit.


und das Problem mit dem muliplizieren wollten ich wie folgt angehen

if ($date != new DateTime($date_geschrieben))
{
echo $tag.'-'. $monat.'-'.$jahr.'--'.$woche.'+'.$i.'<br />';
$date_geschrieben=$date->format("Y-m-d");
}
Geht aber auch nicht aus dem selben Grund - nun nimmt er nur noch die Daten aus der ersten Zeile der DB.


Wenn ich aber alles umdrehe die for Schleife innerhalb der while- Schleibe mache dann geht es.

while ($row_test = mysql_fetch_assoc($test))
{
$datum_event=$row_test['datum_event'];
$datum_event_end=$row_test['datum_event_end'];
for ($date = clone $date_from; $date <= $date_to; $date->modify('next monday'))
{
$tag =$date->format('d');
$monat =$date->format('M');
$woche =$date->format('W');
$jahr =$date->format('Y');
if($date != $date_from)
{
if($date >= new DateTime($datum_event) && $date <= new DateTime($datum_event_end))
{
$dd1 =$date->format("Y-m-d");
}
if ($date != new DateTime($dd) && $date != new DateTime($dd1))
{
$dd =$date->format("Y-m-d");
echo $tag.'-'. $monat.'-'.$jahr.'--'.$woche.'<br />';
}
}
}
}



Shit geht doch nicht!!! ;-(

 
sepp
04-05-2011, 16:40 
 
Ich suche noch immer nach Lösungen - hatt denn niemand eine Idee?


Schadee, dass mir niemand mehr helfen will! ;-(

 
sepp
09-05-2011, 14:25 
 
Nun habe ich die Lösung. OHNE EURE MITHILFE!!!

Schade, dass mir nicht einmal jemand geraten hatte das ganze umzukehren.

Die Tage in ein Array laden und dann mittels For Schleife diese durchlaufen lassen wobei darin die MySQL Abfrage gemacht wird und nur die angezeigt werden welche keine Ergebnisse ausgeben.

$date_from = new DateTime('2010-08-22');
$date_to = new DateTime('2011-07-22');


/* Tage ermitteln */
$days = array();
for ( $date = clone $date_from; $date <= $date_to; $date->modify('next Wednesday') )
{
if ($date != $date_from)
{
$days[] = clone $date;
}
}

/* Ausgabe der Tage*/
for ( $i = 0; $i < count($days); $i++ )
{
$date = $days[$i];
$daydate = $date->format('Y-m-d');
$resource = mysql_query("SELECT * FROM $tab_kalenderdaten WHERE datum_event <= '$daydate' AND datum_event_end >= '$daydate' ");
if ( mysql_num_rows($resource) < 1 )
{
echo $date->format('d-M-Y--W') . '<br />' . "\n";
}
unset($date);
}

 
AmicaNoctis
09-05-2011, 14:35 
 
Schade, dass mir nicht einmal jemand geraten hatte das ganze umzukehren.

Ja, echt schade, dass du nun 46 Datenbankabfragen machst, statt nur einer, wie wir vorgeschlagen hatten. Dass du die Tipps nicht verstanden hast, heißt nicht, dass dir hier niemand geholfen hat. ;)

 
combie
09-05-2011, 14:36 
 
SQL Statements in Schleifen sind böse!
Vermutlich hat dir darum keiner den Tipp gegeben.

 
sepp
10-05-2011, 02:42 
 
Ja, das ist echt schade...da hast Du wohl recht.

Auch die SQL Statements in Schleifen sind böse - das stimmt.

Das sind doch Tipps wie sie immer kommen - schwammig, als Rätsel, etwas hämisch und ein bisschen überheblich. Warum kann man nicht einfach schreiben:
Super das Du zur Lösung gefunden hast aber man sollte vermeiden innerhalb einer Schleife ein SQL Statements zu machen. Und zudem läuft nun bei Deinem Beispiel die Abfrage 46 mal (nämlich je Tag) durch.
Ich würde auch die SQL Statements in ein Array packen und dann alles miteinander zu vergleichen.

So könnte man doch wertvolle und zielgerichtete Tipps geben.

Denn dann kommt das heraus:

date_default_timezone_set('Europe/Berlin');

$date_from = new DateTime('2010-08-22');
$date_to = new DateTime('2011-07-22');

/* Datensaetze holen nicht anzeigen*/
$kalenderdaten = array();
$abfrage_kalenderdaten = mysql_query("SELECT * FROM $tab_kalenderdaten WHERE event_art = 'ausblenden'");
while ( $row = mysql_fetch_array ($abfrage_kalenderdaten) )
{
$kalenderdaten[] = array(
'start' => $row['datum_event_start'],
'end' => $row['datum_event_end']
);
}


/* Tage ermitteln */
$days = array();
for ( $date = clone $date_from; $date <= $date_to; $date->modify('next Wednesday') )
{
$days[] = clone $date;
}


/* Tage in Eventzeiten */
$tage_in_eventdate = array();
for ( $i = 0; $i < count($kalenderdaten); $i++ )
{
$event_start = new DateTime($kalenderdaten[$i]['start']);
$event_end = new DateTime($kalenderdaten[$i]['end']);
for ( $j = 0; $j < count($days); $j++ )
{
if ( $days[$j] > $event_end ) { break; }
if ( $days[$j] >= $event_start && $days[$j] <= $event_end && !in_array($days[$i]->format('Y-m-d'), $tage_in_eventdate) )
{
$tage_in_eventdate[] = $days[$j]->format('Y-m-d');
}
}
unset($event_start);
unset($event_end);
}



/* Ausgabe */
for ( $j = 0; $j < count($days); $j++ )
{
if ( !in_array($days[$j]->format('Y-m-d'), $tage_in_eventdate)
{
echo $days[$j]->format('Y-M-d--W') . '<br />' . "\n";
}
}



Nun bin ich gespannt was ich nun wieder falsch gemacht habe, es läuft und macht mir Freude. Danke Jungs

 
combie
10-05-2011, 07:15 
 
Danke Jungs
Und Mädchen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:55 Uhr.