suchfunktion funktioniert nicht
adrinator
- php
Bei folgenden Code tritt ein Fehler auf:
<?php
mysql_connect("localhost","root","") or die
("Keine Verbindung zur Datenbank hergestellt. Wenden Sie sich bitte an den Administrator!");
mysql_select_db("filme") or die
("Die Datenbank existiert nicht. Wenden Sie sich bitte an den Administrator!");
if ($suchwort != "")
{
//MySQL-Abfrage\
$abfrage = "SELECT * FROM filme
ORDER BY titel
ASC WHERE titel
= '".$_POST["suchwort"]."';";
$ergebnis = mysql_query($abfrage);
//Kopf der Tabelle\
echo "<table border='1'>\n<tr><th>Titel</th><th>Genre</th><th>Bewertung</th><th>Kommentar</th><th>Standort</th></tr>\n";
//Tabelleninhalt schreiben\
while($row = mysql_fetch_assoc($ergebnis))
{
echo "<tr><td>".$row["titel"]."</td><td>".$row["genre"]."</td><td>".$row["bewertung"]."</td><td>".$row["kommentar"]."</td><td>".$row["standort"]."</td></tr>\n";
}
//Tabellenende\
echo "</table>\n";
//Tabellenende\
echo "</table>\n";
}
else
{
?>
Der Fehler sieht so aus:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\DVD\suchen.php on line 44
Wieso ist das so?
mfg
adrian
Hello,
*meiohmei*
Bei folgenden Code tritt ein Fehler auf:
Nur einer?
<?php
mysql_connect("localhost","root","") or die
Wo lässt Du das Ergebnis der Funktion?
$con = > mysql_connect("localhost","root",""); ## Das die() ist eine Unverschämtheit für den Benutzer!
mysql_select_db("filme") or die
("Die Datenbank existiert nicht. Wenden Sie sich bitte an den Administrator!");
if ($con)
{
$db = mysql_select_db("filme", $con);
}
else
{
## qualifiziete Fehlerbehandlung
}
if ($suchwort != "")
woher kommt denn das jetzt?
{
//MySQL-Abfrage\
$abfrage = "SELECT * FROMfilme
ORDER BYtitel
ASC WHEREtitel
= '".$_POST["suchwort"]."';";
aha, ein Post-Parameter...
der noch nicht einmal escaped wird, vevor er in das Query eingebaut wird
Lies Dir mal verschiedene Dinge durch:
http://de3.php.net/manual/en/security.globals.php
http://de.wikipedia.org/wiki/SQL-Injektion
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:
error_reporting(E_ALL);
PHP schreit nach Hilfe du hörst aber nicht zu.
Bei MYSQL abfragen verwendet man immer or die(mysql_error()); Während der Entwicklung.
Wenn das Skript das macht was man möchte, dann gilt, alle Fehler ausgaben rauszunehmen.
Also PHP Fehler und ganz wichtig MYSQL Fehler.
Fehlermeldungen machen es dem event. Angreifer einfacher deine Datenbank Struktur zu verstehen.
Alle Meldungen/ Fehler usw sollten beseitigt werden.
Prüfe alle eingaben eines Users auf Logik und escape diese.
Man schreibt niemals SELECT * FROM ...
Sondern selectiere die Felder die du haben möchtest.
Das erhöht die Lesbarkeit und die Performance wenn man nicht wirklich alle Spalten haben möchte.
Hello,
Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:
error_reporting(E_ALL);
Aber nur zum Debuggen...
Sonst schreibt man das möglichst nicht rein.
Wenn man darf, schreibt man die passenden Direktiven in die Host-Konfiguration, dort, wo man sie für jeden Host (Virtual Host) einzeln ändern kann.
In einer .htaccess-Datei kann man dann z.B. diese generellen, für den produktiven Einsatz bestimmten Direktiven wieder ändern für den Testeinsatz.
Ersatzweise kann man die Direktive auch an eine Variable oder einen Environment-Parameter koppeln
if (isset ($_SERVER['DEBUG'])) error_reporting (E_ALL);
oder
if (isset ($_GET['debug']) and ) $_GET['debug'] = 'password') error_reporting (E_ALL);
für einen Billig-Account bei "Werbe-Fritz"
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hello,
*ach mann*
if (isset ($_GET['debug']) and ) $_GET['debug'] == 'password') error_reporting (E_ALL);
----
für einen Billig-Account bei "Werbe-Fritz"
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
error_reporting(E_ALL);
Aber nur zum Debuggen...
Hatte ich doch auch so geschrieben.
In meinem Projekt werden MYSQL Fehler in einer Log Datei geschrieben während des Liveeinsatzes.
So sehe ich zumindest ob jemand was versucht oder nicht.
Und kann mein Skript immer weiter anpassen. Und event. vergessene Lücken sofort schliessen.
Macht aber auch nur Sinn bei größeren Projekten.
Wenn man nix davon mitbekommt wird es schwer.
MfG
Thorsten
Hello,
error_reporting(E_ALL);
Aber nur zum Debuggen...
Hatte ich doch auch so geschrieben.
In meinem Projekt werden MYSQL Fehler in einer Log Datei geschrieben während des Liveeinsatzes.
So sehe ich zumindest ob jemand was versucht oder nicht.
Und kann mein Skript immer weiter anpassen. Und event. vergessene Lücken sofort schliessen.
Macht aber auch nur Sinn bei größeren Projekten.Wenn man nix davon mitbekommt wird es schwer.
Ja, da hast Du Recht.
Das totale Ignorieren der Notices und Fehlermeldungen ist tödlich.
Ich wollte auch nur klar machen, dass man nicht generell "E_ALL" festschreibt für eine Script, sondern die Meldungen differenziern muss zwischen solchen für die Laufzeit und solchen für die Testzeit.
Laufzeitmeldungen zum Frontend sollten für den Programm-Betreuer der Seite vollends unwichtig sein, denn die sollten immer einen erwarteten Zustand dokumentieren. Und diejenigen, die das Backend regististriert für den Betreuer sollten für den Besucher immer verborgen bleiben.
Aber dieses große Thema wächst hier im Forum auch erst heran. Dedlfix wollte schon länger mal eine Artikel verfassen und ich würde das sicherlich auch gerne unterstützten...
Vielleicht finden sich ja noch zwei, drei Coautoren, um auch Screenshots beisteuern zu können usw.
Erfahrung aus der Praxis ist schließlich das, was die meisten Fragensteller hier suchen.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
echo $begrüßung;
Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:
error_reporting(E_ALL);
Wenn man kann, notiert man diese Angabe lieber in der Per-Verzeichnis-Konfigurationsdatei. Beim Apachen mit mod_php in die (meist so benannte) .htaccess, bei CGI in die (im Verzeichnis des aufgerufenen Scripts liegende) php.ini.
Bei MYSQL abfragen verwendet man immer or die(mysql_error()); Während der Entwicklung.
Das die() zu verwenden, ist eine schlechte Idee. Auch schon während der Entwicklung.
Wenn das Skript das macht was man möchte, dann gilt, alle Fehler ausgaben rauszunehmen.
Damit veränderst du das Script und sein Verhalten im Fehlerfall. Du musst anschließend sämtliche Tests wiederholen, um sicherzustellen, dass nun immer noch alles so läuft wie gewollt. Ich finde es besser, gleich von Anfang an, ein robustes, Fehler mit einkalkulierendes Script zu schreiben. Die Ausgaben der Fehlermeldungen kommen dann in den "Abfrage war nicht erfolgreich"-Zweig. Da sich gelegentlich herausstellt, dass auch Scripte im Produktiveinsatz noch Fehler enthalten, sollte man sich nicht aller Möglichkeiten des Debuggens berauben. Vielmehr sollte man sie, wie von Tom schon vorgeschlagen, schaltbar machen. (if (DEBUG) echo mysql_error(); oder Log-Ausgabe)
echo "$verabschiedung $name";