Datenbank durchsuchen und Ergebnis ausgeben

#1
Hallo Leute,

irgendwie sehe ich heute den Wald vor lauter Bäumen nicht mehr.

Ich habe eine Artikeldatenbank mit folgender Struktur: (Die Kollation der Tabelle ist utf8_unicode_ci)
Spalte Typ Null Standard
  1. nummer int(10) Nein
  2. kategorie text Nein
  3. unterkategorie text Nein
  4. menge text Nein
  5. artikelnummer text Nein
  6. artikel text Nein
  7. preis text Nein
  8. kurzartikel text Nein
  9. sort varchar(5) Nein
  10. deleted_at timestamp Ja NULL
Mein Problem ist folgendes:
Da die Artikeldatenbank schon ziemlich umfangreich ist, möchte ich die Möglichkeit haben in der Datenbank gezielt nach Einträgen zu suchen.
Leider gibt die Suche ALLE Einträge aus, auch solche die mit dem Suchbegriff nichts zu tun haben. Mein Suchbegriff wird übergeben (ich lasse den z. Zt. als echo ausgeben).

Vielleicht könnt ihr mir einen Hinweis geben wo mein Fehler liegt.

Meine Anzeige-PHP besteht aus 2 Dateien, die Erste nimmt den Kontakt zur Datenbank auf und die Zweite erzeugt nur die Ausgabe und gibt die Möglichkeit den Artikel zu ändern.
artikel.php
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<?php
//$anzahl = $_GET["anzahl"];
require ("config/config.php");
//
?>
<html><head>
<meta content="text/html; charset=utf-8" http-equiv="content-type"><title>Gravurdaten</title>
<link href="config/style.css" type="text/css" rel="stylesheet" />
<script src="http://admin.deine-gravur.de/rechnungen/function2.js"></script>
</head>
<BODY>
<table><tr><td>
<form action="artikelneu.php" method="post">
<button type="submit">Neuer Artikel</button>
</form></td><td>
<form name="artikel" method="post" action="">
<select name="kategorie" onchange="this.form.submit();">
<option value="">bitte wählen</option>
<?php
$Connect = mysqli_connect($server, $user, $pass);
@mysqli_select_db($Connect, "$dbase");
$result =  mysqli_query($Connect, "SELECT DISTINCT kategorie FROM $tabelle1a ORDER BY kategorie ASC");
while($row = mysqli_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysqli_free_result( $result );
print_r($_POST);
$kategorie=$_POST['kategorie'];   
?>
</select></form>
</td><td>
<form name="artikel" method="post" action="">
<select name="kategorie" onchange="this.form.submit();">
<option value="">bitte wählen</option>
<?php
$Connect = mysqli_connect($server, $user, $pass);
@mysqli_select_db($Connect, "$dbase");
$result =  mysqli_query($Connect, "SELECT DISTINCT unterkategorie FROM $tabelle1a ORDER BY unterkategorie ASC");
while($row = mysqli_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysqli_free_result( $result );
print_r($_POST);
$kategorie=$_POST['kategorie'];   
?>
</select></form>
</td><td>
    <form action="suche.php" method='GET'>
    <input style="border-color: #666666;" type="text" id="such" name="such" value="" size="30">
    &nbsp;<button class="knopf" type="submit">Go</button>
    </form>
</td></tr></table>
<?php
//Auflistung Artikel gesamt
echo "
<table style=\"text-align: left; width: 100%;\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
<tbody><tr>
<td class=\"artkat\">Kategorie</td>
<td class=\"artukat\">Unterkategorie</td>
<td class=\"artmenge\">Menge</td>
<td class=\"artartnr\">Art.nr</td>
<td class=\"arttextart\">Artikel</td>
<td class=\"artpreis\">Preis</td>
<td class=\"artpreis\">Sort</td>
<td class=\"artkuart\">Kurzbeschreibung</td>
<td>Go</td>
</tr>";
$beitraege_pro_seite=15;
$pdo = new PDO($server2, $user, $pass);
$show_form = true;
$error = null;
if(!is_null($error)) { //Ein Fehler ist aufgetreten
    echo $error;
}
/***********************
* Ausgabe der Einträge
***********************/
//Ermittelt die Anzahl der Beiträge
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM $tabelle1a WHERE deleted_at IS NULL");
$statement->execute();
$row = $statement->fetch();
// Anzahl der gesamteinträge
$anzahl_eintrage = $row['anzahl'];
//Berechne alles notwendige für die Blätterfunktion
$seite = 1;
if(isset($_GET['seite'])) {
    $seite = intval($_GET['seite']);
}
$start = ($seite-1)*$beitraege_pro_seite;
//Abfrage der Datenbank und Ausgabe der Daten
$statement = $pdo->prepare("SELECT * FROM $tabelle1a WHERE deleted_at IS NULL ORDER BY unterkategorie, sort ASC LIMIT :start, :limit");
$statement->bindParam(':start', $start, PDO::PARAM_INT);
$statement->bindParam(':limit', $beitraege_pro_seite, PDO::PARAM_INT);
$statement->execute();
while($row = $statement->fetch()) {
    $nummer = htmlentities($row['nummer']);
    $kategorie = htmlentities($row['kategorie']);           
    $unterkategorie = htmlentities($row['unterkategorie']);           
    $menge = htmlentities($row['menge']);           
    $artikelnummer = htmlentities($row['artikelnummer']);           
    $artikel = htmlentities($row['artikel']);           
    $preis = htmlentities($row['preis']);       
    $sort = htmlentities($row['sort']);       
    $kurzartikel = htmlentities($row['kurzartikel']);           
    include ("artikel_anzeige.php");   
}
echo "</tbody></table>";
//Berechne die Anzahl der Seiten:
$anzahl_seiten = ceil($anzahl_eintrage / floatval($beitraege_pro_seite));
// Blättern
echo "<div id=\"navigation\" align=\"center\">";
echo '&nbsp;<a href="?seite='.$anzahl_eintrage.'" >Erste Seite</a>';
$seite = $_GET['seite'] +1;
        echo '&nbsp;<a href="?seite='.$seite.'" ><<&nbsp;</a>';   
echo "&nbsp;$seite";       
$seite = $_GET['seite'] -1;
        echo '&nbsp;<a href="?seite='.$seite.'" >&nbsp;>></a>';    
echo '&nbsp;<a href="?seite=1" >Letzte Seite </a></div>';
?>
artikel_anzeige.php
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta content="text/html; charset=utf-8" http-equiv="content-type"><title>Gravurdaten</title>
<link href="config/style.css" type="text/css" rel="stylesheet" />
<script src="http://admin.deine-gravur.de/rechnungen/function2.js"></script>
</head>
<BODY>
<form action="updateartikel.php" method="post">
<?php
echo "<tr><input name=\"nummer\" type=\"hidden\" value=\"$nummer\">
<td class=\"artkat\" style=\"vertical-align: top;\"><input name=\"kategorie\" size=\"30\" value=\"$kategorie\"></td>
<td class=\"artkuat\" style=\"vertical-align: top;\"><textarea name=\"unterkategorie\" cols=\"25\" rows=\"2\">$unterkategorie</textarea></td>
<td class=\"artmenge\" style=\"vertical-align: top;\"><input name=\"menge\" size=\"3\" value=\"$menge\" onkeydown=\"replaceLetters(this)\"></td>
<td class=\"artartnr\" style=\"vertical-align: top;\"><input name=\"artikelnummer\" size=\"8\" value=\"$artikelnummer\"></td>
<td class=\"arttextart\" style=\"vertical-align: top;\"><textarea name=\"artikel\" cols=\"30\" rows=\"2\">$artikel</textarea></td>
<td class=\"artpreis\" style=\"vertical-align: top;\"><input name=\"preis\" size=\"10\" value=\"$preis\" onkeydown=\"replaceLetters(this)\"></td>
<td class=\"artpreis\" style=\"vertical-align: top;\"><input name=\"sort\" size=\"5\" value=\"$sort\"></td>
<td class=\"artkuart\" style=\"vertical-align: top;\"><textarea name=\"kurzartikel\" cols=\"30\" rows=\"2\">$kurzartikel</textarea></td>
<td class=\"artknopf\"><button class=\"knopf\" type=\"submit\" name=\"action\" value=\"1\" align=\"center\">Ändern</button></td>
</tr>
";
?>
</form>
</body></html>
Nun meine suche.php
PHP:
<?php
$such = $_GET["such"];
//Prüfung ob Suchbegriff durchkommt
echo "$such";
require ("config/config.php");
$beitraege_pro_seite=12;
$pdo = new PDO($server2, $user, $pass);
$show_form = true;
$error = null;
if(!is_null($error)) { //Ein Fehler ist aufgetreten
    echo $error;
}
/***********************
* Ausgabe der Einträge
***********************/
//Ermittelt die Anzahl der Beiträge
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM $tabelle1a WHERE deleted_at IS NULL");
$statement->execute();
$row = $statement->fetch();
// Anzahl der gesamteinträge
$anzahl_eintrage = $row['anzahl'];
//Berechne alles notwendige für die Blätterfunktion
$seite = 1;
if(isset($_GET['seite'])) {
    $seite = intval($_GET['seite']);
}
$start = ($seite-1)*$beitraege_pro_seite;
//Abfrage der Datenbank und Ausgabe der Daten
$statement = $pdo->prepare("SELECT * FROM $tabelle1a WHERE
kategorie         LIKE '%$such%' OR
unterkategorie     LIKE '%$such%' OR
artikelnummer     LIKE '%$such%' OR
artikel         LIKE '%$such%' OR
kurzartikel     LIKE '%$such%'

ORDER BY nummer DESC LIMIT :start, :limit");
$statement->bindParam(':start', $start, PDO::PARAM_INT);
$statement->bindParam(':limit', $beitraege_pro_seite, PDO::PARAM_INT);
$statement->execute();
while($row = $statement->fetch()) {
    $nummer = htmlentities($row['nummer']);
    $kategorie = htmlentities($row['kategorie']);           
    $unterkategorie = htmlentities($row['unterkategorie']);           
    $menge = htmlentities($row['menge']);           
    $artikelnummer = htmlentities($row['artikelnummer']);           
    $artikel = htmlentities($row['artikel']);           
    $preis = htmlentities($row['preis']);       
    $sort = htmlentities($row['sort']);       
    $kurzartikel = htmlentities($row['kurzartikel']);           
    include ("artikel.php");   
}
echo "</tbody>
</table>";
//Berechne die Anzahl der Seiten:
$anzahl_seiten = ceil($anzahl_eintrage / floatval($beitraege_pro_seite));
// Blättern
echo "<div id=\"navigation\" align=\"center\">";
echo '&nbsp;<a href="?seite='.$anzahl_eintrage.'" >Erste Seite</a>';
$seite = $_GET['seite'] +1;
        echo '&nbsp;<a href="?seite='.$seite.'" ><<&nbsp;</a>';       
$seite = $_GET['seite'] -1;
        echo '&nbsp;<a href="?seite='.$seite.'" >&nbsp;>></a>';    
echo '&nbsp;<a href="?seite=1" >Letzte Seite </a></div>';
?>
 
#2
UInd welcher Code-Abschnitt funktioniert nicht richtig?

Warum Zählst du die Eintrag, welche nicht gelöscht sind und bei der Detailsuche ignorierst du das deletes_at Feld?
Ansonsten sieht das Such-SQL richtig aus.

Kannst du mal ein Beispiel in Tabellenansicht machen, von Daten die ausgegeben werden aber nicht sollten und was dein Suchbegriff dazu war
 
#3
Hallo Yaslaw,

ich weiß ja nicht welcher Code nicht funktioniert.
Also hier mal ein Bild von meiner Ausgabe nach einer Suche. Der Suchbegriff steht oben links (das echo)

Die erste Zeile wäre ja eine korrekte, allerdings alle folgenden nicht mehr. Mal abgesehen von der Tatsache das ich mehr Trodat Artikel habe. 1.jpg

Das deleted_at Feld dient nur der Blätterfunktion. 2.jpg

Ich habe die Suche (quasi den gleichen Code) in meiner Rechnungserwaltung im Einsatz, da klappt alles. Obwohl ich da auch anfangs Probleme hatte. Ich weiß nur nicht mehr, warum es dann auf einmal ging.
 
#4
Da mischst da alles durcheinander
Du suchst Resultate. Für jeden Fund füllst du die Werte in Variablen ab.
Dann startest du (immer noch pro Fund) die artikel.php. Dort kommt wieder eine Abfrage die Werte ausgibt. Das hat aber nix mit der Suche zu tun.
Wenn also 3 Funde sind, dann würden nach meinem Verständnis 3 mal alle Daten ausgegeben. Mit den ursprünglichen Daten aus dem Fund machst du gar nix

Code:
//suche.php
SELECT * FROM $tabelle1a WHERE suchresultate
while(resultate){
    ...
    include ("artikel.php");
}

//artikel.php
SELECT * FROM $tabelle1a WHERE deleted_at IS NULL ORDER BY unterkategorie
while(resultate){
    ...
    include ("artikel_anzeige.php");
}
Könnte es sein dass die Ziele 50 von der such.php die artikel_anzeige.php öffnen sollte anstelle von artikel.php?
 
#5
Hallo Yaslaw,

danke das war der Fehler. Jetzt muss ich da nur an der Optik feilen. Vielleicht erstelle ich dafür dann eine eigene "Suchergebnis-anzeigen". Aber das ist nicht so wild :cool:

Es ist aber gerade noch eine Frage aufgetaucht. Wenn ich einen Artikel speichere, und in der Artikelbezeichnung " verwendet habe, bekomme ich in meiner Rechnungsverwaltung Probleme, da mir da dann der Artikel nicht mehr angezeigt wird. Auf was muss ich da beim Auslesen achten?

Danke dir schon mal
 
#6
Du hast doch gar kein Feld Artikelbezeichnung.
Wird der Datensatz mit dem '' in der DB überhaubt eingetragen?
 
#8
Und wir die fehlende Zeile eingetragen? Ist sie in der DB drin?
 
#9
Ja, der Artikel ist gepeichert

So, kleines Bildbeispiel.
Hier ist der Artikel in der Artikeldatenbank (der erste):
3.jpg

Und hier siehst du meine Artikelauswahl in meiner Rechnungsverwaltung.
4.jpg
Hier wähle ich meine Artikel, erst die Kategorie, dann Unterkategorie, und wenn ich dann rechts auf die Kurzbeschreibung (kurzartikel) klicke, werden die Daten unten in die Felder eingetragen.
Klappt auch eigentlich einwandfrei. Außer ich habe in einem Artikel " mit drin.

Beim Speichern werden die Variablen verarbeitet
PHP:
$artikel = mysqli_real_escape_string($Connect, $artikel),
Nachtrag: Könnte es an:
PHP:
$artikel = htmlentities($row['artikel']);
liegen?
 
#10
Hast du mal den generierten HTML-Code an der Stelle angeschaut, an der der Text fehlt?
 
#11
Der wird an den " abgeschnitten, es werden auch die anderen Variablen nicht gefüllt.

Mal auszugsweise der Seitenquellcode von den 2 Zeilen, wie auf dem Bild oben:
HTML:
<td><input name="menge01" id="menge" value="1" size="4" onkeydown="replaceLetters(this)"/></td>
<td><input name="artikelnummer01" id="artikelnummer" value="651-149" size="10"/></td>   
<td><textarea name="artikel01" id="artikel" value="">Ansteckschild mit Magnet und Rahmen, 80 x 30 mm
verchromt, silber matt/schwarz</textarea></td>       
<td><input name="einzelpreis01" id="einzelpreis" value="6.99" size="10" onkeydown="replaceLetters(this)"/>
<input type="hidden" name="gesamtpreis01" id="gesamtpreis" value="6.99" size="10" onkeydown="replaceLetters(this)"/></td>
<td><input name="artikelnotiz01" type="hidden" value="" /></td>
</tr><tr style="background-color:#F7819F";>
<td>29193</td>   
<td></td>       
<td></td>           
<td><input name="menge02" id="menge" value="" size="4" onkeydown="replaceLetters(this)"/></td>
<td><input name="artikelnummer02" id="artikelnummer" value="" size="10"/></td>   
<td><textarea name="artikel02" id="artikel" value="">Stempel Trodat Printy 4912,
47 x 18 , Blau - 
<!-- hier müsste eigentlich noch "Kopie" kommen ---- außerdem müssten alle values gefüllt sein -->
</textarea></td>       
<td><input name="einzelpreis02" id="einzelpreis" value="" size="10" onkeydown="replaceLetters(this)"/>
<input type="hidden" name="gesamtpreis02" id="gesamtpreis" value="0" size="10" onkeydown="replaceLetters(this)"/></td>
<td><textarea name="kurzartikel" id="kurzartikel" value=""></textarea>
<input name="artikelnotiz02" type="hidden" value="" /></td>
</tr>
 
#12
Hm.. da weiss ich auch grad nicht weiter. Meine letzte PHP-Zeile die ich schrieb müsste inzwischen etwa 6 Jahre alt sein......
 
#13
Hallo Yaslaw,

trotz allem, vielen Dank für deine Mühen. Ich werde mal weiter rum probieren wie ich die " da als Störfaktor raus bekomme.

Da meine ursprüngliche Frage ja geklärt ist, schließe ich dieses Thema als gelöst :rolleyes::D


Nachtrag: Lösung gefunden!!
Meine Auswahlfelder werden ja durch php erzeugt und dort fehlte ein "htmlentities"

Hier der Code der mir mein letztes Auswahlfeld erzeugt:
PHP:
$result =  mysqli_query($Connect, "SELECT * FROM $tabelle1a WHERE  unterkategorie='$unterkategorie[1]' AND kategorie='$unterkategorie[0]'  ORDER BY unterkategorie, sort ASC");
while($row = mysqli_fetch_row($result))
    echo '<option value="'.htmlentities($row[5]).'|'.htmlentities($row[7]).'">'.htmlentities($row[7]).'</option>';
mysqli_free_result( $result );
print_r($_POST);
 
Zuletzt bearbeitet: