Hello Vinzenz,
gleich noch eine weitere Frage im Nachtrag. Es geht dann schlussendlich darum
- welche Spaltentypen quotierte Daten zwingend erforderlich machen
- welche Spaltentypen quotierte Daten zulassen, aber auch ohne arbeiten
- welche Spaltentypen keine quotierten Daten zulassen
das ist ziemlich irrelevant, wenn man hübsch mit Prepared Statements arbeitet.
Das sollte an dieser Stelle nicht geschehen, aber danke für den Hinweis.
Für die Historie wird nachher das komplett fertiggestellte SQL-Query abgespeichert. Da wüsste ich jetzt nicht, wie ich das mit prepared Statements hinbekommen könnte.
siehe Handbuch
http://dev.mysql.com/doc/refman/5.1/en/literals.html
im Handbuch lese ich dauernd :-O
Aber es ist mir leider immer noch nicht ganz klar, welche Spaltentypen nun quoted werden MÜSSEN.
Hier mal die Funktionsgruppe, aus der mein Anliegen hervorgeht. Die dritte Funktion ist die wesentliche. Ich befürchte, bei Binary, Blob & Co. habe ich es falsch gemacht?
Es fehlt da noch diverse Dinge; hier geht es jetzt erstmal nur um das Quoting.
#-----------------------------------------------------------------------------------
function db_get_column_info($con, $tablename)
{
$sql = "select column\_name
, data\_type
from information\_schema
.COLUMNS
where table\_name
= '$tablename'";
if ($res = mysqli_query($con, $sql))
{
$_list = array();
while($_colinfo = mysqli_fetch_assoc($res))
{
$_list[$_colinfo['column_name']] = $_colinfo['data_type'];
}
# lower the key names and return them
return array_change_key_case ($_list);
}
return false;
}
#-----------------------------------------------------------------------------------
function db_escape_values($con, $_data)
{
if(!is_array($_data)) { return false; }
foreach($_data as $key => $value)
{
$_data[$key] = mysqli_real_escape_string($con, $value);
}
return $_data;
}
#-----------------------------------------------------------------------------------
function db_quote_values($con, $tablename, $_escaped_data)
{
if (!$_typeinfo = db_get_column_info($con, $tablename)) { return false; }
if (!is_array($_escaped_data)) {return false; }
$_escaped_data = array_change_key_case ($_escaped_data);
foreach($_escaped_data as $key => $data)
{
if (!isset($_typeinfo[$key])) { return false; }
switch ($_typeinfo[$key])
{
case 'tinyint':
case 'smallint':
case 'mediumint':
case 'int':
case 'bigint':
case 'bit':
# no quoting
break;
case 'float':
case 'double':
case 'decimal':
# no quoting
break;
case 'char':
case 'varchar':
case 'tinytext':
case 'text':
case 'mediumtext':
case 'longtext':
# qoute it!
$_escaped_data[$key] = "'$data'";
break;
case 'binary':
case 'varbinary':
case 'tinyblob':
case 'blob':
case 'mediumblob':
case 'longblob':
# no quoting
break;
case 'date':
case 'time':
case 'year':
case 'datetime':
$_escaped_data[$key] = "'$data'";
break;
case 'timestamp':
$_escaped_data[$key] = "from_unixtime($_escaped_data[$key])";
break;
case 'enum':
case 'set':
$_escaped_data[$key] = "'$data'";
break;
default:
## Datatype not recognized
return false;
}
}
return $_escaped_data;
}
#-----------------------------------------------------------------------------------
Wäre nett, wenn Du deinen Kommentar mal in die dritte Funktion schreiben könntest.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg