PHP Australia Conference 2015

sqlite_escape_string

(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)

sqlite_escape_stringBereitet einen String für die Verwendung als SQL-Parameter auf

Beschreibung

string sqlite_escape_string ( string $item )

sqlite_escape_string() bereitet den String item so auf, dass er korrekt innerhalb eines SQL-Befehls als Parameter genutzt werden kann. Diese Wandlung enhält die Verdopplung von einfachen Anführungszeichen (') und die Überprüfung von nicht binärkompatiblen Zeichen.

Auch wenn die Aufbereitung ein sicheres Einfügen der Daten ermöglicht, werden einfache Stringvergleiche und LIKE-Bedingungen in Ihren Abfragen unbrauchbar gemacht, wenn die Spalten Binärdaten enthalten. In der Praxis sollte dies kein Problem darstellen, weil Ihr Datenbankschema so ausgelegt sein sollte, dass keine Binärdaten genutzt werden (denn eigentlich könnte es besser sein, die Binärdaten auf andere Art und Weise z.B. in Dateien zu speichern).

Parameter-Liste

item

The string being quoted.

Beinhaltet der Parameter item einen NUL Zeichen oder wenn er mit einem Zeichen beginnt, dessen ORDINAL Wert 0x01 ist, wird PHP ein binäres ENCODING Format anwenden, dass man sicher binäre Daten speichern und auslesenn kann.

Rückgabewerte

Returns an escaped string for use in an SQLite SQL statement.

Anmerkungen

Hinweis: Nutzen Sie diese Funktion nicht, um Rückgabewerte von benutzerdefinierten Funktionen (UDF) vorzubereiten, die mittels von sqlite_create_funtion() oder sqlite_create_aggregate()erzeugt wurden. Nutzen Sie sqlite_udf_encode_binary() stattdessen.

Warnung

addslashes() sollte NICHT genutzt werden, um Strings für SQLite-Anfragen aufzubereiten; es kann zu undefinierten Resultaten beim Abfragen der Daten führen.

Siehe auch

add a note add a note

User Contributed Notes 4 notes

up
3
carlo_greco at live dot it
4 years ago
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")
?>
up
2
soletan at toxa dot de
9 years ago
@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.
up
0
10 years ago
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;
}
?>
up
-1
jwzumwalt at neatinfo dot com
2 years ago
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('&amp;', '&quot;', '&#39;', '&lt;', '&gt;' );

 
$str = str_replace($search, $replace, $str);
  return
$str;
}
?>

Output:
Advoid! /slashes\, "single" and these
Advoid! /slashes\, 'single' and these <too>
To Top