Datenbank abfragen anhand von Vergleich zweier Felder mit explode

_flat_eric_

Grünschnabel
Hallo zusammen. Ich bin PHP Anfänger und sitze schon seit Tagen an einem Problem. Das will ich machen:

ich möchte keywords aus Feld1 "metakey" auslesen, diese mit keywords aus Feld2 "cb_suchbegriffe" vergleichen. Wenn ein keyword aus Feld1 mit einem aus Feld2 übereinstimmt, sollen Felder aus der Zeile von Feld2 ausgegeben werden.


Hier mein Code:

Code:
//Content ID

$content_id = JRequest::getVar( 'id', 0, '', 'int' );

//Keywords

$metakey = "SELECT metakey FROM jos_content WHERE id = '$content_id'";
$erg_metakey = mysql_query( $metakey );
$keywords = mysql_fetch_array( $erg_metakey, MYSQL_ASSOC);

$keyscontent = $keywords['metakey'];
$arraycontent = explode(", ", $keyscontent);

//Passenden Content suchen

$profiprofil = "SELECT cb_profi, cb_bundesland, schwerpunkt, avatar, website, cb_artikelunterschrift, cb_suchbegriffe FROM jos_comprofiler 

//Vergleich der Keywords aus Feld2 mit Feld1

WHERE cb_suchbegriffe LIKE '%$arraycontent[0]%'
OR cb_suchbegriffe LIKE '%$arraycontent[1]%'
OR cb_suchbegriffe LIKE '%$arraycontent[2]%'
OR cb_suchbegriffe LIKE '%$arraycontent[3]%'
OR cb_suchbegriffe LIKE '%$arraycontent[4]%'
OR cb_suchbegriffe LIKE '%$arraycontent[5]%'";



$erg_profiprofil = mysql_query( $profiprofil );

while ($kurzprof = mysql_fetch_array( $erg_profiprofil, MYSQL_ASSOC))
{
echo $kurzprof[cb_suchbegriffe]." ".$kurzprof[website]."<br>";
}

?>

Meine Probleme:

1. die Lösung ab "//Passenden Content suchen" ist wahrscheinlich alles andere als professionell, vor allem weil ich nicht weiß, wie viele Keywords sich im jeweiligen Feld Metakeys befinden.

2. das Skript funktioniert nur, wenn genau 5 Keywords im Feld Metakeys enthalten sind. Wenn es weniger sind, werden auch Felder ausgegeben, bei denen das Feld Metakeys leer sind.

Wie gesagt, ich bin Anfänger und beschäftige mich erst seit 2 Wochen mit PHP und ich hoffe, mir kann hier jemand helfen. Vielen Dank schon mal für Eure Geduld.
 
hi,

dir käme die Verwendung von WHERE cb_suchbegriffe IN($string) recht ;)
$string = 'milch,kuh,bauer,wiese';
Dann brauchst du auch nichts mit explode aufspalten. (Ob leerzeichen zwischen den einzelnen Begriffen und den Kommas erlaubt sind... keine ahnung, ausprobieren) :D
 
Das Problem bei der Verwendung von IN liegt darin, dass es tatsächlich nur vollständige Vergleiche durchführt.
Code:
SELECT `col` FROM `table` WHERE `col` IN ('foo', 'bar', 'bla');
Gibt tatsächlich nur Datensätze zurück, bei denen der Inhalt in `col` identisch mit einem der drei Angaben ist. "foobar" hingegen würde beispielsweise ausgeschlossen werden.
Sofern du auf die Wildcards ("%") vor und hinter dem Suchbegriff verzichten kannst, ist es ein effizienter Weg es über IN zu lösen.

Solltest du nicht darauf verzichten können, hier mal ein trivialer Ansatz, der weder elegant noch effizient ist:
PHP:
<?php
//Content ID
$content_id = JRequest::getVar( 'id', 0, '', 'int' );

//Keywords
$metakey = "SELECT metakey FROM jos_content WHERE id = '$content_id'";
$erg_metakey = mysql_query( $metakey );
$keywords = mysql_fetch_array( $erg_metakey, MYSQL_ASSOC);

$keyscontent = $keywords['metakey'];
$arraycontent = explode(", ", $keyscontent);

$where = array();
foreach ( $arraycontent as $content ) {
	$where[] = "`cb_suchbegriffe` LIKE '%" . mysql_real_escape_string( $content ) . "%'";
}

//Passenden Content suchen
$profiprofil = "
		SELECT
			`cb_profi`,
			`cb_bundesland`,
			`schwerpunkt`,
			`avatar`,
			`website`,
			`cb_artikelunterschrift`,
			`cb_suchbegriffe`
		FROM
			`jos_comprofiler`
		" . ((empty($where)) ? "" : "WHERE " . implode( " OR ", $where ) ) . "
		;";

$erg_profiprofil = mysql_query( $profiprofil );

while ($kurzprof = mysql_fetch_array( $erg_profiprofil, MYSQL_ASSOC))
{
	echo $kurzprof['cb_suchbegriffe']." ".$kurzprof['website']."<br>";
}

Ein grundlegendes Problem, was ich hierbei jedoch sehe ist, dass das von dir verwendete Datenbankschema suboptimal organisiert ist. Ich empfehle dir mal einen Blick auf Datenbank-Normalisierung ans Herz.
Wenn du die Metakeys seperat speicherst und via Key über eine Relation mit den Profilen verbindest, kannst du das Gefummel auf eine sinnvolle Art und Weise über einfache Joins in einer Abfrage lösen.

Des Weiteren solltest du dir möglichst abgewöhnen Verarbeitung und Ausgabe zu mischen. Sobald du die Grundlagen der Sprache verstanden hast, solltest du dich mit einem Framework (wie zB Zend Framework oder CodeIgniter) befassen, welches dich im Schreiben von sauberem Code unterstützt.
 
Vielen Dank maeTimmae, so funktionierts! Bis auf eine Sache: wenn in dem ersten Feld (keywords) nichts drin steht, dann werden alle Einträge aufgelistet, bei denen im zweiten Feld (cb_suchbegriffe), gar nichts steht, also auch nicht "NULL"

Des Weiteren solltest du dir möglichst abgewöhnen Verarbeitung und Ausgabe zu mischen. Sobald du die Grundlagen der Sprache verstanden hast, solltest du dich mit einem Framework (wie zB Zend Framework oder CodeIgniter) befassen, welches dich im Schreiben von sauberem Code unterstützt.

ja, danke für den Tipp, das mach ich. Wie gesagt, meine PHP Kenntnisse sind zur Zeit noch weniger als Anfängerniveau
 
Zurück