хорошо, так как у меня была точно такая же проблема, я дал ей шанс, и она, кажется, работает очень хорошо.
Следующая функция находится внутри класса обтекания базы данных и ожидает, что она будет вызываться как printfгде %%
преобразуется в литерал%, %e
отмечает строковый аргумент, который должен быть экранирован, а %u
отмечает строковый аргумент, который принимается как есть.
LOGDB
- вторая база данныхОберточный класс, который отвечает за перехват и регистрацию всех видов ошибок.
public static function query($format)
{
$query = $format . ' ';
$argc = func_num_args();
$argv = func_get_args();
$index_query = 0;
$index_args = 1;
while (($index_query = strpos($query, '%', $index_query)) !== false)
{
switch ($query[$index_query + 1])
{
case '%':
$query = substr_replace($query, '', $index_query, 1);
$index_query++;
break;
case 'e':
if ($index_args >= $argc)
{
LOG::failedQuery($format, "not enough arguments for format");
return false;
}
$query = substr_replace($query, DB::escape($argv[$index_args]), $index_query, 2);
$index_query += strlen($argv[$index_args]);
$index_args++;
break;
case 'u':
if ($index_args >= $argc)
{
LOG::failedQuery($format, "not enough arguments for format");
return false;
}
$query = substr_replace($query, $argv[$index_args], $index_query, 2);
$index_query += strlen($argv[$index_args]);
$index_args++;
break;
default:
LOG::failedQuery($format, "unknown control sequence '%" . $query[$index_query + 1] . "'");
return false;
}
}
if ($index_args != $argc)
{
LOG::failedQuery($format, "too many arguments for format");
return false;
}
$res = mysqli_query(self::$handle, $query);
if (!$res)
LOGDB::failedQuery($query, mysqli_error(self::$handle));
return $res;
}
Примечание: код в основном не проверен, скорее всего, он содержит кучу ошибок.используйте с осторожностью:)