Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: mysql_real_escape_string удлаяет плюс в +1
 
 автор: Ninjak   (10.11.2011 в 01:18)   письмо автору
 
 

Здравствуйте.

Нужна ваша помощь.

есть стринг:
$str = "+1";

После работы mysql_real_escape_string() $str = "1", т.е. плюс куда-то пропадает.
Причём, пропадает он только если этот "+" стоит самым первым символом в переменной, в других случаях не пропадает.

Кодировка 1251.

Как поступить в этом случае, чтобы плюс никуда не исчезал, и в тоже время не пострадала безопасность.

Надеюсь на вашу помощь, ибо сам что-то уже ничего умного придумать не могу.

  Ответить  
 
 автор: Саня   (10.11.2011 в 01:26)   письмо автору
 
   для: Ninjak   (10.11.2011 в 01:18)
 

Полный код покажите.

  Ответить  
 
 автор: Ninjak   (10.11.2011 в 01:44)   письмо автору
 
   для: Саня   (10.11.2011 в 01:26)
 

function sqlesc($value) {
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}

$text = "+1";

$query = "INSERT INTO table WHERE text = ".sqlesc($text)."";
mysql_query($query);

если взять gettype(sqlesc($text)); — то вернёт стринг

а если написать
print $query, то строка выглядит так:
INSERT INTO table WHERE text = +1; — типа уже не строка, а инт

  Ответить  
 
 автор: Саня   (10.11.2011 в 02:16)   письмо автору
 
   для: Ninjak   (10.11.2011 в 01:44)
 

Для строки "+.123e-12" is_numeric() тоже выдаст true. Вполне корректное описание числа в экспоненциальной форме. Для любого валидного числа is_numeric() будет выдавать true. "0x920adf" — тоже валидное число в шестнадцатиричной форме.

is_numeric() проверяет числа, а не типы переменных. Если хотите проверять только цифры (то есть чтобы строка состояла только из цифр от 0 до 9), то применяйте ctype_digit() или preg_match('!^\d+$!', ...);

Плюс в mysql пропадает по тем же самым причинам. +1 без кавычек в запросе — обычное число. "+" отбрасывается, так как "1" и "+1" в числовом контексте — одно и то же, поэтому "+" отбрасывается за ненадобностью. И уже после этого число 1 преобразуется в строку "1" и записывается в строковое поле.

Это поведение легко проверить запросом "SELECT +1, 1, '+1';" и PHP-кодом "print +1;"

  Ответить  
 
 автор: Ninjak   (10.11.2011 в 11:09)   письмо автору
 
   для: Саня   (10.11.2011 в 02:16)
 

Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования