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

Problem mysqli Suchfunktion

Schreib die Zeile lieber so, das ist imo übersichtlicher:

PHP:
echo '<li class="ausgabe"><a href="' . $result['nameurl'] . '" class="ausgabe">'
     . htmlspecialchars($result['name']) . '</a></li>';

Aktuell werden von der Funktion pro Datensatz die Felder id, name, category_id und category_name zurückgegeben. Wenn du nameurl (oder andere) brauchst, musst du die im SELECT-Teil der Query noch hinzufügen.

Code:
$query = "SELECT
                e.`id`,
                e.`name`,
                e.`nameurl`,
                k.`id`   AS `category_id`,
                k.`name` AS `category_name`
                ...

$category ist ein Funktionsparameter:

PHP:
function performSearch(mysqli $db, $keywords, $category = 0, $inTitle = true,
                       $inText = true)

Das heißt, die Variable wird für die Funktion auf den Wert gesetzt, den du beim Aufruf übergibst (hier etwa auf 4):

PHP:
$results = performSearch($db, 'peter', 4, true, true);
 
Danke mermshaus,
ich bin wieder weiter gekommen. Findet das Script schon die Kategorie automatisch?

Ich weiß nicht warum, aber ich erhalte schon wieder eine Fehlermeldung:sad::
Fatal error: Call to a member function fetch_assoc() on a non-object in /is/htdocs/wp1158326_JHB43K6EP5/www/coder/suche.php on line 74

So sieht der Code zur Zeit aus:

PHP:
   <?php

require_once 'config.inc.php';

/**
 * Führt Suche durch, gibt Ergebnisse als Array zurück
 *
 * @param mysqli $db       Das MySQL-Objekt
 * @param string $keywords Nach welchem Begriff(en) suchen?
 * @param int    $category In welcher Kategorie suchen? (0 für alle)
 * @param bool   $inTitle  Im Titel suchen?
 * @param bool   $inText   Im Text suchen?
 * @return array
 */
function performSearch(mysqli $db, $keywords, $category = 0, $inTitle = true,
                       $inText = true)
{
    /* Parameter validieren */

    $keywords = trim($keywords);
    $category = (int) $category;
    $inTitle  = (bool) $inTitle;
    $inText   = (bool) $inText;
    $results  = array();

    /* Abbruchbedingungen */

    if ($keywords == '') return array();

    /* WHERE-Bedingungen zusammenstellen */

    $conditions = array();

    $fields = array();
    if ($inTitle) $fields[] = 'name';
    if ($inText)  $fields[] = 'tutorial';
    if (count($fields) == 0) $fields = array('name', 'tutorial');
    $conditions[] = "MATCH (e.`" . implode("`, e.`", $fields) . "`) "
                    . "AGAINST ('" . $db->real_escape_string($keywords) . "')";

    if ($category > 0) {
        $conditions[] = "`kategorie` = '" . $db->real_escape_string($category) . "'";
    }

    $wherePart = " WHERE " . implode(' AND ', $conditions);

    /* Query zusammenbauen */

    $query = "SELECT
                    e.`id`,
                    e.`name`,
                    e.`nameurl`,
                    k.`id`   AS `category_id`,
                    k.`name` AS `category_name`,
                    k.`nameurl` AS `category_nameurl`
                FROM
                    `eintraege` e
                LEFT JOIN
                    `kategorien` k
                    ON
                        e.`kategorie` = k.`id`";

    if ($wherePart != '') {
        $query .= $wherePart;
    }

    /* Query zu Debugzwecken anzeigen */

    echo '<pre style="white-space: normal;">' . preg_replace('/\s{2,}/', ' ', $query) . '</pre>';

    /* Query ausführen */

    $result = $db->query($query);
    while ($row = $result->fetch_assoc()) {
        $results[] = $row;
    }

    /* Rückgabe */

    return $results;
}

$title = $_POST['key'] . ' - Suche';
include 'header.php';

/*
 * An dieser Stelle musst du die Variablen aus $_POST so auswerten, dass du der
 * Funktion passende Parameter übergeben kannst. Das solltest du hinbekommen.
 * Der folgende Aufruf ist nur ein Beispiel.
 *
 * (Anstelle von 'peter' also prinzipiell $_POST['key'] übergeben usw.)
 */

$results = performSearch($db, $_POST['key'], 0, true, true);

if (count($results) == 0) {
    echo '<p class=\"error\">Ihre Suche erzielte leider keinen Treffer</p>';
} else {
    echo "<ul class\"ausgabe\">";
    foreach ($results as $result) {
        echo '<li class="ausgabe"><a href="' . $result['nameurl'] . '" class="ausgabe">'
     . htmlspecialchars($result['name']) . '</a></li>';  
       }
    echo "</ul>";
    
    }


include 'footer.php'; 
?>
 
Wie sieht denn die Struktur deiner "kategorien"-Tabelle aus? Gibt es da auch ein Feld "nameurl"? Falls nicht, hat es keinen Zweck das Feld in der Query selektieren zu wollen.
 
Edit: Ne, die Fehlerausgabe an der Stelle bringt nichts. Habe den Abschnitt hier im Post entfernt.

Man kann doch jeder ZAhl (1-4) jeweils die Richtige Kategorie zuweisen oder?

Prinzipiell ja, ich bin mir aber nicht sicher, wie du das meinst. Einfacher wäre es, wenn du mal einen Dump der Struktur der kategorien-Tabelle posten würdest.

An der Stelle ist in deinem Datenbankschema ohnehin ein wenig der Wurm drin. Das feld eintraege.kategorie hat zum Beispiel aus irgendeinem unerfindlichen Grund den Typ VARCHAR. Im Prinzip müsste das ein INT-Feld sein, das als Wert je einen existierenden Wert aus kategorien.id enthält.
 
Im Prinzip müsste das ein INT-Feld sein, das als Wert je einen existierenden Wert aus kategorien.id enthält.
Geändert!

Hier ist die Tabelle:
Code:
-- phpMyAdmin SQL Dump
-- version 2.11.9.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 01. Oktober 2009 um 16:13
-- Server Version: 5.0.32
-- PHP-Version: 5.2.10

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Datenbank: `------------`
--

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

--
-- Tabellenstruktur für Tabelle `kategorien`
--

CREATE TABLE `kategorien` (
  `id` int(20) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  `name_url` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Daten für Tabelle `kategorien`
--

INSERT INTO `kategorien` VALUES(1, 'HTML', 'html');
INSERT INTO `kategorien` VALUES(4, 'PHP', 'php');
INSERT INTO `kategorien` VALUES(3, 'CSS', 'css');
INSERT INTO `kategorien` VALUES(5, 'News', 'news');
 
Zuletzt bearbeitet:
Nein, tue ich nicht.

Deine Query:

PHP:
    $query = "SELECT
                    e.`id`,
                    e.`name`,
                    e.`nameurl`,
                    k.`id`   AS `category_id`,
                    k.`name` AS `category_name`,
                    k.`nameurl` AS `category_nameurl`
                FROM
                    `eintraege` e
                LEFT JOIN
                    `kategorien` k
                    ON
                        e.`kategorie` = k.`id`";

Deine Tabelle:

Code:
CREATE TABLE `kategorien` (
  `id` int(20) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  `name_url` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

nameurl != name_url

k.`nameurl` => k.`name_url`

Bisschen mehr Sorgfalt, bitte. :neutral:
 
Tur mir Leid ich kann dir nicht folgen. Den Query den du gepostest hast für eine eintraege Abfrage. Die Tabelle ist aber von kategorien oder seheich das falsch?
 
Meine Abfrage verbindet die beiden Tabellen eintraege (Alias: e) und kategorien (Alias: k). Alle Felder mit einem e davor beziehen sich auf die Tabelle eintraege, alle Felder mit einem k auf die Tabelle kategorien.

Das heißt, die Abfrage ermittelt zu jedem Eintrag aus eintraege anhand des Felds eintraege.kategorie die zugehörige Kategorie und fügt die ID, den Namen und die URL dem entsprechenden Eintrag in der Ergebnismenge hinzu.

Code:
SELECT
    e.`id`,
    e.`name`,
    e.`nameurl`,
    k.`id`   AS `category_id`,
    k.`name` AS `category_name`,
    k.`name_url` AS `category_nameurl`
FROM
    `eintraege` e
LEFT JOIN
    `kategorien` k
    ON
        e.`kategorie` = k.`id`

Resultat:

Code:
+----+----------------------+--------------------+-------------+---------------+------------------+
| id | name                 | nameurl            | category_id | category_name | category_nameurl |
+----+----------------------+--------------------+-------------+---------------+------------------+
| 28 | erweitern            | 22222222           |           1 | HTML          | html             |
| 29 | 33333333333333333333 | 333333333333333333 |           1 | HTML          | html             |
| 27 | aaaa                 | aaaa               |           4 | PHP           | php              |
| 34 | 111111111            | 1111111111111      |           1 | HTML          | html             |
| 35 | 111111111            | 1111111111111      |           1 | HTML          | html             |
| 31 | 5555555555555555     | 5555555555         |           1 | HTML          | html             |
| 36 | 222222222222222      | 222222222222222222 |           1 | HTML          | html             |
| 33 | aa                   | aa                 |           3 | CSS           | css              |
| 37 | lorem ipsum          | lorem-ipsum        |           4 | PHP           | php              |
| 38 | peter wurts          | peter-wurts        |           3 | CSS           | css              |
| 39 | hallö                | halloe             |           1 | HTML          | html             |
+----+----------------------+--------------------+-------------+---------------+------------------+

id, name und nameurl stammen aus eintraege, die anderen Felder aus kategorien, wobei category_id pro Zeile dem Wert von eintraege.kategorie entspricht. (Siehe LEFT JOIN ... ON ... oben.)
 
Entschuldigung mermshaus das habe ich nicht gewusst.:sad:

Endlich klappt die eigentliche Suchfunktion ohne Fehler!

Ich will nun noch das wenn man im Bereich Html Sucht auch nur nach Html Tutorials gesucht wird. Hast du eine gute Alternative außer der VAriante mit den Varibalen?
 
Alternative zu der Variante mit den Variablen?

Du kannst einfach analog zu $_POST['key'] auch $_POST['cat'] (und auch die anderen Formularfelder) als Argumente an die Funktion übergeben:

PHP:
$_POST['key'] = (isset($_POST['key'])) ? trim($_POST['key']) : '';
$_POST['cat'] = (isset($_POST['cat'])) ? (int) $_POST['cat'] : 0;

$results = performSearch($db, $_POST['key'], $_POST['cat'], true, true);
 
Perfekt! Perfekt! Perfekt!
Danke! Danke! Danke!

Es klappt nun echt super. Danke mermshaus.

Mit ganz freundlichen Grüßen

xXxPeterPanxXx

Sry für Doppelpost,:oops:
aber ich beim testen der Suchfunktion noch einen kleinen Fehler gefunden.

In der erweiterten Suche kann man aussuchen ob man im Titel, Text oder in beidem Sucht. Nur das funktioniert noch nicht. Immoment wird immer in allem gesucht.:sad:

Wie kann ich das ändern.

MfG xXxPeterPanxXx
 
Zuletzt bearbeitet von einem Moderator:
Wieder analog:

PHP:
$_POST['key']   = (isset($_POST['key']))   ? trim($_POST['key'])    : '';
$_POST['cat']   = (isset($_POST['cat']))   ? (int) $_POST['cat']    : 0;
$_POST['titel'] = (isset($_POST['titel'])) ? (bool) $_POST['titel'] : false;
$_POST['text']  = (isset($_POST['text']))  ? (bool) $_POST['text']  : false;

$results = performSearch($db, $_POST['key'], $_POST['cat'], $_POST['titel'],
                         $_POST['text']);

Ist doch vom Konzept her wie bei deiner ursprünglichen Suchfunktion. Wo liegt die Schwierigkeit?
 
Zurück
Oben