MySql einfache Abfrage einer Zeichenfolge wie ?

  • PHP

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von mottzi.

    MySql einfache Abfrage einer Zeichenfolge wie ?

    hey, ich kriege einfach die einfachsten Sachen nicht hin, bin aber froh dass es euch gibt :)
    undzwar möchte ich eine simple Abfrage erstellen.

    in

    PHP-Quellcode

    1. $name
    steht Tobias. jetzt möchte ich gern Abfragen ob in der Tabelle

    SQL-Abfrage

    1. Namen
    in der Spalte

    SQL-Abfrage

    1. vorname
    der Name Tobias existiert.
    Bei mir bleibt leider die Seite immer weiss.
    Er sollte eig. ein echo ausgeben mit

    PHP-Quellcode

    1. existiert
    oder

    PHP-Quellcode

    1. existiert nicht
    .

    Mein Bisheriger Code, dürfte Müll sein:

    PHP-Quellcode

    1. <?php
    2. $Name = mysql_real_escape_string($_POST['l']);
    3. $Name 2= mysql_real_escape_string($_POST['ci']);
    4. @mysql_connect('**********', '******', '**********') or die (mysql_error());
    5. @mysql_select_db('*****') or die (sqlerror(mysql_errno(), mysql_error()));
    6. $query = "SELECT * FROM `Namen`";
    7. $result = mysql_query($query);
    8. while ($row = mysql_fetch_assoc($query)) {
    9. $ls = $row['Vorname']);
    10. if ($ls == $Name) {
    11. echo 'existiert';
    12. }
    13. else
    14. {
    15. echo 'existiert nicht';
    16. }
    17. }
    18. ?>


    Danke für eure Mühe
    Moin,

    die MySQL-Schnittstelle ist veraltet und unsicher. Benutze objektorientiertes MySQLi, dann sollten auch deine Probleme verschwinden: phpbuddy.eu/mysqli-erweiterung-php-5.html
    Mit freundlichen Grüßen,
    Thunderbolt
    Warum die Seite weiß bleibt? Mit MySQL hat das nichts zutun. Kleiner Tipp: $Name 2="

    Detaillierte Antwort

    Wie ich deinen "Müll" entnehmen kann, hast du schon ein paar rudimentäre Grundkenntnisse. Lass uns die doch noch mal etwas ausbauen. Im folgenden gehe ich von einer PHP-Version 5.3.0 oder höher aus.

    Benutze beim Entwickeln immer folgende Zeile: error_reporting(-1); ini_set('display_errors', 1);
    Damit bekommst du die meisten Fehler direkt angezeigt.

    Jetzt das "einlesen" von Variablen: Guter Stil ist es, zunächst zu überprüfen, ob überhaupt Variablen übergeben wurden:

    PHP-Quellcode

    1. if(!isset($_POST['l'], $_POST['ci'])) {
    2. die('Keine Variablen gesetzt');
    3. }


    Danach kannst du sie in extra Variablen speichern - ist nicht notwendig, schadet aber auch nichts:

    PHP-Quellcode

    1. $name = $_POST['l'];
    2. $name2 = $_POST['ci'];

    Zu beachten: kein Leerzeichen zwischen "$Name" und "2". In deinem Code sieht es so aus, dass die erste Variable einen Vornamen enthält, also lass uns die Variable auch so benennen und $vorname = $_POST['l'] schreiben. ("l" ist übrigens ein suuuper Name ; )

    Nun zum Aufbau der Datenbankverbindung.
    Das ist eigentlich schnell gemacht... aber die mysql-Erweiterung ist -wie schon erwähnt- deprecated. D.h. nicht mehr zu verwenden. Als Alternative bietet sich u.a. "mysqli" an. Ist quasi das gleiche - nur mit "i". Damit kann man ganz toll objektorientiert programmieren... naja, mehr oder weniger, eher weniger... aber für den Anfang reicht es:

    PHP-Quellcode

    1. $db = new mysqli('HOST', 'USER', 'PASS', 'DATABASE');


    Nun prüfen wir hier so ob die Verbindung erfolgreich aufgebaut wurde:

    PHP-Quellcode

    1. if($db->connect_error) {
    2. die('Fehler beim Verbindungsaufbau zu MySQL: '.$db->connect_error);
    3. }


    Nun willst du wissen, ob jemand mit dem angegebenen Vornamen in deiner Tabelle existiert.
    Das *kann* man natürlich so machen, wie du dir das gedacht hast... aber man kann (und sollte) es anders machen:

    PHP-Quellcode

    1. $query = sprintf("SELECT * FROM `Namen` WHERE `Vorname` = '%s'", $db->real_escape_string($vorname));
    2. $result = $db->query($query);

    Wir bemühen direkt die DB um nachzuschauen, ob es jemanden mit dem Namen gibt, anstatt selbst per Schleife zu prüfen.

    Nun wieder schnell prüfen, ob die Abfrage erfolgreich war:

    PHP-Quellcode

    1. if(!$result) {
    2. die('Fehler bei Abfrage');
    3. }


    und dann die lang ersehnte Ausgabe:

    PHP-Quellcode

    1. if($result->num_rows > 0) {
    2. echo 'existiert';
    3. // du kannst dir hier z.B. den Eintrag aus der Tabelle mit
    4. // $result->fetch_assoc() holen und weiter damit arbeiten...
    5. }
    6. else {
    7. echo 'existiert nicht';
    8. }


    Nicht notwendig, aber durchaus sinnvoll, können wir die Ergebnisdaten freigeben und die Verbindung schließen:

    PHP-Quellcode

    1. $result->free();
    2. $db->close();


    Falls kein HTML-Code nach "?>" mehr folgt, ist es gute Praxis die Begrenzung "?>" am Ende gleich wegzulassen.

    Alles zusammen (ungetestet):

    PHP-Quellcode

    1. <?php
    2. error_reporting(-1); ini_set('display_errors', 1);
    3. if(!isset($_POST['l'])) {
    4. die('Keine Variable gesetzt');
    5. }
    6. $vorname = $_POST['l'];
    7. $db = new mysqli('HOST', 'USER', 'PASS', 'DATABASE');
    8. if($db->connect_error) {
    9. die('Fehler beim Verbindungsaufbau zu MySQL: '.$db->connect_error);
    10. }
    11. $query = sprintf("SELECT * FROM `Namen` WHERE `Vorname` = '%s'", $db->real_escape_string($vorname));
    12. $result = $db->query($query);
    13. if(!$result) {
    14. die('Fehler bei Abfrage');
    15. }
    16. if($result->num_rows > 0) {
    17. echo 'existiert';
    18. }
    19. else {
    20. echo 'existiert nicht';
    21. }
    22. $result->free();
    23. $db->close();

    versuch mal mysql_real_escape_String nach der initialisierung/instanzierung des datenbanktreibers auszuführen.
    Außerdem, solltest du Variablen zusammen schreiben oder wenn du trennzeichen verwenden möchtest, beispielsweise unterstriche verwenden, dann klappt das auch ohne, dass ein fatal error geworfen wird :)
    und nebenbei, wäre es toll wenn wir auch nochmal deine Funktion "sqlerror" zu gesicht bekommen würden :)
    und sonst halt, wie bereits gesagt, solltest du vermeiden noch den alten datenbanktreiber zu verwenden, dieser ist seit PHP 5.5. als deprecated deklariert und wird mit php 5.6 explementiert.

    und bzgl. der tatsächlichen suche, wäre es idealer das als where Statement an ursprüngliche Statement zu hängen, andernfalls kannst du dir auch jeweilige Filterfunktionen auch sparen, außerdem ist der obige aufgeführte weg von dir nicht performant. Ebenso würdest du für jede Zeile auf die deine Verzweigung nicht zutrifft ein "nicht existiert" ausgegeben bekommen. Was sicher nicht sinn und zweck der sache ist.
    Aussderdem: Dein Problem besteht auch in Zeile 9. mysql_fetch_assoc() erwartet als Paramater keinen Query sondern den Resulthandler darauf.
    "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
    Paul Thurrott

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mottzi“ ()