• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem mit Suchfunktion

McCry

Mitglied
Problem mit Suchfunktion [gelöst]

Hallo,
wie schon im Titel erwähnt, habe ich ein Problem mit meiner Suchfunktion.

Irgendwie verursacht dieser Code:
Code:
include "include/design/db_connect.php";
        
        $ergebnis = mysql_query("SELECT * FROM blog WHERE titel LIKE %$stext%");
        while($row = mysql_fetch_object($ergebnis))
        {
                   $id = $row['id'];
                   $titel = $row['titel'];
                   $author = $row['author'];
                   $text = nl2br($row['text']);
                   $date = $row['date'];
                   
                   echo "<h2> <a href='index.php?page=blog&bid={$id}'>{$titel}</a> </h2>";
        }
Diese Fehlermeldung:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /users/ritualist/www/include/blog.php on line 52

Leider habe ich keine Ahnung warum, denn auf einer anderen Seite funktioniert das "mysql_fetch_object()".
Kann mir jemand helfen??
Danke schonmal
McCry
 
Zuletzt bearbeitet:
Werbung:
Moin,
nach dem mysql_query würde
Code:
if (!$ergebnis) echo mysql_error();

schon ein bisschen helfen.

Aber ich vermute das liegt daran, das dein LIKE %$stext% nicht in Anführungszeichen steht.
Code:
[COLOR=#333333]$ergebnis = mysql_query([/COLOR][COLOR=#333333]"SELECT * FROM blog WHERE titel [/COLOR][COLOR=#333333]LIKE '%{$stext}%'");
[/COLOR]​if (!$ergebnis) echo mysql_error();
 
Ja Danke erstmal.
Ich hab jetzt alles geändert. Die Fehlermeldung sieht jetzt nur leider so aus:
Fatal error: Cannot use object of type stdClass as array in /users/ritualist/www/include/blog.php on line 57

Der Code:
Code:
$ergebnis = mysql_query("SELECT * FROM blog WHERE titel LIKE '%{$stext}%'");
        if (!$ergebnis){
            echo mysql_error();
        }  else {
        while($row = mysql_fetch_object($ergebnis))
		{
                   $id = $row['id'];     <!-- Das ist Zeile 57 -->
                   $titel = $row['titel'];
                   $author = $row['author'];
                   $text = nl2br($row['text']);
                   $date = $row['date'];
                   
                   echo "<h2> <a href='index.php?page=blog&bid={$id}'>{$titel}</a> </h2>";
		}
        }

Ich habe Zeile 57 markiert. Hoffe mal, dass du mir helfen kannst, oder irgendjemand anderes.
Bis dahin
MFG McCry
 
Werbung:
mysql_fetch_object liefert Dir ein Objekt zurück und kein assoziatives Array, wie Du es weiter verarbeitest.

Entweder du benutzt mysql_fetch_assoc() oder Du sprichst die einzelnen Tabellenspalten so an:
HTML:
$id = $row->id;
usw.
 
Ich würde gerne noch eine Kleinigkeit hinzufügen,

wenn du eine etwas "schwammigere" Suche erstellen willst, wäre auch die Integrierte Volltextsuche von MySQL sehr interessant. Dann musst du nicht exakt den titel eingeben.

Hier gibts einiges mehr darüber zu lesen:

MySQL :: MySQL 5.1 Referenzhandbuch :: 12.7 MySQL-Volltextsuche

Hier habe ich mal eine Klasse geschrieben die den passenden Query generiert, leider noch PHP4
PHP:
<?php
class searchCommandModel {
	private $command;
	private $fields;
	
	public function searchCommandModel($tableName) {
		$this -> command = 'SELECT * FROM ' . $tableName . ' WHERE MATCH(';
	}
	
	public function addField($fieldName) {
		$this -> fields[] = $fieldName;
	}
	
	public function getCommand($searchString) {
		foreach ($this -> fields as $key => $value) {
			if ($key == 0) {
				$this -> command.= $value;
			} else {
				$this -> command.= ', ' . $value;	
			}
		}
		$this -> command.= ') AGAINST (\'' . $searchString . '\')';
		
		return $this -> command;
	}
}
?>
Eigentlich selbst erklärend. Beim erstellen des Objektes gibts du den Tabellennamen mit, mit AddField kannst du jedes Feld in dem du Suchen willst hinzufügen. Mit GetCommand erhälst du den Query, der dazugehörige Parameter ist der Text nach dem du suchst.
Jetzt muss nur noch ein Fulltext über alle Tabellen gelegt werden, siehe Dokumention für weitere Details.

Edit:
Also in deinem Fall folgende Anwendug:
PHP:
$foo = new searchCommandModel('blog');
$foo -> addField('titel');
//Platz für zum beispeil $foo -> addField('inhalt');
$dbCommand = $foo -> getCommand($stext);

Und wie gesagt der nötigen Tabellen mit einen Fulltext versehen
 
Zuletzt bearbeitet:
Werbung:
@McCry:

PHP:
echo "<h2> <a href='index.php?page=blog&bid={$id}'>{$titel}</a> </h2>";

&bid muss als &amp;bid maskiert sein. Insgesamt variable Ausgaben durch eine geeignete Escaping-Funktion wie htmlspecialchars schicken, um XSS-Attacken zu vermeiden.

Und gegen SQL-Injections hast du die Queries geschützt?

@CGollhardt:

Ein, zwei Tipps/Ideen:

  1. PHP5-Konstruktorsyntax nutzen: public function __construct($tableName)
  2. $fields initialisieren: private $fields = array();
  3. Backticks (`) um Tabellen- und Feldnamen ergänzen.
  4. Tabellennamen für Instanzen austauschbar machen. (zusätzlich setTableName($tableName));
  5. $fields auf array() zurücksetzbar machen, damit die Instanz mehrfach verwendet werden kann.
  6. Exception werfen, falls Feld-Liste leer.

Und Escaping als Schutz vor SQL-Injections beachtest du glaube ich (auch) nicht. Anders gesagt: Der Query-Builder müsste seine Datenbank-„Instanz“ kennen (mysql-Link, mysqli-Instanz, …).

(Auch mysql_real_escape_string funktioniert nur dann, wenn eine Verbindung zur DB geöffnet wurde. Das heißt, eine DB-Verbindung ist auch dort eine Abhängigkeit deiner Klasse.)
 
Zurück
Oben