За последние 24 часа нас посетили 17967 программистов и 1716 роботов. Сейчас ищут 1838 программистов ...

Функции для экранирования кавычек в MySQL

Тема в разделе "PHP для новичков", создана пользователем Anonymous, 17 ноя 2006.

  1. Anonymous

    Anonymous Guest

    brodyaga, отвечаю — я модератор, и мне неосознанно захотелось.
    Но не будем уходить от основной темы.
    Для решения какой задачи требуется амперсанд?
    И как он работает? Вы в состоянии обьяснить?
    Если вы объясните это, я признаю, что я отделив ваши сообщения я был неправ.
     
  2. Anonymous

    Anonymous Guest

    // $str - переменная взята из GET лии POST - Если вдруг Вы пропустили
     
  3. Anonymous

    Anonymous Guest

    Ладно - дайте мне пожалуйста пол часа.
     
  4. Anonymous

    Anonymous Guest

    ....я пойду узнаю... что же это такое, и зачем оно нужно. ;)

    Хорошо, будет вашим домашним заданием. С работы приду — проверю.
     
  5. дадим ему полчаса?

    Но вообще-то, лично меня интересует принцип работы функции quoteStr()
    как-то он от меня ускользает, я бы сказал =)
     
  6. Anonymous

    Anonymous Guest

    Чебурген, прочитал. Смеялсо =))) По принципу, давайте сначала все поломаем, и сделаем заново... ))
    Кстати, а если я и правда захочу вставить в текст \\" ? Видимо, прийдется экранировать данную комбинацию? =)
     
  7. Anonymous

    Anonymous Guest

    PHP:
    1. <?php
    2. //  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">  //
    3.  
    4.  
    5. define('ENGINE_DATABASE_HOST',  'localhost');
    6. define('ENGINE_DATABASE_NAME',  'test');
    7. define('ENGINE_DATABASE_UNAME', 'test');
    8. define('ENGINE_DATABASE_PASS',  'test');
    9. define('ENGINE_PREFIX',         'www');
    10.  
    11. class ClassFunctions{
    12.    
    13.     function StripSlashes($text)
    14.     {
    15.         if (get_magic_quotes_gpc()) {
    16.             $text = stripslashes($text);
    17.         }
    18.         return $text;
    19.     }
    20. }
    21.  
    22. $functions = new ClassFunctions;
    23.        
    24.  
    25.  
    26. class ClassDataBase{
    27.    
    28.     function ClassDataBase($sqlserver, $sqluser, $sqlpassword, $database){
    29.  
    30.         $this->user = $sqluser;
    31.         $this->password = $sqlpassword;
    32.         $this->server = $sqlserver;
    33.         $this->dbname = $database;
    34.         $this->prefix = ENGINE_PREFIX;
    35.        
    36.         $this->sql_сonnect(); 
    37.     }
    38.     function prefix($table){
    39.         if($this->prefix != ""){
    40.             return $this->prefix."_".$table;
    41.         }else{
    42.             return $table;
    43.         }
    44.     }
    45.     function sql_сonnect()
    46.     {
    47.         $this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);
    48.  
    49.         if($this->db_connect_id){
    50.             if($this->dbname != ""){
    51.                 $dbselect = mysql_select_db($this->dbname);
    52.                
    53.                 if(!$dbselect){
    54.                     $this->db_connect_id = $dbselect;
    55.                     return false;
    56.                 }
    57.             }
    58.             return $this->db_connect_id;
    59.         }else{
    60.             return false;
    61.         }
    62.        
    63.     }
    64.    
    65.     function quoteString($str){
    66.          $str = "'".str_replace('\\"', '"', addslashes($str))."'";
    67.          return $str;
    68.     }  
    69. }
    70.  
    71. $database = new ClassDataBase(
    72.         ENGINE_DATABASE_HOST,
    73.         ENGINE_DATABASE_UNAME,
    74.         ENGINE_DATABASE_PASS,
    75.         ENGINE_DATABASE_NAME);
    76.  
    77.  
    78. $path = isset($_GET['path']) ? $functions->StripSlashes($_GET['path']) : "c:\\test";
    79.  
    80.  
    81. $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString(addslashes($path)."%")); 
    82.  
    83. echo $sql; 
    84.  
    85. // Выводит на экран
    86. // SELECT path FROM www_table WHERE path LIKE 'c:\\\\test%'
    87. // ПРОВЕРИЛ
    88. ?>
     
  8. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Я уже ответил ведь на этот вопрос достаточно четко:
     
  9. brodyaga
    А если запрос такой:
    SELECT path FROM %s WHERE path = %s"
    ?
     
  10. Anonymous

    Anonymous Guest

    PHP:
    1. <?php
    2. $sql = sprintf("SELECT path FROM %s WHERE path = %s",$database->prefix("table"),$database->quoteString($path));
    3.  
    4. //SELECT path FROM www_table WHERE path = 'c:\\test'
    5. //Проверил
    6. ?>
    7.  
     
  11. Anonymous

    Anonymous Guest

    brodyaga, и что это такое?
     
  12. Anonymous

    Anonymous Guest

    Кто здесь. Мне послышалось или и правда кто то сказал
    Показалось.

    P.S. IGNORE
    ВЫ в списке BOTS
     
  13. Anonymous

    Anonymous Guest

    Товарищ не смог доказать свою вменяемость. Я буду за вами наблюдать, дабы вы не навредили неокрепшим умам. Чистить глупости буду без предупреждений.
     
  14. brodyaga
    Вот тебе перемеменная
    $s="\x00\x22\x74\x65\x73\x74\x22\x00";
    запиши её в базу, а потом попробуй её же найти в базе с помощью LIKE
     
  15. В общем, пример этот, конечно, высосан из пальца.
    Но написал я его для того, чтобы показать тебе наглядно (по-другому ты не понимаешь), что твой способ работы с запросами имеет очень большие расхождения с МАНУАЛОМ.
    как в части удивительной функции quotestring, так и в части подготовки выражения для LIKE.
     
  16. Anonymous

    Anonymous Guest

    Код (Text):
    1. $var = "\x00\x22\x74\x65\x73\x74\x22\x00";
    2.  
    3. $sql = sprintf("INSERT INTO %s (path) VALUES (%s)",$database->prefix("table"),$database->quoteString($var));
    4. $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString($var."%"));
    В базе "test"
     
  17. второй запрос возвращает 0 строк.
    я проверял.

    Тебе привести здесь test case, чтобы все могли убедиться?
     
  18. Хм. прикольно.
    можно посмотреть новую редакцию функции quoteString?
     
  19. Anonymous

    Anonymous Guest

    Чебурген, да с ним бессмысленно разговоаривать...
     
  20. Anonymous

    Anonymous Guest

    Проверьте еще раз – у меня все работает
    Второй запрос выводит
    SELECT path FROM www_table WHERE path LIKE '\0"test"\0%'

    quoteString() или quoteString(addslashes())
    От ситуации.
     
  21. Должен отметить, кстати, что лично для меня понимание принципов экранирования данных в запросах вообще и для LIKE в частности, заняло довольно продолжительное время.
    Так что, я прекрасно понимаю, что у любого человека могут быть проблемы с этим вопросом.
     
  22. Anonymous

    Anonymous Guest

    Для администраторов – если Вы закрываете топик а потом его открываете убедительная просьба сообщать об этом авторам.
     
  23. твоё маниакальное стремление перевести разговор из практической плоскости на оскорбление администрации форума вызывает во мне большие сомнения в том, что мне вообще следует тебе что-либо объяснять.
     
  24. Anonymous

    Anonymous Guest

    Полный текст кода для проверки
    Имеем:
    test – база данных
    www_test – таблица с полем path

    PHP:
    1.  
    2. <?php
    3. //  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">  //
    4.  
    5.  
    6. define('ENGINE_DATABASE_HOST',  'localhost');
    7. define('ENGINE_DATABASE_NAME',  'test');
    8. define('ENGINE_DATABASE_UNAME', 'test');
    9. define('ENGINE_DATABASE_PASS',  'test');
    10. define('ENGINE_PREFIX',         'www');
    11.  
    12. class ClassFunctions{
    13.    
    14.     function StripSlashes($text)
    15.     {
    16.         if (get_magic_quotes_gpc()) {
    17.             $text = stripslashes($text);
    18.         }
    19.         return $text;
    20.     }
    21. }
    22.  
    23. $functions = new ClassFunctions;
    24.        
    25.  
    26.  
    27. class ClassDataBase{
    28.    
    29.     function ClassDataBase($sqlserver, $sqluser, $sqlpassword, $database){
    30.  
    31.         $this->user = $sqluser;
    32.         $this->password = $sqlpassword;
    33.         $this->server = $sqlserver;
    34.         $this->dbname = $database;
    35.         $this->prefix = ENGINE_PREFIX;
    36.        
    37.         $this->sql_сonnect(); 
    38.     }
    39.     function prefix($table){
    40.         if($this->prefix != ""){
    41.             return $this->prefix."_".$table;
    42.         }else{
    43.             return $table;
    44.         }
    45.     }
    46.      
    47.      function query($sql, $limit=0, $start=0){
    48.        
    49.         if(!$this->db_connect_id)
    50.             return false;
    51.        
    52.         mysql_select_db($this->dbname);
    53.            
    54.         if ( !empty($limit) ) {
    55.             if (empty($start)) {
    56.                 $start = 0;
    57.             }
    58.             $sql = $sql. ' LIMIT '.(int)$start.', '.(int)$limit;
    59.         }
    60.        
    61.         $result = mysql_query($sql, $this->db_connect_id);
    62.         if ( $result ) {
    63.             return $result;
    64.         } else {
    65.             $result = false;
    66.             return $result;
    67.         }
    68.     }
    69.     function sql_сonnect()
    70.     {
    71.         $this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);
    72.  
    73.         if($this->db_connect_id){
    74.             if($this->dbname != ""){
    75.                 $dbselect = mysql_select_db($this->dbname);
    76.                
    77.                 if(!$dbselect){
    78.                     $this->db_connect_id = $dbselect;
    79.                     return false;
    80.                 }
    81.             }
    82.             return $this->db_connect_id;
    83.         }else{
    84.             return false;
    85.         }
    86.        
    87.     }
    88.     function fetchArray($result){
    89.         return @mysql_fetch_assoc( $result );
    90.     }
    91.     function quoteString($str){
    92.          $str = "'".str_replace('\\"', '"', addslashes($str))."'";
    93.          return $str;
    94.     }  
    95. }
    96.  
    97. $database = new ClassDataBase(
    98.         ENGINE_DATABASE_HOST,
    99.         ENGINE_DATABASE_UNAME,
    100.         ENGINE_DATABASE_PASS,
    101.         ENGINE_DATABASE_NAME);
    102.  
    103.  
    104.  
    105. $var = "\x00\x22\x74\x65\x73\x74\x22\x00";
    106.  
    107. $sql = sprintf("INSERT INTO %s (path) VALUES (%s)",$database->prefix("table"),$database->quoteString($var));
    108. $database->query($sql);
    109.  
    110.  
    111. $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString($var."%"));
    112. if (false != $result = $database->query($sql)) {
    113.     $numrows = @mysql_num_rows($result);
    114.     for($n=0;$n<$numrows;$n++) {
    115.         if (false !=$f = $database->fetchArray( $result)){
    116.             echo $f['path']."<br>";
    117.         }
    118.     }
    119. }
    120. ?>
    Данный код запишет переменную $var ("test")в БД и тут же произведет поиск
     
  25. итак.
    что мы имеем.
    код с предыдущей страницы.
    два запроса (с предыдущей же страницы):
    PHP:
    1.  
    2. #$sql = sprintf("INSERT INTO test (ttt) VALUES (%s)",$database->quoteString($var));
    3. $sql = sprintf("SELECT ttt FROM test WHERE ttt LIKE %s",$database->quoteString(addslashes($var)."%"));    
    4. echo $sql."<br>";
    5. $res=mysql_query($sql) or die($sql."<br>".mysql_error());
    6. echo mysql_num_rows($res);
    7.  
    Закомментированный запрос вставляет данные, второй - запрашивает.ю
    у меня возвращает 0 записей.