PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Schleife


consch
02.06.2009, 02:48:54
Hallo,

ich habe folgendes Programm (siehe Anhang).
In den Teil mit der Abfrage1 wird nicht hineingegangen.
Kann vielleicht jem. helfen wo der Fehler liegt?
Es scheint an dem if (count ... != 0) zu liegen, darf ich das an der Stelle nicht verwenden? Würde mich freuen, wenn mir jem. helfen kann.

feuervogel
02.06.2009, 12:30:02
glaubst du wirklich, dass dir jemand hilft, wenn du so viele hürden aufbaust?

cortex
03.06.2009, 16:29:47
so viele hürden aufbaust?

gemeint ist: http://www.selfphp.de/forum/showthread.php?p=128153#4

cx

consch
03.06.2009, 16:32:09
Ja okay, dann mach ich das nachher mal mit dem posten der Datei.
Finde nur, dass man das dann nicht richtig nachvollziehen kann, da man so ja nicht das Programm ausführen kann. Aber okay, dann mache ich das nachher mal.
Danke bis hierhin.

*EDIT*
<?

$search = $_POST["search"];

function mark_words ($text, $words, $colors = false) {
// wenn kein Array mit Farbangaben übergeben wird ...
// ... diese Standardfarben verwenden

if (!$colors || !is_array($colors) ) {
$colors = array('#ff9999', '#ffff99', '#ff99ff', '#99ffff','#99ff99');
}
$c = 0;
// Schleife über alle Suchbegriffe
foreach ($words as $w) {
// ggf. Metazeichen im Suchbegriff escapen
$w = preg_quote(trim($w));
if($w=='') {
continue;
}
$regexp = "/($w)(?![^<]+>)/i";
$replacement = '<b style="background-color:'.$colors[$c].'">\\1</b>';
$text = preg_replace ($regexp,$replacement ,$text);
$c++;
if ($c >= count($colors)) {
$c=0;
}
}
return $text;
}

//Prüfung, ob Suchbegriff eingegeben wurde - Ende
if(isset($_POST["search"])){
//Zusatzdaten in ExtraDatei speichern
require_once("moreinfos.php");

//Suchewörter aufsplitten
$searchstring = $search;
$array = explode(' ',$searchstring);
for($x = 0; $x < count($array); $x++) {
// count(Suchwörtern) > 1 => Operator AND hinzufügen, da jedes Wort einzeln in den Feldern gesucht werden soll
if ($x > 0 && $x < count($array)) {
$sqlsearchstring .= " AND"; //nur Datensätze, in denen alle Suchwörter vorkommen
$sqlsearchstring2 .= " OR"; //alle Datensätze, in denen jedes einzelne Wort vorkommt
}
$sqlsearchstring .= " (s.name LIKE '%".$array[$x]."%' OR s.strasse LIKE '%".$array[$x]."%' OR s.ort LIKE '%".$array[$x]."%' OR s.zweck LIKE '%".$array[$x]."%')";
$sqlsearchstring2 .= " (name LIKE '%".$array[$x]."%' OR strasse LIKE '%".$array[$x]."%' OR ort LIKE '%".$array[$x]."%' OR zweck LIKE '%".$array[$x]."%')";
}
} else {
echo "KEIN SUCHBEGRIFF VORHANDEN";
}

if(isset($_POST['aufgabengebiet']) && is_array($_POST['aufgabengebiet'])){
/* Suche Aufbereiten */
$search_files = '';
foreach ($_POST['aufgabengebiet'] as $ao) {
if ($search_files == '') {
$search_files = 'v.id_Bereich = '.intval($ao);
} else {
$search_files .= ' OR v.id_Bereich = '.intval($ao);
}
}//ende foreach
} else {
$search_files = 0;
//echo $search_files;
//echo "Kein Checkboxauswahl";
}

//Verbindung zur DB herstellen
require_once("dbconnect.php");

//Ergebnisausgabe
echo "<h1 align=center><u>Suchergebnis</u></h1><br><br><br>";

//Daten aus MySql-Datenbank holen
$abfrage = "SELECT v.*, s.name, s.strasse, s.plz, s.ort, s.zweck, b.txt_Bereich FROM tblStiftung2Bereiche AS v
LEFT JOIN stiftungsdaten s ON v.id_Stiftung = s.id_Stiftung
Left JOIN tblBereiche b ON v.id_Bereich = b.id_Bereich
WHERE $sqlsearchstring AND $search_files";

$abfrage2 = "SELECT v.*, s.name, s.strasse, s.plz, s.ort, s.zweck, b.txt_Bereich FROM tblStiftung2Bereiche AS v
LEFT JOIN stiftungsdaten s ON v.id_Stiftung = s.id_Stiftung
Left JOIN tblBereiche b ON v.id_Bereich = b.id_Bereich
WHERE $sqlsearchstring OR $search_files";

$abfrage3 = "SELECT v.*, s.name, s.strasse, s.plz, s.ort, s.zweck, b.txt_Bereich FROM tblStiftung2Bereiche AS v
LEFT JOIN stiftungsdaten s ON v.id_Stiftung = s.id_Stiftung
Left JOIN tblBereiche b ON v.id_Bereich = b.id_Bereich
WHERE $sqlsearchstring2 OR $search_files";

// echo $abfrage; //irgendwie wird $search_files nicht mit reingenommen :(

$ergebnis = mysql_query($abfrage) or die (mysql_error());
$ergebnis2 = mysql_query($abfrage2) or die (mysql_error());
$ergebnis3 = mysql_query($abfrage3) or die (mysql_error());
$res = array();
$subres = array();
while($row = mysql_fetch_object($ergebnis)) {
$res [$row->id_Stiftung] = array('Name' => $row->name, 'Strasse' => $row->strasse, 'PLZ' => $row->plz, 'Ort' => $row->ort, 'Zweck' => $row->zweck);
$subres[$row->id_Stiftung][$row->id_Bereich] = $row->txt_Bereich;
}
if (count($res) != 0) {
echo "bin in der Abfrage1";
$ausgabe = '<center><b>Gefundene Datensätze: '.count($res).'<b></center><br><br>';
$ausgabe .= '<table width="60%" frame="below" align="center>"';
} else {
while($row = mysql_fetch_object($ergebnis2)) {
$res [$row->id_Stiftung] = array('Name' => $row->name, 'Strasse' => $row->strasse, 'PLZ' => $row->plz, 'Ort' => $row->ort, 'Zweck' => $row->zweck);
$subres[$row->id_Stiftung][$row->id_Bereich] = $row->txt_Bereich;
}
if (count($res) != 0) {
echo "bin in der Abfrage2";
$ausgabe = '<center><b>Gefundene Datensätze: '.count($res).'<b></center><br><br>';
$ausgabe .= '<table width="60%" frame="below" align="center>"';
} else {
while($row = mysql_fetch_object($ergebnis3)) {
$res [$row->id_Stiftung] = array('Name' => $row->name, 'Strasse' => $row->strasse, 'PLZ' => $row->plz, 'Ort' => $row->ort, 'Zweck' => $row->zweck);
$subres[$row->id_Stiftung][$row->id_Bereich] = $row->txt_Bereich;
}
if (count($res) != 0) {
echo "bin in der Abfrage3";
$ausgabe = '<center><b>Gefundene Datensätze: '.count($res).'<b></center><br><br>';
$ausgabe .= '<table width="60%" frame="below" align="center>"';
} else {
echo "KEINE DATEN ZU IHRER ANFRAGE ENTHALTEN!";
}
}
}

foreach ($res as $key => $value) {
$ausgabe .= '<tr>
<td width="50%" align="center" valign="middle">
Name: '.$res[$key][Name].'<br>
Strasse: '.$res[$key][Strasse].'<br>
Ort: '.$res[$key][PLZ].' '.$res[$key][Ort].'<br>
</td>
<td width=50% valign=middle>
'.$res[$key][Zweck].'<br><br>
Treffer: '.implode(', ',$subres[$key]).'
</td>
</tr>';
}

$ausgabe .= '</table>';

//Portraitanzeige
print $ausgabe;

//Verbindung zur DB trennen
require_once("dbdisconnect.php");
?>

cortex
03.06.2009, 16:52:03
Finde nur, dass man das dann nicht richtig nachvollziehen kann

eben doch - die meisten probleme werden beim drüberschauen erkannt .-

da man so ja nicht das Programm ausführen kann

eine entsprechende php-datei kann man ganz fix erstellen: cntrl-a / cntrl-v

cx

feuervogel
03.06.2009, 21:23:13
Ja okay, dann mach ich das nachher mal mit dem posten der Datei.
Finde nur, dass man das dann nicht richtig nachvollziehen kann, da man so ja nicht das Programm ausführen kann. Aber okay, dann mache ich das nachher mal.
Danke bis hierhin.


finde ich auch. deswegen reduzierst du deinen code auch auf eine minimum, so dass das problem reproduziert wird, aber nicht lauter unnötiger code drum herum steht.

du könntest du z.b. prüfen, ob das sql-statement, das du ausführst, tatsächlich genau so aussieht, wie du erwartest.

consch
03.06.2009, 22:27:25
Das statement liefert das richtige Ergebnis aber komischerweise geht er bei einem Suchwort in Abfrage2 und nicht in Abfrage1. Deshalb die Vermutung, dass es an der while-Schleife liegt. Aber leider bekomm ich den Fehler nicht weg.
Wie genau ist das mit cntrl-a / cntrl-v gemeint?

vt1816
03.06.2009, 23:55:24
[...]
Wie genau ist das mit cntrl-a / cntrl-v gemeint?

COPY & PASTE

Indyk
04.06.2009, 09:40:05
@consch
hast du dir nach der while schleife, und vor der if bedingung mal den array ausgeben lassen? z.B::

echo '<pre>'. print_r($res, TRUE) .'</pre>';


der einzige grund warum er dort nicht reingehen sollte ist das count 0 zurück gibt. Das wäre entweder bei 0 feldern oder wenn $res == NULL ist.

@cortex, vt1816
wäre das nicht cntrl-c /strg-c und nicht a?

feuervogel
04.06.2009, 09:50:24
Das statement liefert das richtige Ergebnis aber komischerweise geht er bei einem Suchwort in Abfrage2 und nicht in Abfrage1. Deshalb die Vermutung, dass es an der while-Schleife liegt. Aber leider bekomm ich den Fehler nicht weg.
Wie genau ist das mit cntrl-a / cntrl-v gemeint?

du bist dir also zu 100% sicher, dass


while($row = mysql_fetch_object($ergebnis)) {
$res [$row->id_Stiftung] = array('Name' => $row->name, 'Strasse' => $row->strasse, 'PLZ' => $row->plz, 'Ort' => $row->ort, 'Zweck' => $row->zweck);
$subres[$row->id_Stiftung][$row->id_Bereich] = $row->txt_Bereich;
}


diese schleife ausgeführt wird? das hast du auch geprüft mit einem print zum test innerhalb des while?

consch
04.06.2009, 23:38:32
@consch
hast du dir nach der while schleife, und vor der if bedingung mal den array ausgeben lassen? z.B::

echo '<pre>'. print_r($res, TRUE) .'</pre>';

Habe ich gerade mal getestet. Als Ausgabe erhalte ich:
Array
(
)

@feuervogel:
die wird leider doch nicht ausgeführt - die while-Schleife.

Ich habe mir das noch mal angeschaut. Es liegt vielleicht an dem $search_files. Wenn ich keine checkbox auswähle, dann steht in $abfrage folgendes:
SELECT v.*, s.name, s.strasse, s.plz, s.ort, s.zweck, b.txt_Bereich FROM tblStiftung2Bereiche AS v LEFT JOIN stiftungsdaten s ON v.id_Stiftung = s.id_Stiftung Left JOIN tblBereiche b ON v.id_Bereich = b.id_Bereich WHERE (s.name LIKE '%tanne%' OR s.strasse LIKE '%tanne%' OR s.ort LIKE '%tanne%' OR s.zweck LIKE '%tanne%') AND 0

Könnte es sein, dass diese 0 Probleme macht?

Indyk
05.06.2009, 08:53:34
denkst du nicht es wäre einfacher es zu testen als hier auf eine antwort zu warten?
Bei mir ergibt eine Abfrage mit AND 0 zumindest einen Syntaxfehler. (nur in msssql getestet)

cortex
05.06.2009, 10:34:19
wäre das nicht cntrl-c /strg-c und nicht a?

cntrl-a markiert i.d.r. alles... wenn nicht, darfst du das zumindest metaphorisch verstehen .-

cx

consch
05.06.2009, 14:48:19
@Indyk: ja ich dachte evt. kann jem. helfen. Es kommt bei mir keine Fehlermeldung.
Wenn mir keiner helfen kann, dann habe ich leider pech gehabt, aber denke versuchen kann ich es mal, denn so bin ich auch nicht weitergekommen...

Indyk
05.06.2009, 14:57:31
was verstehst du unter hilfe?
dir zusagen das du das AND 0 rausnehmen sollst?

feuervogel
05.06.2009, 16:22:32
@Indyk: ja ich dachte evt. kann jem. helfen. Es kommt bei mir keine Fehlermeldung.
Wenn mir keiner helfen kann, dann habe ich leider pech gehabt, aber denke versuchen kann ich es mal, denn so bin ich auch nicht weitergekommen...

wie kommt das AND 0 denn in dein statement rein?

consch
06.06.2009, 00:35:28
wie kommt das AND 0 denn in dein statement rein?
Es ist so, dass ich ein Suchfeld habe und checkboxen. Wenn nun ein Suchwort eingegeben wird, aber keine checkbox ausgewählt wird, dann ist search_files = 0
Da kommt die null her.

*EDIT*
Wenn ich das mit search_files ändere in:
if(isset($_POST['aufgabengebiet']) && is_array($_POST['aufgabengebiet'])){
/* Suche Aufbereiten */
$search_files = '';
foreach ($_POST['aufgabengebiet'] as $ao) {
if ($search_files == '') {
$search_files = 'v.id_Bereich = '.intval($ao);
} else {
$search_files .= ' OR v.id_Bereich = '.intval($ao);
}
}//ende foreach
}

Und im Suchwort behind eingebe und keine checkbox auswähle dann kommt folgende Fehlermeldung:
SELECT v.*, s.name, s.strasse, s.plz, s.ort, s.zweck, b.txt_Bereich FROM tblStiftung2Bereiche AS v LEFT JOIN stiftungsdaten s ON v.id_Stiftung = s.id_Stiftung Left JOIN tblBereiche b ON v.id_Bereich = b.id_Bereich WHERE (s.name LIKE '%behind%' OR s.strasse LIKE '%behind%' OR s.ort LIKE '%behind%' OR s.zweck LIKE '%behind%') AND You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

vt1816
06.06.2009, 00:58:15
Zeige doch mal den kompletten Code, wie Du Deinen SQL-String zusammensetzt. Das og. kann ja nicht alles sein. Wo kommt das AND her?

feuervogel
06.06.2009, 10:46:56
natürlich kommt dann die fehlermeldung. $_POST['aufgabengebiet'] ist leer, am ende des sql-statements steht AND und nichts weiter, was zu dem fehler führt. wenn also keine checkbox ausgewählt wurde darf da kein and stehen.

consch
07.06.2009, 19:00:02
@vt1816: der Code steht auf der ersten Seite dieses Themas.
@feuervogel: Okay, dann versuche ich das mal zu ändern. Danke.

vt1816
07.06.2009, 21:30:22
if ($x > 0 && $x < count($array)) {
$sqlsearchstring .= " AND";
$sqlsearchstring2 .= " OR"; }


erst unmittelbar verwenden wenn Du auch geprüft hast, dass da auch noch was kommt.

consch
08.06.2009, 00:05:23
ja Danke - ich versuche es mal.
Werde dann berichten :)

*EDIT*
es hat jetzt geklappt, habe folgendes in der Datei geändert: if(empty($search_files)){
$abfrage = "SELECT ...
WHERE $sqlsearchstring";
$abfrage2 = "SELECT ...
WHERE $sqlsearchstring";
$abfrage3 = "SELECT ...
WHERE $sqlsearchstring2";
} else {
$abfrage = "SELECT ...
WHERE $sqlsearchstring AND $search_files";
$abfrage2 = "SELECT ...
WHERE $sqlsearchstring OR $search_files";
$abfrage3 = "SELECT ...
WHERE $sqlsearchstring2 OR $search_files";
}
Vielen Dank für Eure Hilfe.