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.‘ " ';
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).
→ 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]
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)
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.
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?
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)
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
?>