Suchfunktion mit PHP Version 7.1.12 und MySQL?
Hallo,
ich habe mir letztens auf YouTube ein Video angeschaut, wie man mit Hilfe von PHP eine MySQL-Datenbank durchsucht. Ich habe es selber ausprobiert, doch musste leider feststellen, dass der Code nicht für meine PHP-Version (7.1.12) geeignet ist.
Also habe ich versucht ihn umzuschreiben. Das hat aber leider nicht geklappt.
<html>
<head>
<title>Suche</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="suchfeld"/>
<input type="submit" name="suche_enter" value="suchen"/>
</form>
<hr /><br />
<?php
if (isset($_GET['suche_enter'])) {
$host = "localhost";
$user = "root";
$pass = "";
$db = "test_db";
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_errno) {
die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
}
$suchbegriff = trim(htmlentities(stripslashes(mysqli_real_escape_string($_GET['suchfeld']))));
$sql = "SELECT headline, text FROM article WHERE
headline LIKE '%$suchbegriff%' OR
image LIKE '%$suchbegriff%' OR
overtext LIKE '%$suchbegriff%' OR
text LIKE '%$suchbegriff%' OR
gender1 LIKE '%$suchbegriff%' OR
gender2 LIKE '%$suchbegriff%'
ORDER BY headline, gender1, overtext, text, gender2, image";
$query = mysqli_query($sql);
echo "<ul>";
WHILE ($row = mysqli_fetch_assoc($query)) {
$headline = $row['headline'];
$overtext = $row['overtext'];
$text = $row['text'];
echo "<li>$headline <br /><br />$overtext<br /><br /><hr /><br /></li>";
}
echo "</ul>";
}
?>
</body>
</html>
Wie müsste der Code richtig aussehen?
7 Antworten
Probier mal das hier https://pastebin.com/MUCrqqYi
PS: ich bin mir nicht sicher ob beim order by mehrere spaltennamen als angabe zugelassen sind.
Ja, man kann beim ORDER BY mehrere Spalten angeben, und nicht nur das. Für jede Spalte einzeln kann man aufsteigend ASCENDING oder absteigend DESCENDING hinzufügen. Ersteres kann man weglassen, weil das dann standardmäßig so gemacht wird, letzeres kann man mit DESC abkürzen. Bei der Verwendung von UNION, wobei mehrere SELECTs vorhanden sind und deshalb die Spaltenbezeichnungen nicht zwangsläufig eindeutig übereinstimmen, muss man die alternative Schreibweise verwenden und Spalten als Ordnungs-Nr angeben: Für 1.Spalte eine 1, für 12. Spalte die 12 usw.
Sortiert wird nicht nach dem Binärwert, sondern nach der verwendeten Codetabelle, um Umlaute richtig einzuordnen. Für das Laden von sortierten Tabellen im Programm (für Binärbaum z.B.) aus der Datenbank kann dies für das Programm falsch sein, eine binäre Neusortierung ist dann erforderlich.
Wenn Du das alles beachtest, wirst in Deiner Datenbank-Karriere nie wieder ein Problem mit dem Sortieren haben.
Bitte beachte, dass auch in diesem Code noch Fehler vorhanden sind sowie Dinge verbessert werden sollten:
- Es fehlt der Doctype. Der ist zwingend notwendig.
<!doctype html>
- Setze den Zeichensatz auf UTF-8, dann erledigt sich auch dein Problem mit den Umlauten. Der Meta-Tag dazu kommt in den head:
<meta charset="utf-8">
- Das action-Attribut solltest du weglassen, wenn es die Daten an die selbe Seite verschicken soll.
- Die Abfrage isset / empty kann auf empty reduziert werden, denn die Funktion prüft auf Vorhandensein und Wert.
- Verwende CSS, um Abstände zu erzeugen und lasse dafür br-Tags weg.
- Entscheide dich für einen Stil: Entweder objektorientiert oder prozedual. Die jeweiligen Schreibweisen werden in der PHP Dokumentation stets aufgezeigt, bspw. hier für mysqli_query.
- Verwende Prepared Statements. Dies übernimmt die Filterung der Werte für dich und hält auch deinen Query lesbarer.
- while - das nur am Rande, würde ich wie alle anderen Kontrollstrukturen auch klein schreiben.
As erstes fällt auf, dass du zwar eine Datenbank-Verbindung aufbaust und dir das zugehörige Objekt in Variable $conn speicherst. Dann aber greifst du teilweise auf andere (nicht initialisierte) Variablen zu. Beispielsweise bei $mysqli->connect_error.
Dann verwendest du die Funktionen teilweise falsch. Die Funktionen mysqli_real_escape_string oder mysqli_query erwarten als Übergabe auch die Verbindung ($conn). Du kannst dir dazu das PHP-Handbuch anschauen.
versuche mal für das Problem Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\PHP\suche\index.php on line 23
$suchbegriff = trim(htmlentities(stripslashes(mysqli_real_escape_string($_GET['suchfeld']))));
$suchbegriff = trim(htmlentities(stripslashes(mysqli_real_escape_string($conn, $_GET['suchfeld']))));
damit sollte das Problem weg sein.
Schreib mal ob es funktioniert hat am Enden
Die Datenbank Verbindung könntest du auch einfach kürzen. Und zwar in $conn = new mysqli ('localhost', 'root', 'Passwort', 'Datenbank');
Also die Zeile mit $query = mysqli_query($sql); musst du ändern. Du musst da auch die Datenbank angeben. $query = mysqli_query($conn, $sql);
Danke! Gibt es auch eine Funktion, die aus bzpw. einem ä ein ä macht damit ein ä ausgegeben werden kann?