Abgesehen von der dumme Frage, die durch das Lesen der Handbuchseite nur beantwortet werden können, gibt es viel wichtigeres Problem angegeben:
würde die safe
Funktioniert richtig mit der SQL-Injektion?
Nr
Solange safe()
Funktion im Grunde tut nichts anderes als das mysql_real_escape_string über das übergebene Argument anwenden, sollte es nicht so genannt werden. Weil die Anwendung von mysql_real_escape_string nichts mit Injektionen oder Sicherheit zu tun hat.
Zumindest diese Funktion muss hinzufügen um übergebenen Wert zusätzlich zu entkommen. Es wird einige Abfragen fehlerhaft aber zumindest sicher machen.
Gibt es eine Möglichkeit, eine praktische Funktion wie den obigen Liner zu schreiben, während sichergestellt wird, dass alle Variablen, die in eine sichere Funktion eingeschlossen sind, ordnungsgemäß ausgeblendet werden.
Sicher.
Platzhalter verwenden.
$rs = getrs($dbh,"select firstname,lastname from users where userid=?",$uid);
Ein benutzerdefinierter Handler den Platzhalter ?
mit sicher vorbereitet Wert ersetzen.
Hier ist eine Funktion, die ich schon vor langer Zeit mit der gleichen Absicht als „oneliner“ aber mehr vernünftig, sowohl Sicherheit und Benutzerfreundlichkeit im Verstand geschrieben.
Es sicherlich nicht ideal - keine %
Zeichen haben direkt in der Abfrage gestellt werden, wie es printf Syntax ist verwenden. Und es hat keinen Platzhalter für die Bezeichner (sowie viele andere praktische Platzhalter). Und natürlich wäre eine OOP-Implementierung viel flexibler, da sie statt einer hässlichen "Modus" -Variable saubere, eindeutige Methoden hat.
Aber wenn Sie eine Funktion wünschen
function dbget() {
/*
usage: dbget($mode, $query, $param1, $param2,...);
$mode - "dimension" of result:
0 - resource
1 - scalar
2 - row
3 - array of rows
*/
$args = func_get_args();
if (count($args) < 2) {
trigger_error("dbget: too few arguments");
return false;
}
$mode = array_shift($args);
$query = array_shift($args);
$query = str_replace("%s","'%s'",$query);
foreach ($args as $key => $val) {
$args[$key] = mysql_real_escape_string($val);
}
$query = vsprintf($query, $args);
if (!$query) return false;
$res = mysql_query($query);
if (!$res) {
trigger_error("dbget: ".mysql_error()." in ".$query);
return false;
}
if ($mode === 0) return $res;
if ($mode === 1) {
if ($row = mysql_fetch_row($res)) return $row[0];
else return NULL;
}
$a = array();
if ($mode === 2) {
if ($row = mysql_fetch_assoc($res)) return $row;
}
if ($mode === 3) {
while($row = mysql_fetch_assoc($res)) $a[]=$row;
}
return $a;
}
?>
Sie können Ihre $ dbh hinzufügen, um es Anruf, aber ich sehe keinen Sinn darin.
gibt es eine Funktion in PHP, dass Sie die $ dbh passieren und es sagt Ihnen, ob es sich um eine MySQL oder MSSQL
Es gibt absolut keinen Punkt behandeln solche Funktion zu haben. Wenn man einen Datenbank-Handler benutzen muss, muss er offensichtlich wissen, zu welchem Datenbank-Treiber er gehört.
Oh. Und ich hoffe, dass Sie mysql_real_escape_string mit ms sql nicht verwenden werden.
[mysql_real_escape_string] (http://php.net/manual/en/function.mysql-real-escape-string.php) mit einem zweiten (optional) Parameter übernimmt - die Verbindungskennung. Sie sollten das Handle einer offenen Verbindung explizit an diese Funktion übergeben. –