Sicheres php-Suchscript gesucht

rernanded

Erfahrenes Mitglied
Hi,

ich suche ein sicheres* php-Suchscript mit folgenden Anforderungen:

Die Suche soll online über Webbrowser erfolgen.

Durchsucht werden soll eine Tabelle einer mySQL-Datenbank mit 20 Feldern und 200.000 Zeilen.

Es müssen beliebig viele Suchworte getrennt mit Leerzeichen eingegeben werden können.

Es muß einstellbar sein in welchen Feldern gesucht wird und welche Felder bzw. welche Werte ausgegeben werden.

Es muß einstellbar sein wieviele Ergebnisse seitenweise ausgegeben werden.

Der query-select-Befehl muß ein rand enthalten können.

Die Ausgabe muß berücksichtigen das sowohl ä,ü,ö,Ä,Ü,Ö und ß also auch ä &Auml ... und ß als Werte vorhanden sind.

*SQL-Injection und andere böse Maßnahmen müssen ausgeschlossen sein. Die Unabhängigkeit von register_globals und save_mode muß gewährleistet sein.

Freeware wäre schön ansonsten kauf ich auch.

MONI
 
Zuletzt bearbeitet:
Sind die Felder alle Text-Felder? Wenn nein, wäre es gut, wenn du wenigsten ein paar Test-Daten posten könntest.

Okay: Moni

`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`url` text,
`title` text,
`keyw` text,
`descr` text,
`inhalt` longtext,
`errcode` varchar( 10 ) default NULL ,
`ts` timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

PRIMARY KEY ( `id` )
) ENGINE = MYISAM AUTO_INCREMENT = 101456 DEFAULT CHARSET = utf8
 
So schwer und umfangreich ist das nicht. Hier ein Beispiel, wie man anfangen könnte. Unoptimiert und nicht gut getestet:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>

<form action="" method="post">
	<input type="text" name="keywords" id="keywords"/>
	<input type="submit"/>
</form>

<?php

/* Alle Spalten, die berücksichtigt werden sollen */
$columns = array(
	'url',
	'title',
	'keyw',
	'descr',
	'inhalt',
	'errcode',
	'ts'
);

if( isset ($_POST['keywords']) )
{
	/* Keywords aus dem Formular-Feld holen */
	$keywords = explode(' ', $_POST['keywords']);
	
	/* Where-Bedingungen vorbereiten */
	foreach ($columns as $column)
	{
		$conditions[] = "`$column` LIKE ?\n";
	}

	$query = "SELECT * FROM `suchen` WHERE " . implode(' OR ', $conditions);
	
	$results = array();
	
	/* Datenbank-Abfrage ausführen */
	try {
	
		$pdo = new PDO('mysql:dbname=test;host=127.0.0.1', 'test', 'test', array(
				PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
				PDO::ATTR_ERRMODE =>PDO::ERRMODE_EXCEPTION
				/* More driver options ... */
		) );
		
		
		$statement = $pdo->prepare($query);
		
		$temp_results = array();
		foreach ($keywords as $keyword)
		{
			for($i = 1; $i < count($conditions) + 1; $i++ )
			{
				$statement->bindValue($i, '%' . $keyword . '%');
			}
			
			if(! $statement->execute() )
			{
				throw new Exception("Could not execute query!");
			}
			
			$temp_results = array_merge($results, $statement->fetchAll(PDO::FETCH_ASSOC));
		} // foreach keywords
		
		foreach ($temp_results as $result)
		{
			if(!array_key_exists($result['id'], $results))
			{
				$results[$result['id']] = $result;
			}
		}
		
		// Debugging .... 
		echo "<pre>";
		var_dump($results);
		echo "</pre>";
	}
	catch(Exception $e)
	{
		echo $e->getMessage();
		echo "<pre>";
		echo $e->getTraceAsString();
		echo "</pre>";
		
		echo "Query:<pre>$query</pre>";
	} // try-catch
	
} // if isset
?>
</body>
</html>

Wenn du wirklich was bezahlen willst, dann mach doch eine kleine Spende aus Dankbarkeit an tutorials.de ;-)
 
Hi,
herzlichen Dank saftmeister. Ich werde mal ausprobieren was Du gepostet hast und gebe Dir ein Feedback.
Das mit dem Schwierigkeitsgrad sehe ich auch so. Eine Spende an tutorials ist eine gute Idee. Hast Du da den passenden Link.

MONI
 
Hi saftmeister,
habe es mal ausprobiert hakt aber irgendwie.
Erstens, die ' müssen wohl so gesetzt werden, eins vorne und eins hinten:
PHP:
 $pdo = new PDO('mysql:host=hostname;dbname=dbname, username, password', array( ...
Zweitens: Was bedeutet das ? in
PHP:
$conditions[] = "`$column` LIKE ?\n";
Da muß ich wohl was einsetzen.?! Gib bitte mal ein Beispiel. Danke vorab.

MONI
 
Zweitens: Was bedeutet das ? in
PHP:
$conditions[] = "`$column` LIKE ?\n";
Da muß ich wohl was einsetzen.?! Gib bitte mal ein Beispiel. Danke vorab.

Das gehört so, da saftmeister Prepared Statements genutzt hat.
Später im Skript werden mittels bind_value() die Werte "gebunden".


Nachtrag: Man müsste noch die Ausgabe in saftmeister's Skript mittels [phpf]htmlentities[/phpf] maskieren, ansonsten gelangt eventueller HTML-Code aus der DB direkt auf die Seite!
 
Zurück