Auslesen von daten?

Hey leute,

mein problem:
ich habe eine probedatenbank mit bisjetzt nur einem eintrag zum ausprobieren.
und zwar handelt es sich um ein regiestrierungs script. in einem formular werden vom user die daten angegeben, diese werden ausgelesen und geprueft.
Als naechstes moechte ich, dass mittels SELECT genau der Username, den der User eingegeben hat, aus der datenbank ausgelesen wird, eben um zu pruefen ob der username schon vergeben ist.
Wie stelle ich das genau an? hab schon rumprobiert und habe soweit dieses hier:

        $mysqli = new mysqli ($Location,
                              $User,
                             $Password,
                             $DatabaseName);
        if (mysqli_connect_errno())
        {
            die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
        }
        $sql = 'SELECT
                    Username
                FROM
                      User
                WHERE
                   Username = "add" ';
        $result = $mysqli->query($sql);
        if (!$mysqli->query($sql))
        {
            echo 'Fehler ('.$mysqli->errno.'): '.$mysqli->error;
            echo '<p>DBSTATE: '.$mysqli->sqlstate.'</p>';
        }
        
        
        
        $mysqli->close();

in der datenbank liegt der username „add“ vor, deshalb ist er bei dem SELECT drinne. wenn ich es recht verstehe sollte es normaler weise so heissen:
WHERE
Username = " ‚.$Username.‘ " ';

koennt ihr mir helfen?

Was möchtest du denn jetzt genau wissen? Hast du das Script schon ausprobiert? Funktioniert daran etwas nicht?

ja habe es ausprobiert (und ja es geht.)
→ verbesserung: nochmal probiert, wenn ich einen benutzter eintrage denn es nicht gibt, also einen anderen als „add“ sagt der mir das trotzdem alles gut gelaufen ist.
muss ich noch eine isset($result) einfuegen um zu schauen ob der nicht rein zufaellig ‚‘ also nichts in result schreibt??
da er ja anscheinden keinen fehler sieht zb. adddd auszulesen obwohl es den ja gar nicht in der datenbank gibt.
die if schleife liefert mir einen fehler, wenn es den username nicht gibt. das will ich auch, aber wie gebe ich das SELECT aus?
also zum testen damit ich weiss es holt auch das richtige aus der datenbank?

Ich kenne zwar nicht die mysqli-Klasse, aber bei SQL liefert ein SELECT-Statement immer eine gültige Resource, wenn das Statement korrekt ist (Syntax, Namer der Felder und Tabellen). Auch wenn keine Datensätze ausgewählt wurden. Ich nutze in diesem Fall immer die mysql_num_rows()-Funktion (ich nutze auch nicht mysqli).

Gruß thuemmy

→ verbesserung: nochmal probiert, wenn ich einen benutzter eintrage denn es nicht gibt, also einen anderen als „add“ sagt der mir das trotzdem alles gut gelaufen ist.

Das ist Logisch der wird dir immer sagen wird das es Ok ist.
[FONT=Courier New]$mysqli->query() Liefert Dir immer nur einen Bolischen Wert (True/False).[/FONT]

[FONT=Courier New]True wird dir immer dann ausgeben wenn der Sql befehl richtig geschrieben war.[/FONT]
[FONT=Courier New]False dagen bekomst du Wenn der Sql Syntax falsch war.Also wenn ein Fehler bei der Abfrage aufgetretten ist.[/FONT]

[FONT=Courier New]Du prüft ja auch nirgendswo ob nun der Name wirklich in der Db stand.[/FONT]

[FONT=Courier New]Wenn du nur prüfen möchtes ob ein oder mehrer Datensätze gefunden wurden. Was aber eher unsicher ist dann kanst du num_rows verwenden.[/FONT]

[FONT=Courier New]Beispiel[/FONT]
[php]
$result = $mysqli->query($sql);
echo $result->num_rows;
[/php]

Wenn du aber prüfen möchtest obs den User gibt dann mußt du einen Vergleich machen mit dem Ergebniss aus der Datenbank .

Mfg Splasch

ich kann dir nur von mysqli abraten da es nichtmal persistente verbindungen unterstützt ^^ daher arbeite lieber direkt mit den datenbank anbindungen oder nimm halt PDO ^^

ich habe ein bisschen rumprobiert bzw mit affected_rows
erste frage:
ist es erlaubt php code in mysql statements reinzumachen?
also zb so:

        $sql = 'SELECT
                    Username
                FROM
                      User
                WHERE
                   Username = "'.$Username.'"';

zweite frage:
affected rows gibt ja ein integer ergebnis zurueck so weit ich weiss.
0 wenn nichts betroffen wurde, 1 oder mehr wenn 1 oder mehrere betroffen wurden.
aber was ist wenn es mir -1 zurueckgibt?

hier der code

if ('POST' == $_SERVER['REQUEST_METHOD'])
{
    $Username = trim($_POST['Username']);
    $Password[0]= trim($_POST['Password0']);
    $Password[1] = trim($_POST['Password1']);
    $Email[0] = trim($_POST['Email0']);
    $Email[1] = trim($_POST['Email1']);

    function NewDataBaseConnection($Location, $User, $Password, $DatabaseName, $Username)
    {
        $mysqli = new mysqli ($Location,
                              $User,
                             $Password,
                             $DatabaseName);
        if (mysqli_connect_errno())
        {
            die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
        }
        $sql = 'SELECT
                    Username
                FROM
                      User
                WHERE
                   Username = "'.$Username.'"';
        $result = $mysqli->prepare($sql);
        $result->execute();
        $result->bind_result($row);
        echo $mysqli->affected_rows.'<br>';

ist es erlaubt php code in mysql statements reinzumachen?
also zb so:

Ja ist es aber dann nutz du nicht die Schutz funktion vor Sql injection.

zweite frage:
affected rows gibt ja ein integer ergebnis zurueck so weit ich weiss.
0 wenn nichts betroffen wurde, 1 oder mehr wenn 1 oder mehrere betroffen wurden.
aber was ist wenn es mir -1 zurueckgibt?

Integer Wert ja. Aber wie komste auf die Anahmen von 0 1 oder -1 ?
Woher beziehst du diese Informaton?
$mysqli->affected_rows Ruft die Anzahl der betroffenen Zeilen in einer früheren MySQL Operation
Das sind dann die Zeilen je nach Abfrage was gefunden wurden 20,500 unsw.
(PHP: mysqli->affected_rows - Manual)

Mfg Splasch

da steht doch die antwort… PHP: mysqli->affected_rows - Manual

-1 ist ein fehler was eigentlich selbst verständlich für dich sein sollte bei funktionen die normalerweise nur <= 0 ausgibt ^^

Ja hab ich übersehen kann bassieren.

Rückgabewerte:
Ein Integer größer als Null gibt die Anzahl der betroffenen Zeilen oder abgerufen. Null deutet darauf hin, dass keine Datensätze aktualisiert, wenn für eine UPDATE-Anweisung, keine Zeilen mit der WHERE-Klausel in der Abfrage oder dass keine Abfrage ist noch nicht ausgeführt. -1 Bedeutet, dass die Abfrage einen Fehler zurückgegeben.

Mfg Splasch

okay sql injektion.
aber wie kann ich dann ueberpruefen ob ein username schon vergegeben wurde?
denn username versuchen mit INSERT in dei tabelle einzutragen und wenn es einen fehler gibt gibt der einen Fehler?
aber dann uebergege ich dem INSERT ja auch eine variable bzw mehrere, da ich ja die daten aus dem Formular in die datenbank eintragen muss?
desweiteren eine frage:
beachtet MySQL gross und klein schreibung?
also unterscheidet MySQL zwischen Add und add?? und wenn nicht wie kann einstelle das MySQL darauf achtet?
bzw ist er besser gross und klein schreibweise zu beachten wenn es um user geht? vermutlich nicht da es ja sonst zu verwechslungen kommen kann oder?

okay sql injektion.
aber wie kann ich dann ueberpruefen ob ein username schon vergegeben wurde?

Schützen kanst dich wenn du die vorgesehen funktionen dafür nutz.
[FONT=Courier New]prepare,bind_param[/FONT]
[FONT=Courier New][/FONT]
http://at.php.net/manual/de/mysqli.prepare.php

Achte dabei auf das ? Zeichen das steht als platzhalter für deine Variablen dadurch schütz du dich vor Sql injecten.
mit bind_param übergibst du nun deine Variablen an den Platzhalter.
(s steht übrings da damit die Variable als vom Type string übergeben wird.)

Ich Persönlich verwende aber lieber PDO als Mysqli !

beachtet MySQL gross und klein schreibung?
also unterscheidet MySQL zwischen Add und add?? und wenn nicht wie kann einstelle das MySQL darauf achtet?

Soweit ich weis gibt es eine Option mit dem man das angeben kann in Mysql

bzw ist er besser gross und klein schreibweise zu beachten wenn es um user geht? vermutlich nicht da es ja sonst zu verwechslungen kommen kann oder?

Wenn du verhindern willst das Namen doppelt eingetragen werden kanste die Spalte auf unique stellten und zusätzlich in php das Prüfen einfach den ganze string auf kleinschreibung umwandeln und dann miteinander vergleichen (strtoupper,strtolower)

Mfg Splasch

oh okay jetzt weiss ich was du meinst.
ich habe es sonst immer so gemacht:

        $sql = 'INSERT INTO user
                    (Username)
                VALUES
                      ("'.$Username.'")';
        $result = $mysqli->prepare($sql);
        $result->execute();
        echo $mysqli->affected_rows.'<br>';

und dann muesste es so aussehen?

        $sql = 'INSERT INTO user
                    (Username)
                VALUES
                      Username = ?';
        $result = $mysqli->prepare($sql);
        $result->execute();
        $result->bind_param("s", $Username);
        echo $mysqli->affected_rows.'<br>';

Ja genau ansonsten wird nähmlich der Schutz nicht verwendet.Erst das getrennte einbinden in den Sql befehl sorg für den Nötigen Schutz vor Sql Injecten.

Bei PDO sieht es übringd Ähnlich aus hier mal ein kleines Beispiel
(Eigene kleine Klasse unter verwendung von PDO mit Anwendungs Beispiel)

[PHP]

<?php # Zugangsdaten Definieren Statische Variable define("dbname", ""); #Datenbank Name define("dbServ", "localhost"); #Datenbank Server define("dbuid", ""); #Benutzename define("dbPw", ""); #Password define("prefix", "my_"); # Tabellen voranstellen # Klasse für die Verbindungs Daten class connect_db { private $dbhost=dbuid; #Benutzename private $pw=dbPw; #Password private $serv=dbServ; #Datenbank Server private $dbname=dbname; #Datenbank Name private $db_obj = null; #Datenbank Objekt PDO public $error; #Fehler Varibale public function __construct() { $db="mysql:dbname=".$this->dbname.";host=".$this->serv; #mysql:dbname=Datenbankname;host=localhost try{ $this->db_obj = new PDO($db, $this->uid, $this->pw); #Hier wird die Verbindung aufgebaut } catch (PDOException $e) { $this->error='Fehler beim Öffnen der Datenbank: ' . $e->getMessage(); echo $this->error; #Fehler ausgabe } }// Ende construct public function get_db() { return $this->db_obj; } } # Anwendungs Beispiel $obj = new connect_db; $db= $obj->get_db(); $sql="SELECT name FROM user WHERE sessionID=:sessionID LIMIT 1"; # Sql Befehl vorbereiten $stmt = $db->prepare($sql); # Sql befehl in den Speicher laden $stmt->bindParam( ':sessionID', $sessionID); #Werte an den Sql Befehl übergeben $stmt->execute(); # Befehl an die Datenbank senden #Daten ausgeben $data = $stmt->fetch(PDO::FETCH_OBJ); #Objekt der Datenabfrage $data zuweisen if (is_object($data)){ echo $data->name; } #Ergebnis der Abfrage am Bildschirm ausgeben ?>

[/PHP]

Mfg Splasch