You can try this (it works with strings and arrays):
<?php
// oop
class sqlite extends SQLiteDatabase {
public function escape($data) {
if(is_array($data))
return array_map("sqlite_escape_string", $data);
return sqlite_escape_string($data);
}
}
$db = new sqlite("dbname");
$values = array("hell'o", "he'y");
$values = $db->escape($values); // returns array("hell''o", "hey''y")
// procedural
function sqlite_myescape($data) {
if(is_array($data))
return array_map("sqlite_escape_string", $data);
return sqlite_escape_string($data);
}
$values = array("hell'o", "he'y");
$values = sqlite_myescape($values); // returns array("hell''o", "hey''y")
?>
sqlite_escape_string
(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)
sqlite_escape_string — Escapa uma string para ser usada como um parâmetro em uma query
Descrição
$item
)
sqlite_escape_string() irá corretamente marcar a string
especificada por item
para usar em uma SQL com o SQLite. Isto inclui dobrar as
aspas simples (') e verificar os caracteres binários
que não sejam seguros na query.
Se item contém um caractere NULL,
ou se começa com um caractere cujo o valor ordinal seja
0x01, o PHP irá aplicar um tema para codificar binários então
você pode de modo seguro guardar e recuperar dados binários.
Mesmo que a codificação faça ser seguro inserir os dados, ela fará com que comparações simples de texto e clausulas LIKE nas suas queries não possam ser usadas para as colunas que contém dados binários. Na prática, isto não deve ser um problema, já que seu tema deve ser algo que você não utiliza coisas assim em colunas binárias ( de fato, deve ser melhor guardar dados binários usando outros meios, como em arquivos).
addslashes() NÃO deve ser usada para as suas queries com o SQLite; ela irá levar a resultados estranhos quando você recuperar os seus dados.
Nota: Não utilize esta função para codificar retornados por uma UDF( Função Definida pelo Usuário) criada usando sqlite_create_function() ou sqlite_create_aggregate() - use ao invés sqlite_udf_encode_binary().
@minots: simplify what you are doing:
<?php
function sqlite_escape_array( &$arr ) {
$invalid = array( 'argv', 'argc' );
foreach ( $arr as $key => $val )
if ( ( strtoupper( $key ) != $key ) && !is_numeric( $key ) && !in_array( $key, $invalid ) ) {
if ( is_string( $val ) )
$arr[$key] = sqlite_escape_string( $val );
else if ( is_array( $val ) )
sqlite_escape_array( $arr[$key] );
}
return $arr;
}
?>
I'm not sure if the condition is equivalent to yours, but this excludes any numeric key, any completely uppercase'd keys and some selected (argc and argv) special keys. In case of never passing $GLOBALS or $_SERVER as argument one might shorten everything to this as a "pipelined" version:
<?php
function sqlite_escape_array( $arr ) {
foreach ( $arr as $key => $val )
if ( is_string( $val ) )
$arr[$key] = sqlite_escape_string( $val );
else if ( is_array( $val ) )
$arr[$key] = sqlite_escape_array( $val );
return $arr;
}
?>
PHP's syntax is more powerful than those of many other languages, even when it's supporting their one's as well.
sqlite_escape_string() does not catch all HTML characters that may
conflict with a browser display. Notice the difference with the
custom routine below
<?php
# php lib command
$str = "Advoid! /slashes\, 'single' and these <too>";
$str = sqlite_escape_string($str);
echo "<br>$str<br>";
# custom function
$str = "Advoid! /slashes\, 'single' and these <too>";
$str = clean($str);
echo "<br>$str<br>";
function clean($str) {
$search = array('&' , '"' , "'" , '<' , '>' );
$replace = array('&', '"', ''', '<', '>' );
$str = str_replace($search, $replace, $str);
return $str;
}
?>
Output:
Advoid! /slashes\, "single" and these
Advoid! /slashes\, 'single' and these <too>
sometimes i you have to escape an array instead of a string.
my function to do it works like:
array sqlite_escape_array ( &array string)
<?php
function sqlite_escape_array(&$arr)
{
while ( list($key, $val) = each($arr) ):
if ( (strtoupper($key)!=$key OR "".intval($key) == "$key") && $key!="argc" and $key!="argv"):
if (is_string($val)):
$arr[$key]=sqlite_escape_string($val);
endif;
if (is_array($val)):
$arr[$key]=sqlite_escape_array($val);
endif;
endif;
endwhile;
return $arr;
}
?>
