Willkommen in der Webstatt Zum Webstatt Blog und Stories
matthias b. matthias b. am 21.11.06 05:58

nach 5h vergeblicher suche im netz bin ich nahe drann aus dem fenster zu springen. aber keine angst, ich wohne im erdgeschoss. :D

nun, worum gehts...?
ein freundlicher nachbar war so nett und hat mir, bekannt als php-noob, ne kleine datenbank für ein browsergame gemacht.
da es sich um ein sonnensystem handelt welches pro sternensystem 16 koordinaten und allerlei informationen enthält, war eine copy/past lösung angebracht.
es wird also das komplette sternensystem als text gespeichert und bei der suche auch wieder so ausgegeben.

und nun zum problem:
die suche nach einem einzelnen spielernamen ( z.b. Arcturus ) liefert mit folgendes ergebniss:

1 • ¤ LS ¤ ZU VERMIETEN Arcturus
2 • ¤ LS ¤ Vivatown Vivajohn
3 # ¤ LS ¤ :::: BC-MM-02 Arcturus
4 # ¤ LS ¤ :::: BC-MM-01 Arcturus
5 • =|BC|= Tenacious G Jack Black
6 # ¤ LS ¤ NOX Outpost BlackSheep
7 # =|BC|= Tenacious D Jack Black
8 • QinShi Tanus -John-
9 • ¤ LS ¤ Exodus BlackSheep
10 • =|BC|= Atlantus Cynred (u)
11 • =|BC|= Jesiri Cynred (u)
12 • =|BC|= Manes Cynred (u)
13 • ¤ LS ¤ DWX Outpost BlackSheep
14 # =|BC|= HAL9005 HAL9000
15 # ¤ LS ¤ °|!|° BlackSheep
16 • ¤ LS ¤ Vivacity Vivajohn

was ich nun suche ist eine möglichkeit nur DIE ZEILEN anzeigen zu lassen in der auch der SUCHBEGRIFF vorkommt.

das sollte dann in etwa so aussehen ( suchbegriff "BlackSheep" ):


6 # ¤ LS ¤ NOX Outpost BlackSheep
7 # =|BC|= Tenacious D Jack Black
9 • ¤ LS ¤ Exodus BlackSheep
13 • ¤ LS ¤ DWX Outpost BlackSheep
15 # ¤ LS ¤ °|!|° BlackSheep

wer gerne mal einen blick auf den bisherigen code werfen will, bitte:

<?php
session_start();
include("config.inc.php");
include("auth.php");
// $rang = $_SESSION['rang'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title><? print $area ?></title></head>
<script type="text/javascript">
var stripe = function() {
var tables = document.getElementsByTagName("table");
for(var x=0;x!=tables.length;x++){
var table = tables[x];
if (! table) { return; }

var tbodies = table.getElementsByTagName("tbody");

for (var h = 0; h < tbodies.length; h++) {
var even = true;
var trs = tbodies[h].getElementsByTagName("tr");

for (var i = 0; i < trs.length; i++) {
trs[i].onmouseover=function(){
this.className += " ruled"; return false
}
trs[i].onmouseout=function(){
this.className = this.className.replace("ruled", ""); return false
}
if(even)
trs[i].className += " even";

even = !even;
}
}
}
}
window.onload = stripe;
</script>
<link rel="stylesheet" href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>

<?
echo "<div class='menueleiste'>";
echo "<strong>Status: </strong>";
echo $status[$_SESSION['rang']];
echo "<strong>&nbsp;&nbsp;|&nbsp;&nbsp;Benutzer: </strong>";
echo $_SESSION['username'];
echo "<strong>&nbsp;&nbsp;|&nbsp;&nbsp;<a href='logout.php'>Abmelden</a></strong></div><br />";
// echo "<form>";
// echo "<form action='logout.php' method='post'>";
// echo "<input type='submit' value='Eintragen' />";
// echo "</form>";
// echo $_SESSION['rang'];


// Datenbank verbinden

mysql_connect($db_server,$db_username,$db_password) or die ("Keine Verbindung moeglich");
mysql_select_db($db_name) or die ("Die Datenbank existiert nicht");

// Datenbank erstellen wenn nicht existent

mysql_query("CREATE TABLE IF NOT EXISTS $db_table (`x` int(3) NOT NULL,`y` int(2) NOT NULL,`z` int(2) NOT NULL,`tf` varchar(1) collate latin1_general_ci NOT NULL,`details` varchar(999) collate latin1_general_ci NOT NULL, `status` varchar(999) collate latin1_general_ci NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci");

// Unnütze Informationen ersetzen

$_POST[csv] = preg_replace('=([\s\S]*)(S])=',NULL,$_POST[csv]);
$_POST[csv] = preg_replace('=(Entfernung:)([\s\S]*)=',NULL,$_POST[csv]);

// Eintrag schon vorhanden ?

$test = mysql_query("SELECT * FROM $db_table WHERE x = '$_POST[x]' AND y = '$_POST[y]'");

// Post updaten oder speichern

if (mysql_num_rows($test) > 0) {
$eintrag = "UPDATE $db_table SET details = '$_POST[csv]' WHERE x = '$_POST[x]' AND y = '$_POST[y]'";
}
else {
$eintrag = "INSERT INTO $db_table (x, y, z, tf, details, status) VALUES ('$_POST[x]', '$_POST[y]', '0', '', '$_POST[csv]','')";
}

// Query ausführen, aber nur wenn eingaben nicht leer sind

if ($_POST[x] > 0 && $_POST[y] > 0) {
$eintragen = mysql_query($eintrag);
}

// Erfassungsmaske darstellen wenn Status = Admin

if ($_SESSION['rang'] > 1) {
echo "<strong>Erfassen</strong>";
echo "<form action='";
print $_SERVER['PHP_SELF'];
echo "' method='post'>";
echo "<dl>";
echo "<dt>X-Koordinate:</dt>";
echo "<dt><input type='text' name='x' /></dt>";
echo "<dt>Y-Koordinate:</dt>";
echo "<dt><input type='text' name='y' /></dt>";
echo "<dt>Copy & Paste (Ctrl + A / Ctrl + C / Ctrl + V):</dt>";
echo "<dt><textarea name='csv' rows='16' cols='70'></textarea></dt>";
echo "</dl>";
echo "<p>";
echo "<input type='submit' value='Eintragen' />";
echo "&nbsp;<input type='reset' value='Zurücksetzen' />";
echo "</p>";
echo "</form>";
}
else {
echo "";
}
// Suchmaske darstellen

echo "<strong>Suchen</strong>";
echo "<form action='";
print $_SERVER['PHP_SELF'];
echo "' method='post'>";
echo "<dl>";
echo "<dt>Beim Suchen kann man auch Platzhalter (%) verwenden! Beispiel: Don%Duck</dt>";
echo "<dt><br /></dt>";
echo "<dt>Suchwort:</dt>";
echo "<dt><input type='text' name='suchwort' /></dt>";
echo "<dt><br /></dt>";
echo "<dt><input type='submit' value='Suchen' /></dt>";
echo "</dl>";
echo "</form>";

// Hier beginnt der Suchen-Teil

$suchvariable=mysql_query("SELECT * FROM $db_table WHERE details LIKE '%$_POST[suchwort]%'");

//Auswahl ausführen und Ergebnis in Variable z speichern
if (!empty($_POST[suchwort])){

// Statusnachrichten
// SELECT * FROM $db_table WHERE hersteller = 'Toshiba'
if (mysql_num_rows($suchvariable) == 1) {echo "Es wurde <b>", mysql_num_rows($suchvariable), "</b> Datenbankeintrag mit dem Suchwort <b>$_POST[suchwort]</b> gefunden<br /><br />";}
if (mysql_num_rows($suchvariable) == 0) {echo "Es wurden <b>KEINE</b> Datenbankeinträge mit dem Suchwort <b>$_POST[suchwort]</b> gefunden.<br />Bitte versuchen Sie es mit einer anderen Eingabe.<br /><br />";}
if (mysql_num_rows($suchvariable) > 1) {echo "Es wurden <b>", mysql_num_rows($suchvariable), "</b> Datenbankeinträge mit dem Suchwort <b>$_POST[suchwort]</b> gefunden<br /><br />";}

// Suchwort markieren

$suchwort = $_POST[suchwort];
$pattern = '/('.preg_quote($suchwort, '/').')/i';
$replace = '<span style="background-color:none; color: #ff0000; font-weight:bold">$1</span>';

// Suchergebnis darstellen
if (mysql_num_rows($suchvariable) > 0) {
echo "<table width=600 valign=top>";
echo "<thead><tr><td width=100><STRONG>X-Koordinate</STRONG></td><td width=100><STRONG>Y-Koordinate</STRONG></td><td><STRONG>NR TF Allianz Planet Spieler [S]</STRONG></td></tr></thead>";
}
// Nun wird das Ergebnis welches in $suchvariable steht in ein Array $unter umgewandelt und so lange durchlaufen wie Zeilen die Abfrage ausgibt.

while($unter=mysql_fetch_array($suchvariable))
{
$unter["details"] = str_replace(') ',')<br />',$unter["details"]);
$unter["details"] = str_replace('• ','•<br />',$unter["details"]);
$unter["details"] = str_replace('# ','#<br />',$unter["details"]);
$unter["details"] = str_replace(' ','<br />',$unter["details"]);
echo "<tr>";
echo "<td valign=top>";
echo $unter["x"];
echo "</td><td valign=top>";
echo $unter["y"];
echo "</td><td valign=top>";
echo preg_replace($pattern, $replace, $unter["details"]);
echo "</td>";
echo "</tr>";




}

//Verbindung zum Server schließen

mysql_close();
echo "</table>";
}
?>
</html>



ich hoffe mir kann jemand weiterhelfen. ;)

netcup.de Warum gibt es hier Werbung?
der_nic der_nic am 21.11.06 13:37

mh such mal nach Infos zu Fulltextsearch in mySql... damit lässt das sich glaube ich ziemlich easy lösen (hab's selbst aber noch nie ausprobiert...)

ansonsten gibts noch die sog. Wildcards:
$sql = "SELECT `...` FROM `...` WHERE `...` LIKE '%Suchbegriff%'"


aber die Fulltextsearch ist halt besser

Dustwolf Dustwolf am 21.11.06 16:16

Such mal nach Match Against!

matthias b. matthias b. am 21.11.06 18:13

Nach meinen Recherchen funktioniert "Match Against" nur mit Suchbegriffen ab einer Wortlänge von 3 Buchstaben.
Da jedoch Spielernicks mit weniger als 3 Buchstaben erlaubt sind, kann ich das vergessen.


Folgende Zeile ist im Code schon zu finden
$sql = "SELECT `...` FROM `...` WHERE `...` LIKE '%Suchbegriff%'"

und zwar hier ( oder? ):
$suchvariable=mysql_query("SELECT * FROM $db_table WHERE details LIKE '%$_POST[suchwort]%'");

Ich möchte das Suchergebniss aber weiter einschränken und aus dem Ergebniss nur DIE EINE ZIELE MIT DEM GESUCHTEN BEGRIFF erhalten.

Noch n'Beispiel:

DB-Eintrag:

Sie erinnern sich?
Der Blindtext-Fall im vorigen Jahr.
Nun will Karl noch nach Canossa.
Und Claudia heiratet zur Busse Copperfield.
Jeden Morgen entzünden sie eine Kerze.



Ich suche nun nach "Karl" und das Ergebniss sollte so aussehen:

Nun will Karl noch nach Canossa.


------------

aja.. um es nochmal ganz deutlich zu sagen:
ME = PHP_NOOB :D

Wäre also nett wenn man mir auch gleich ein Beispiel zeigt wenn der Aufwand nicht zu gross ist. ;)

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt