PC-Freak :D
Hi, ich bin am überlegen, was die beste und unkomplizierteste Möglichkeit ist, die Queries für SQL sicher zu machen. Es muss nicht bis ins letzte durchdacht und unglaublich kompliziert und verstrickt sein^^.
Früher habe ich immer so was wie mysqli_real_escape_string benutzt. Aber jetzt bin ich auf "prepared statements" gestoßen. Das soll ja ziemlich sicher sein, zumindest habe ich das so gelesen.
Nur ist es so:
Bisher habe ich (für die "internen" Funktionen, auf dessen Werte die User keinen Einfluss haben) eine query()-Methode benutzt. Die geht einfach so, dass ich als ersten Parameter das SQL schicke und als 2. Parameter den Rückgabetyp, z.B. das Array mit den Inhalten aus der Datenbank.
Jetzt dann diese Prepared-Statements zu benutzen würde das ja komplett umstellen. Die query()-Methode könnte ich so ja gar nicht mehr benutzen.
Meine Fragen:
1. Ist es wirklich nötig, prepared statements zu verwenden? Oder ist das ein unnötiger Aufwand?Weil ich halt alles umbauen müsste und ich dann nicht mehr so "bequem" Queries ausführen könnte.
2. Bei mir funktioniert es nicht. Wenn ich schreibe:
Call to undefined method Database:repare()
Ich weiß jetzt nicht, welche Stelle im Code dafür wichtig ist. Hier sind mal die beiden Datenbank-Klassen, die ich benutze. die erste, abstract, Klasse ist da, damit die ganzen "externen" Klassen Zugriff auf das Datenbank-Objekt haben. Also alle anderen Klassen werden damit erweitert
Ich glaube, die Fehlermeldung kommt, weil ich das Datenbank-Objekt an sich anspreche, und die die eigentliche Verbindung zur Datenbank. Aber ich schaff es nicht, das hinzubekommen. Habt ihr Ideen?
Irgendwie will es heute absolut nicht klappen. Ich hock schon ewigkeiten davor und schaff es nicht. Hab auch schon im Internet geschaut. Heute ist absolut nicht mein Tag^^
Ich hoffe ich habe jetzt keine Angaben vergessen, falls ja, dann sorry^^Dann werde ich es noch nachreichen
Vielen Dank schon mal
LG
EDIT:
Okay, das oben beschriebene Problem habe ich gelöst. War gestern irgendwie zu blöd. War ganz einfach.
Das Problem, welches ich jetzt habe, ist folgende Fehlermeldung:
Call to undefined method mysqli_stmt::get_result()
Wenn ich schreibe
Habe gelesen, dass man dafür erst einen Treiber auf dem Webspace installieren muss. Das kann ich (glaube ich) bei strato nicht. Also fallen prepared statements ja schon weg :/
Gibt es noch andere Möglichkeiten?
Früher habe ich immer so was wie mysqli_real_escape_string benutzt. Aber jetzt bin ich auf "prepared statements" gestoßen. Das soll ja ziemlich sicher sein, zumindest habe ich das so gelesen.
Nur ist es so:
Bisher habe ich (für die "internen" Funktionen, auf dessen Werte die User keinen Einfluss haben) eine query()-Methode benutzt. Die geht einfach so, dass ich als ersten Parameter das SQL schicke und als 2. Parameter den Rückgabetyp, z.B. das Array mit den Inhalten aus der Datenbank.
Jetzt dann diese Prepared-Statements zu benutzen würde das ja komplett umstellen. Die query()-Methode könnte ich so ja gar nicht mehr benutzen.
Meine Fragen:
1. Ist es wirklich nötig, prepared statements zu verwenden? Oder ist das ein unnötiger Aufwand?Weil ich halt alles umbauen müsste und ich dann nicht mehr so "bequem" Queries ausführen könnte.
2. Bei mir funktioniert es nicht. Wenn ich schreibe:
$stmt = self::$database->prepare($sql);
Call to undefined method Database:repare()
Ich weiß jetzt nicht, welche Stelle im Code dafür wichtig ist. Hier sind mal die beiden Datenbank-Klassen, die ich benutze. die erste, abstract, Klasse ist da, damit die ganzen "externen" Klassen Zugriff auf das Datenbank-Objekt haben. Also alle anderen Klassen werden damit erweitert
PHP:
class Buildings extends DatabaseBased {...}
PHP:
abstract class DatabaseBased {
protected static $database;
public static function setDatabase(Database $database)
{
self::$database = $database;
}
}
class Database
{
public $connection;
public function __construct($host, $user, $password, $database) {
$this->connection = mysqli_connect($host, $user, $password, $database);
if (mysqli_connect_errno()) {
throw new Exception(__METHOD__.'::'.mysqli_connect_error());
}
// Die jetzt erstellte Instanz wird in DatabaseBased gespeichert
DatabaseBased::setDatabase($this);
}
public function close() {
if (!$this->connection) return false;
$this->connection->close();
}
public function query($sql, $return='affected', $result_mode=MYSQLI_USE_RESULT) {
$data = array();
if ($result = $this->connection->query($sql, $result_mode)) {
if ($return=='affected'){ $data = $this->connection->affected_rows; }
elseif ($return=='num'){ $data = mysqli_num_rows($result); }
elseif ($return=='id'){ $data = $this->connection->insert_id; }
elseif ($return=='assoc'){ while ($row = $result->fetch_assoc()) $data[] = $row; }
elseif ($return=='numeric'){ while ($row = $result->fetch_assoc()) $row = $result->fetch_array(MYSQLI_NUM); }
elseif ($return=='fields'){ while ($row = $result->fetch_fields()) $data[] = $row; }
elseif ($return== 'ressources') { while($row = $result->fetch_assoc()) $data[$row["ressourceId"]] = $row; }
else { while($row = $result->fetch_assoc()) $data[$row[$return]] = $row; }
if (is_object($result)) $result->close();
} else {
throw new Exception(__METHOD__.'::'.$this->connection->error.'::'.$sql);
}
return $data;
}
public function startTransaction()
{
if (!$this->connection) return false;
$ok = $this->query("SET AUTOCOMMIT=0");
return ($ok && $this->query("START TRANSACTION"));
}
public function commit()
{
if (!$this->connection) return false;
if (!$this->query("COMMIT")) return false;
$this->query("SET AUTOCOMMIT=1");
return true;
}
public function rollback()
{
if (!$this->connection) return false;
if (!$this->query("ROLLBACK;")) return false;
$this->query("SET AUTOCOMMIT=1");
return true;
}
}
Ich glaube, die Fehlermeldung kommt, weil ich das Datenbank-Objekt an sich anspreche, und die die eigentliche Verbindung zur Datenbank. Aber ich schaff es nicht, das hinzubekommen. Habt ihr Ideen?
Irgendwie will es heute absolut nicht klappen. Ich hock schon ewigkeiten davor und schaff es nicht. Hab auch schon im Internet geschaut. Heute ist absolut nicht mein Tag^^
Ich hoffe ich habe jetzt keine Angaben vergessen, falls ja, dann sorry^^Dann werde ich es noch nachreichen
Vielen Dank schon mal
LG
EDIT:
Okay, das oben beschriebene Problem habe ich gelöst. War gestern irgendwie zu blöd. War ganz einfach.
Das Problem, welches ich jetzt habe, ist folgende Fehlermeldung:
Call to undefined method mysqli_stmt::get_result()
Wenn ich schreibe
PHP:
$result = $stmt->get_result();
Habe gelesen, dass man dafür erst einen Treiber auf dem Webspace installieren muss. Das kann ich (glaube ich) bei strato nicht. Also fallen prepared statements ja schon weg :/
Gibt es noch andere Möglichkeiten?
Zuletzt bearbeitet: