Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2015, 10:20   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Экранирование символов

Доброго времени суток!
Есть PHP, добавляющий записи в таблицу.
PHP код:
<?php
include "dbconnect.php";
include(
'gettime.php');
// Проверка на пустоту
if (empty($_POST['nick'])) {
    die;
}
$report rtrim($_POST['report']);
$ip $_SERVER['REMOTE_ADDR']; // Получим IP-адрес пользователя
// Получаем IP-адрес из таблицы, если такой есть
$query "SELECT `ip_address` FROM `users` WHERE `ip_address` = '".$ip."'";
$result mysql_query($query) or die ("ERROR: ".mysql_error());
$sip mysql_fetch_array($result);
// Сверяем IP-адрес пользователя с IP-адресом, полученным из таблицы
if ($ip == $sip['ip_address']) {
    
// Если есть совпадение, то 
    // Получим кабинет
    
$query "SELECT `cabinet` FROM `users` WHERE `ip_address` = '".$ip."'";
    
$result mysql_query($query) or die ("ERROR: ".mysql_error());
    
$cabinet mysql_fetch_array($result);
    
// Полуим имя ПК
    
$query "SELECT `pc_name` FROM `users` WHERE `ip_address` = '".$ip."'";
    
$result mysql_query($query) or die ("ERROR: ".mysql_error());
    
$pcname mysql_fetch_array($result);
    
// Добавим отчёт пользователя
    
$query "INSERT INTO `cleanerreport` VALUES (NULL, '".$ip."', '".mysql_real_escape_string($_POST['nick'])."', '".$cabinet['cabinet']."', '".$pcname['pc_name']."', '".mysql_real_escape_string($_POST['client_version'])."', '".get_Datetime_Now()."', '".mysql_real_escape_string($report)."')";
    
$result mysql_query($query) or die ("ERROR: ".mysql_error());
}
?>
Записи в PHP передаются так
Код:
    // Отправка отчёта
    try
      HTTP := TIdHTTP.Create(nil);
      Data := TIdMultiPartFormDataStream.Create;
      try
        Data.AddFormField('nick', (String(UTF8Encode(Nick))), 'utf-8').ContentTransfer := '8bit';
        Data.AddFormField('client_version', FileVersion(MyGetPath(ExtractFilePath(Application.ExeName)) + 'LANMessenger.exe'));
        Data.AddFormField('report', (String(UTF8Encode(SL.Text))), 'utf-8').ContentTransfer := '8bit';
        HTTP.Post('http://192.168.0.2/lanm/cleanerreport.php', Data);
      except
      end;
    finally
      FreeAndNil(HTTP);
      FreeAndNil(Data);
    end;
В итоге отправляя "AppData\Local" при получении данных из таблицы
PHP код:
<?php
include "dbconnect.php";
// Проверка на пустоту
if (empty($_GET['crid'])) {
    die;
}
$Counter 0;

$query "SELECT * FROM `lan_messenger`.`cleanerreport`
         WHERE `uid` > '"
.intval(mysql_real_escape_string($_GET['crid']))."'
         ORDER BY `uid`"
;
$result mysql_query($query) or die ("ERROR: ".mysql_error());
if (
mysql_num_rows($result) > 0) {
    while (
$row mysql_fetch_array($result)) {
        
// Берём результаты из каждой строки
        
echo $row['uid'].'~'.$row['ip_address'].'~'.$row['nick'].'~'.$row['cabinet'].'~'.$row['pc_name'].'~'.$row['client_version'].'~'.$row['date'].'~'.$row['report'].'!end-post'// Выводим данные
        
$Counter++;
    }
    echo 
'!row-count='.$Counter// Количества строк в таблице
}
?>
выводится \"AppData\\Local\"
Shouldercannon вне форума Ответить с цитированием
Старый 18.07.2015, 10:55   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
выводится \"AppData\\Local\"
В БД эти данные хранятся в таком же виде – \"AppData\\Local\" ?
По идее, так быть не должно – mysql_real_escape_string экранирует данные только для самого тела запроса, при этом не изменяя их в самой ячейке БД.
Причиной может быть какая-нибудь настройка из серии magic_quotes_*.
Экранирующие слэши можно убрать при помощи stripslashes.
Andkorol вне форума Ответить с цитированием
Старый 18.07.2015, 10:59   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

В БД хранятся в таком же виде.
stripslashes исправил положение.

Последний раз редактировалось Shouldercannon; 18.07.2015 в 11:09.
Shouldercannon вне форума Ответить с цитированием
Старый 18.07.2015, 11:11   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
В БД хранятся в таком же виде.
Тогда, скорее всего, причина именно в Magic Quotes – а именно в настройке magic_quotes_gpc.
Об этом есть упоминание в Примечаниях к описанию функции mysql_real_escape_string:
Цитата:
Замечание:
Если magic_quotes_gpc включены, то сначала данные следует обработать функцией stripslashes(). Если данную функцию применить к уже проэкранированным данным, то данные будут проэкранированы дважды.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экранирование Anton WordPress и другие CMS 7 18.04.2013 16:29
Правильное экранирование строки prizrak1390 JavaScript, Ajax 4 09.01.2013 00:15
Экранирование символов Lindemann66 C/C++ Базы данных 3 27.07.2011 13:29
Экранирование кавычек в С Antoha Общие вопросы C/C++ 7 16.05.2010 21:02
Экранирование символов Roms PHP 2 15.05.2010 13:09