Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > волшебные кавычки


Автор: Всемогущий 9.7.2007, 16:57
есть функция для обработки данных перед вставкой их в бд.
Появляются не нужные кавычки,помогите решить задачу.
Код

<?php
$a='       7        ';
$b='  Обычный текст   ';
$c='
          ';
function on_null($d=null){
         $d=trim($d);

           settype($one=intval($d), "string")   ;
           settype($two=$d, "string")     ;
           if($one===$two){
           settype($d, "integer" )     ;
              return  intval($d) ;
           }elseif(is_string($d)  and strlen(trim($d))>0){
             // $d=mysql_real_escape_string($d) ;
              $d="'$d'";
              return $d ;
           }else return 'null';


}

echo  on_null($a) ;  echo  "<br>\r\n"  ;  //должно быть 7 без кавычек

echo  on_null($b) ;  echo  "<br>\r\n"  ;  //должен быть текст в одинарных кавычках

echo  on_null($c) ;  echo  "<br>\r\n"  ;   //должен выводить null



?>


Добавлено через 59 секунд
http://www.artkabinet.ru/gallery6.php

Автор: GZep 9.7.2007, 17:14
а так не проще?
Код

    function on_null($var) {
        switch (gettype($var)) {
            case "string" : return "'" . $var . "'";
            case "integer" : return $var;
        }
        return NULL;
    }


Добавлено через 2 минуты и 33 секунды
можно даже так:
Код

    function on_null($var = null) {
        if ($var == null)
             return; //или return null - одно и тоже
        return is_string($var) ? "'" . $var . "'" : $var;
    }

Автор: UADeveloper 9.7.2007, 17:33
Цитата(GZep @  9.7.2007,  17:14 Найти цитируемый пост)
можно даже так:

Null при условии топикстартера не обрабатывается (если в строке одни пробелы).

Код
    function on_null($var = null) {
        $var=trim($var);
        if ($var == null)
         return; //или return null - одно и тоже
        return is_string($var) ? "'" . $var . "'" : $var;
    }

Автор: sTa1kEr 9.7.2007, 18:42
Всемогущий
Цитата(Всемогущий @  9.7.2007,  16:57 Найти цитируемый пост)
           settype($one=intval($d), "string")   ;

Никогда так не делайте, если передаете переменную по ссылке! Т.к. в данном случае вы передаете ссылку не на переменную, а на результат операции присваивания. Хотя, по идеи, в данном случае PHP должен как минимум выдавать нотис.

Код

$one = intval($d);
settype($one, "string");

Вот так переменная будет корректно передана по ссылке.

И зачем вообще такая странная проверка? Проще проверять через is_numeric
Код

function on_null($var = null)
{
   $var = trim($var);
   if (is_numeric($var)) // или ctype_digit() вместо is_numeric(), если дробные числа должны считаться как строки
   {
      return intval($var);
   }
   else if(!empty($var) && is_string($var))
   {
      return "'$var'";
   }
   else
   {
      return "null";
   }
}


PS И зачем почем зря Мерлина обидели? smile

Автор: Всемогущий 9.7.2007, 18:45
UADeveloper
заменил на ваш вариант,всё равно лишние кавычки.
посмотреть можно по той же ссылке.
GZep, ваш вариант не подходит по той причине ,что все данные приходят как string

а я потом разбираю где что

Автор: UADeveloper 9.7.2007, 18:59
Цитата(Всемогущий @  9.7.2007,  18:45 Найти цитируемый пост)
GZep, ваш вариант не подходит по той причине ,что все данные приходят как string

А что мешает сделать так?

Код
function on_null($var = null)
{
   $var = trim($var);
   if (is_numeric($var)) // или ctype_digit() вместо is_numeric(), если дробные числа должны считаться как строки
   {
      $var = intval($var);
      settype($var, "integer"); 
      return $var;
   }
   else if(!empty($var) && is_string($var))
   {          
      $var = "'$var'";
      settype($var, "string");
      return $var;
   }
   else
   {
      return "null";
   }

}

Автор: sTa1kEr 9.7.2007, 19:08
UADeveloper, чему вы людей учите? smile
Цитата(UADeveloper @  9.7.2007,  18:59 Найти цитируемый пост)
      $var = intval($var);
      settype($var, "integer"); 

Зачем писать два раза одно и тоже? Эти строки эквивалентны.

Цитата(UADeveloper @  9.7.2007,  18:59 Найти цитируемый пост)
   else if(!empty($var) && is_string($var))
   {          
      $var = "'$var'";
      settype($var, "string");

То же самое, зачем приводить к string-у, когда двумя строчками выше итак проверили, что это string?

Автор: Всемогущий 10.7.2007, 02:33
Спасибо за внимание,на локальной машине всё прекрасно работает(и моя ,и любая из ваших функций),
 а на сервере числа почему то обрамляются в совершенно не нужные мне одинарные кавычки,

поэтому главный вопрос:   как наверняка отключить Magic Quotes или какой то другой механизм который добавляет лишние символы

set_magic_quotes_runtime (0) не помогло...

Автор: GZep 10.7.2007, 04:38
через .htaccess. Если не заработает - выведет ошибку сервера 505, если не выведет эту ошибку - волшебные кавычки отключены.
Код

php_flag magic_quotes_gpc Off


Или вот - очень интересный пример:
Код

<?php
//Disabling magic quotes at runtime
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
}
?> 

Автор: Всемогущий 10.7.2007, 06:49
Ещё раз спасибо,
Оказывается у меня нет возможности отключить magic_quotes :(
решил проблемму самым ламерским способом: 
для получения на выходе типа integer стал перед return`ом к результату прибавлять ноль  :(

Код

<?php
set_magic_quotes_runtime (0) ;
$a='       7        ';
$b='  Обычный текст   ';
$c='
          ';
//echo get_magic_quotes_gpc();

function on_null($d=null){
         $d=trim($d);

           settype($one=intval($d), "string")   ;
           settype($two=$d, "string")     ;
           if($one===$two){


              return  ($d+0) ; echo'!!!!';
           }elseif(is_string($d)  and strlen(trim($d))>0){
             // $d=mysql_real_escape_string($d) ;
              $d="'$d'";
              return $d ;
           }else return 'null';


}




var_dump(on_null($a))   ;  echo  "<br>\r\n"  ;  //должно быть 7 без кавычек

var_dump( on_null($b)) ;  echo  "<br>\r\n"  ;  //должен быть текст в одинарных кавычках

var_dump( on_null($c)) ;  echo  "<br>\r\n"  ;   //должен выводить null(это строка 4 символа)



?>

Автор: Всемогущий 10.7.2007, 09:36
нашел,убил.
Код

function on_null($input=null){
         $input=trim($input);
         $string=$string1=strval($input);
         $int=$int1=intval($input);
         settype($int1, "string");
         if($int1===$string1)
         return   $int1 ;
         elseif( strlen($string)>0){
        // $string=mysql_real_escape_string($string) ;

         return   "'$string'";
                 }else return 'null';


         /* settype($string, "string");
            settype($int, "integer" );       */



}

Автор: sTa1kEr 10.7.2007, 10:30
Цитата(Всемогущий @  10.7.2007,  02:33 Найти цитируемый пост)
поэтому главный вопрос:   как наверняка отключить Magic Quotes или какой то другой механизм который добавляет лишние символы

При чем здесь Magic Quotes? http://ru2.php.net/manual/en/security.magicquotes.php никогда не добавляет кавычки, а только экранирует (добавляет слеши) к существующим кавычкам.
Цитата

Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed. 

What are Magic Quotes
When on, all ' (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does. 

Цитата(Всемогущий @  10.7.2007,  06:49 Найти цитируемый пост)
для получения на выходе типа integer стал перед return`ом к результату прибавлять ноль  :(

Это абсолютно то же самое, как и использование функций intval() и settype()
Цитата(Всемогущий @  10.7.2007,  09:36 Найти цитируемый пост)
         $string=$string1=strval($input);
         $int=$int1=intval($input);
         settype($int1, "string");
         if($int1===$string1)

Очень забавный кусок кода smile

Автор: Всемогущий 10.7.2007, 15:16
sTa1kEr
пожалуйста подскажите Кто мог их добавлять??

Автор: sTa1kEr 10.7.2007, 16:01
Цитата(Всемогущий @  10.7.2007,  15:16 Найти цитируемый пост)
пожалуйста подскажите Кто мог их добавлять?? 

Кроме вашей функции их никто добавить не мог. Кроме того я показал во втором своем посте, как правильно проверять наличие числа в строке (а не через пятикратное конвертирование из int в string и обратно smile ). http://ru2.php.net/manual/ru/function.is-numeric.php, http://ru2.php.net/manual/ru/function.ctype-digit.php или если не доверяете этим функциям, то через preg_match("|^\d+$|", $var);
Если все равно не понятно откуда они берутся, то скажите какая у вас версия PHP и приведите полный код по которому вы тестируете. Будем разбиратся в конкретном случае.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)