[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача twin`a 3
ANG3
Сылка: нажми

Вот код.
При поиске _ и % выводит всё!
По стилю старался... biggrin.gif

Конструкции такого вида $x=труляля($x);
$x = trim($x);
не работают.


Свернутый текст
PHP
<?php
    
/* Функция адаптации данных под magic qoutes */
function adapting ($value){
   
    if (!
get_magic_quotes_gpc()) 
    {
    
$value mysql_real_escape_string($value);
    }
    return 
$value;
}

    
/* Функция очищения данных от пробелов и тегов */
function clean($value){
   
    
$value trim(htmlspecialchars($value));
    return 
$value;
}

     
/* Параметры соединения с БД */
$hostname  "";
$username  "";
$password  "";
$dbName    "";

    
    
/* Соединение, выбор БД */
 
$connect mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
    
mysql_select_db("$dbName") or die("Не найдена база данных"); 

    
    
/* Выбираем кодировку */
mysql_query("SET NAMES cp1251;");
    
                        
    
/* Обозначаем переменные */
    
$regname  = !empty($_POST['regname']) ? adapting($_POST['regname'])   :null;
    
$search   = !empty($_GET['search'])  ?  adapting($_GET['search'])     :null;
    
$date     =  date ('d.m.Y',mktime ());


                                
/* Выодим имя пользователя + дата */
if(isset($_GET['id']))
{
$getted_id intval($_GET['id']);
 
$sql_user mysql_query ("SELECT * FROM `users` WHERE `id` = '$getted_id'");
  while (
$row mysql_fetch_assoc($sql_user))
        {        
        echo 
'<h3>Имя пользователя: '.clean($row['name']). '<br /> 
        Дата регистрации пользователя '
.clean($row['date']).'</h3><br />';
        }
}                          
                              
                              
                              
/* Поиск по базе */
                        /* Если нажали поиск, то ищем: */
        
if(isset($_GET['search_button'])) 
{
        
    
/* Поиск слова по базе */
$sql_search mysql_query("SELECT * FROM `users` WHERE `name` LIKE '%".$search."%' ")
                                                                     or die (
mysql_error());
                                                                     
        
/* Считаем кол-во уже найденных пользователей */
    
$number mysql_num_rows($sql_search);

            
/* Выводим кол-во найденных пользователей */
        
if ($number == 0
        {
        echo 
"<CENTER><h3>Ничего не найдено</h3></CENTER>";
        } 
            else 
            {
            echo 
"<CENTER><h3>Найдено пользователей: ".$number."<h3><BR/><BR/></CENTER>";
              }

                
/* Вывод результата поиска*/
                
while ($row=mysql_fetch_assoc($sql_search)) 
                {
     echo 
'<li> <a href = regsearch.php?id='.intval($row['ID']).'>'.clean($row['name']).'</a><br />';                
                }
                               echo 
'<br/><br/>';
// Закончили поиск      

    /* полосочка */
echo '<table width="100%" bordercolor="#000000" bgcolor="#000000"><tr></tr></table><br/>';
                        
    
                                        
/* Регистрация */
                                        
if(isset($_POST['reg_button'])) 
{

        
/* Добавляем пользователя в базу */
          
mysql_query ("INSERT INTO `users` 
                       ( `name` , `date`) 
                    VALUES 
                       ('$regname', '$date')"
);

                             
/* Редирект */
                    
header("location: ".$_SERVER['PHP_SELF']." ");
                        exit();

// Закончили регистрацию


                                    /* Изначальный вывод результата поиска*/

$sql_output mysql_query("SELECT * FROM `users` ORDER BY `id` DESC");                                
while (
$row=mysql_fetch_assoc($sql_output)) 
{
echo 
'<li> <a href = regsearch.php?id='.intval($row['ID']).'>'.clean($row['name']).'</a><br />';
}
                                    
?>


<form method='POST' action='?'>
  <p align='left'><b>Поиск и регистрация.</b>
<p align='left'><font face='Tahoma'><input type='text' name='regname' size='40'>
  Регистрация</font></p>
<p align='left'><font face='Tahoma'><input type='submit' value='Зарегистрироваться' name='reg_button'>
</form>
<form method='GET' action='?'>
  <p align='left'><font face='Tahoma'><input type='text' name='search' size='40' 
  value="<?php echo $_GET['search']; ?>">
  Поиск пользователей</font></p>
  <p align='left'><font face='Tahoma'><input type='submit' value='Искать' 




Спустя 10 минут, 6 секунд (20.08.2009 - 20:39) Gabriel написал(а):
а кодировка как вручную выставляеться?
Цитата
Èìÿ ïîëüçîâàòåëÿ: <iframe src="http://phpforum.ru" />
Äàòà ðåãèñòðàöèè ïîëüçîâàòåëÿ 19.08.2009

ато думаю такое мало кому понравиться увидеть у себя в браузере

Спустя 3 минуты, 24 секунды (20.08.2009 - 20:43) ANG3 написал(а):
blink.gif blink.gif blink.gif blink.gif

У меня нормально оотображается. Щас посмотрю...

Спустя 5 минут, 53 секунды (20.08.2009 - 20:49) ANG3 написал(а):
В opere и IE 6 норм. Странно...
http://browsershots.org/http://regsearch.z...earch.php?id=71
Ща поправим.

Спустя 1 минута, 10 секунд (20.08.2009 - 20:50) Gabriel написал(а):
ну у меня в ие7 вот такая вот беда.
в мозиле тож. в опере 9.6 норм.

Спустя 11 минут, 27 секунд (20.08.2009 - 21:01) ANG3 написал(а):
Вот блин. http://browsershots.org/ раз в сутки. Но вроде исправил. Заценивайте )

Спустя 1 час, 23 минуты, 26 секунд (20.08.2009 - 22:25) twin написал(а):
Запустить не смог чёто...
Из того что так увидел.
1. magic_quotes отработана не корректно. Функция mysql_real_escape_string() специально предназначена для использования в запросах, так что полагаться на магические кавычки не стоит. Лучше убрать последствия этой директивы, а функцию применить в любом случае.
2. Вот тут
PHP
mysql_select_db("$dbName")
зачем переменная в кавычках?
3. Следующая строка. Нет проверки запроса, а он не проходит. Отсюда и проблемы с кодировками.
4. Чуть ниже. Вот это
PHP
$date     =  date ('d.m.Y',mktime ());

прекрасно умеет делать мускул. Если поставить тип поля timestamp или использовать встроенную NOW()
5. Дальше. Нет обработки спецсимволов \ и %, их поиск некорректен.
6. Вот тут
PHP
echo '<li> <a href = regsearch.php?id='.intval($row['ID']).'>'.clean($row['name']).'</a><br />';

почему то id в верхнем регистре. Не сработает.
7. Редирект. Заголовок отдается после вывода. Кирдык Нотис будет.
8. Возврат в форму не обработан. XSS не за горами.

Из плюсов.
1. Код читабелен, хотя местами не очень аккуратен. Стоит обратить внимание на подстановку переменных и фигурные скобки. Как то в одном стиле надо, а то ни рыба ни курица.
2. Комментарии. Это хорошая привычка.
3. Ну и самое главное - самостоятельность решений. Почет и уважение.












Спустя 7 минут, 22 секунды (20.08.2009 - 22:32) Soldier Ghost написал(а):
Сделай проверки у тебя пустоту регит

Спустя 21 час, 51 минута, 14 секунд (21.08.2009 - 20:23) ANG3 написал(а):
1. А как корректно сделать? Работает всё нормально. У меня это делалось через function adapting ($value). Объясни поподробнее.
2. Исправил.
3. Не знаю правильно ли я тебя понял, но сделал вот так
PHP
mysql_query("SET NAMES cp1251;") or die(mysql_error());

4. Поставил поле timestamp. Выводит неправилную дату.
Поэтому сделал Varchar / date ('d.m.Y H:i');
Расскажи подробнее про это.
5. Исправил.
6. Исправил.
7. Исправил.
8. Исправил. Хз правильно или нет.

Проверку сделал.

Код:

Свернутый текст
PHP
<?php
    
/* Функция адаптации данных под magic qoutes */
function adapting ($value)
{
    if (!
get_magic_quotes_gpc()) 
    {
    
$value mysql_real_escape_string($value);
    }
        return 
$value;
}

    
/* Функция очищения данных от пробелов и тегов */
function clean($value)
{
    
$value trim(htmlspecialchars($value));
    return 
$value;
}

     
/* Параметры соединения с БД */
$hostname  "localhost";
$username  "root";
$password  "123";
$dbName    "test";

    
    
/* Соединение, выбор БД */
 
$connect mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
    
mysql_select_db($dbName) or die("Не найдена база данных"); 

    
    
/* Выбираем кодировку */
mysql_query("SET NAMES cp1251;") or die(mysql_error());
    
                        
    
/* Обозначаем переменные */
    
$regname  = !empty($_POST['regname']) ? adapting($_POST['regname'])    :null;
    
$search   = !empty($_GET['search'])   ?  adapting($_GET['search'])     :null;
    
$date     =  date ('d.m.Y H:i'); //прекрасно умеет делать мускул. Если поставить тип поля timestamp или использовать встроенную NOW(). 
    
                                    /* Регистрация */
                                        
if(isset($_POST['reg_button'])) 
{
    if (
strlen($regname) < 3)        // Чтобы пустую форму не отправляли, начиная с 3 символов
    
{  
    
header ("Location: ".$_SERVER['PHP_SELF']." ");   // до вывода
    
exit();
    }    
        

        
/* Добавляем пользователя в базу */
          
mysql_query ("INSERT INTO `users` 
                       ( `name` , `date`) 
                    VALUES 
                       ('$regname', '$date')"
);

                             
/* Редирект */
                    
header("location: ".$_SERVER['PHP_SELF']." ");  // до вывода
                        
exit();

// Закончили регистрацию


                                /* Выодим имя пользователя + дата */
if(isset($_GET['id']))
{
$getted_id intval($_GET['id']);
 
$sql_user mysql_query ("SELECT * FROM `users` WHERE `id` = '$getted_id'");
  while (
$row mysql_fetch_assoc($sql_user))
        {        
        echo 
'<h3>Имя пользователя: '.clean($row['name']). '<br /> 
        Дата регистрации пользователя '
.clean($row['date']).'</h3><br />';
        }
}                          
                              
                              
                              
/* Поиск по базе */
                        /* Если нажали поиск, то ищем: */
        
if(isset($_GET['search_button'])) 
{
     
/* Экранируем %_ */
$search addcslashes($search"\%_");
        
    
/* Поиск слова по базе */
$sql_search mysql_query("SELECT * FROM `users` WHERE `name` LIKE '%".$search."%' ")
                                                                     or die (
mysql_error());
                                                                     
        
/* Считаем кол-во уже найденных пользователей */
    
$number mysql_num_rows($sql_search);

            
/* Выводим кол-во найденных пользователей */
        
if ($number == 0
        {
        echo 
"<CENTER><h3>Ничего не найдено</h3></CENTER>";
        } 
            else 
            {
            echo 
"<CENTER><h3>Найдено пользователей: ".$number."<h3><BR/><BR/></CENTER>";
              }

                
/* Вывод результата поиска*/
                
while ($row=mysql_fetch_assoc($sql_search)) 
                {
     echo 
'<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';                
                }
                               echo 
'<br/><br/>';
// Закончили поиск      

    /* полосочка */
echo '<table width="100%" bordercolor="#000000" bgcolor="#000000"><tr></tr></table><br/>';
                        


                                    
/* Изначальный вывод результата поиска*/

$sql_output mysql_query("SELECT * FROM `users` ORDER BY `id` DESC");                                
while (
$row=mysql_fetch_assoc($sql_output)) 
{
echo 
'<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';
}
                                    
?>

<html>
<head>
<title>Regsearch</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<form method='POST' action='?'>
  <p align='left'><b>Поиск и регистрация.</b>
<p align='left'><font face='Tahoma'><input type='text' name='regname' size='40'>
  Регистрация</font></p>
<p align='left'><font face='Tahoma'><input type='submit' value='Зарегистрироваться' name='reg_button'>
</form>
<form method='GET' action='?'>
  <p align='left'><font face='Tahoma'><input type='text' name='search' size='40' 
  value="<?php echo clean($_GET['search']); ?>">
  Поиск пользователей</font></p>
  <p align='left'><font face='Tahoma'><input type='submit' value='Искать' name='search_button'>
</fo


Спустя 58 минут, 56 секунд (21.08.2009 - 21:22) twin написал(а):
1. Функцию лучше написать так:
PHP
function adapting ($value)
{
    if (get_magic_quotes_gpc())
    $value = stripslashes($value);

        return  mysql_real_escape_string($value);

}

3. Правильно понял. Точка с зпятой в запросе не нужна.
4. Что значит неправильную?

Ну и в остальном гут. smile.gif Молодца.

Вот это только:
Цитата
/* Функция очищения данных от пробелов и тегов */
не то. Не очищает она от тегов, а переводит спецсимволы в эквиваленты. Это хоть и косметика, но дает представление о том, как ты понимаешь процессы.

Спустя 35 минут (21.08.2009 - 21:57) ANG3 написал(а):
Спасибо. Отличный урок. biggrin.gif

Цитата
4. Что значит неправильную?


Вот в таком виде: 2019-08-20 09:00:00. Никогда не изменяется.


Сылка

Финальный код.

Свернутый текст
PHP
<?php
    
/* Функция адаптации данных под magic qoutes */
function adapting ($value)
{
    if (!
get_magic_quotes_gpc())
    
$value stripslashes($value);

        return  
mysql_real_escape_string($value);
}

    
/* Функция переводит спецсимволы в эквиваленты, убирает пробелы и табуляцию */
function clean($value)
{
    
$value trim(htmlspecialchars($value));
    return 
$value;
}

     
/* Параметры соединения с БД */
$hostname  "localhost";
$username  "root";
$password  "123";
$dbName    "test";

    
    
/* Соединение, выбор БД */
 
$connect mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
    
mysql_select_db($dbName) or die("Не найдена база данных"); 

    
    
/* Выбираем кодировку */
mysql_query("SET NAMES cp1251") or die(mysql_error());
    
                        
    
/* Обозначаем переменные */
    
$regname  = !empty($_POST['regname']) ? adapting($_POST['regname'])    :null;
    
$search   = !empty($_GET['search'])   ?  adapting($_GET['search'])     :null;
    
$date     =  date ('d.m.Y H:i'); //прекрасно умеет делать мускул. Если поставить тип поля timestamp или использовать встроенную NOW(). 
    
                                    /* Регистрация */
                                        
if(isset($_POST['reg_button'])) 
{
    if (
strlen($regname) < 3)        // Чтобы пустую форму не отправляли, начиная с 3 символов
    
{  
    
header ("Location: ".$_SERVER['PHP_SELF']." ");   // до вывода
    
exit();
    }    
        

        
/* Добавляем пользователя в базу */
          
mysql_query ("INSERT INTO `users` 
                       ( `name` , `date`) 
                    VALUES 
                       ('$regname', '$date')"
);

                             
/* Редирект */
                    
header("location: ".$_SERVER['PHP_SELF']." ");  // до вывода
                        
exit();

// Закончили регистрацию


                                /* Выодим имя пользователя + дата */
if(isset($_GET['id']))
{
$getted_id intval($_GET['id']);
 
$sql_user mysql_query ("SELECT * FROM `users` WHERE `id` = '$getted_id'");
  while (
$row mysql_fetch_assoc($sql_user))
        {        
        echo 
'<h3>Имя пользователя: '.clean($row['name']). '<br /> 
        Дата регистрации пользователя '
.clean($row['date']).'</h3><br />';
        }
}                          
                              
                              
                              
/* Поиск по базе */
                        /* Если нажали поиск, то ищем: */
        
if(isset($_GET['search_button'])) 
{
     
/* Экранируем %_ */
$search addcslashes($search"\%_");
        
    
/* Поиск слова по базе */
$sql_search mysql_query("SELECT * FROM `users` WHERE `name` LIKE '%".$search."%' ")
                                                                     or die (
mysql_error());
                                                                     
        
/* Считаем кол-во уже найденных пользователей */
    
$number mysql_num_rows($sql_search);

            
/* Выводим кол-во найденных пользователей */
        
if ($number == 0
        {
        echo 
"<CENTER><h3>Ничего не найдено</h3></CENTER>";
        } 
            else 
            {
            echo 
"<CENTER><h3>Найдено пользователей: ".$number."<h3><BR/><BR/></CENTER>";
              }

                
/* Вывод результата поиска*/
                
while ($row=mysql_fetch_assoc($sql_search)) 
                {
     echo 
'<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';                
                }
                               echo 
'<br/><br/>';
// Закончили поиск      

    /* полосочка */
echo '<table width="100%" bordercolor="#000000" bgcolor="#000000"><tr></tr></table><br/>';
                        


                                    
/* Изначальный вывод результата поиска*/

$sql_output mysql_query("SELECT * FROM `users` ORDER BY `id` DESC");                                
while (
$row=mysql_fetch_assoc($sql_output)) 
{
echo 
'<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';
}
                                    
?>

<html>
<head>
<title>Regsearch</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<form method='POST' action='?'>
  <p align='left'><b>Поиск и регистрация.</b>
<p align='left'><font face='Tahoma'><input type='text' name='regname' size='40'>
  Регистрация</font></p>
<p align='left'><font face='Tahoma'><input type='submit' value='Зарегистрироваться' name='reg_button'>
</form>
<form method='GET' action='?'>
  <p align='left'><font face='Tahoma'><input type='text' name='search' size='40' 
  value="<?php echo clean($_GET['search']); ?>">
  Поиск пользователей</font></p>
  <p align='left'><font face='Tahoma'><input type='submit' value='Искать' name='search_button'>
</fo


Спустя 15 минут, 1 секунда (21.08.2009 - 22:12) twin написал(а):
Дата в совершенно правильном формате. Самый логичный кстати. Называется азиатский. Когда все по убыванию, от года к секундам.
А не изменяется правильно, это же дата регистрации, а не часы)))
Цитата
Спасибо. Отличный урок.

Всегда пожалуйста))

Спустя 2 часа, 47 минут, 36 секунд (22.08.2009 - 01:00) ANG3 написал(а):
Про бекслеш то я забыл... sad.gif
Попробовал это:

PHP
$word = str_replace('\\', '\\\\', $word); // Сначала заменять один слеш на два, с помощью такого


Я вообще непонимаю смысла этого. + пошли косяки. Например SQL ошибка при поиске '. И ещё что-то было. В голове не удержал всего.

Сделал так:
PHP
$search = addcslashes($search, "'\%_");


Всё вроде работает. Есть только одна проблема. Возврат в форму выполняется с экранированными \ и '. Вместо " выводится \. Может быть вернуть чистую переменную?

От этой конструкции пришлось отказаться.

PHP
function adapting ($value)
{
    if (get_magic_quotes_gpc())
    $value = stripslashes($value);

        return  mysql_real_escape_string($value);

}


Незнаю почему, но на хостинге скрипт не работает с ней, на локальном норм.
Уже запутался со всем этим экранированием. blink.gif

Нужно ли вообще экранировать то, что возвращается в форму?
Больше никаких багов не нашёл. Пожалуйста потестите мой скрипт по сылке.

Вот код blink.gif

Свернутый текст
PHP
<?php
    
/* Функция адаптации данных под magic qoutes */
function adapting ($value){
   
    if 
(!get_magic_quotes_gpc()) 
    
{
    $value = mysql_real_escape_string($value);
    }
    return trim($value);
}


    /* Функция переводит спецсимволы в эквиваленты, убирает пробелы и табуляцию */
function clean($value)
{
    $value = trim(htmlspecialchars($value));
    return $value;
}

     /* Параметры соединения с БД */
$hostname  = "localhost";
$username  = "root";
$password  = "123";
$dbName    = "test";

    
    
/* Соединение, выбор БД */
 $connect = mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
    mysql_select_db
($dbName) or die("Не найдена база данных"); 

    
    
/* Выбираем кодировку */
mysql_query("SET NAMES cp1251") or die(mysql_error());
    
                        
    
/* Обозначаем переменные */
    $regname  = !empty($_POST['regname']) ? adapting($_POST['regname'])    :null;
    $search   = !empty($_GET['search'])   ?  adapting($_GET['search'])     :null;
    $date     =  date ('d.m.Y H:i'); //прекрасно умеет делать мускул. Если поставить тип поля timestamp или использовать встроенную NOW(). 
    
                                    
/* Регистрация */
                                        
if(isset($_POST['reg_button'])) 
{
    if (strlen($regname) < 3 ) //  начиная с 3 символов
    {  
    header 
("Location: ".$_SERVER['PHP_SELF']." ");   // до вывода
    exit();
    }    
        

        
/* Добавляем пользователя в базу */
          mysql_query ("INSERT INTO `users` 
                       ( `name` , `date`) 
                    VALUES 
                       ('$regname', '$date')"
);

                             /* Редирект */
                    header("location: ".$_SERVER['PHP_SELF']." ");  // до вывода
                        exit();

}
 // Закончили регистрацию


                                /* Выодим имя пользователя + дата */
if(isset($_GET['id']))
{
$getted_id = intval($_GET['id']);
 $sql_user = mysql_query ("SELECT * FROM `users` WHERE `id` = '$getted_id'");
  while ($row = mysql_fetch_assoc($sql_user))
        {        
        echo 
'<h3>Имя пользователя: '.clean($row['name']). '<br /> 
        Дата регистрации пользователя '
.clean($row['date']).'</h3><br />';
        }
}
                          
                              
                              
                              
/* Поиск по базе */
                        /* Если нажали поиск, то ищем: */
        
if(isset($_GET['search_button'])) 
{
     /* Экранируем '\%_ */
$search = addcslashes($search, "'\%_");
        
    
/* Поиск слова по базе */
$sql_search = mysql_query("SELECT * FROM `users` WHERE `name` LIKE '%".$search."%' ")
                                                                     or die (mysql_error());
                                                                     
        
/* Считаем кол-во уже найденных пользователей */
    $number = mysql_num_rows($sql_search);

            /* Выводим кол-во найденных пользователей */
        if ($number == 0) 
        
{
        echo "<CENTER><h3>Ничего не найдено</h3></CENTER>";
        } 
            else 
            
{
            echo "<CENTER><h3>Найдено пользователей: ".$number."<h3><BR/><BR/></CENTER>";
              }

                /* Вывод результата поиска*/
                while ($row=mysql_fetch_assoc($sql_search)) 
                
{
     echo '<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';                
                
}
                               echo '<br/><br/>';
}
 // Закончили поиск      

    /* полосочка */
echo '<table width="100%" bordercolor="#000000" bgcolor="#000000"><tr></tr></table><br/>';
                        


                                    
/* Изначальный вывод результата поиска*/

$sql_output = mysql_query("SELECT * FROM `users` ORDER BY `id` DESC");                                
while 
($row=mysql_fetch_assoc($sql_output)) 
{
echo '<li> <a href = regsearch.php?id='.intval($row['id']).'>'.clean($row['name']).'</a><br />';
}
                                    
?>

<html>
<head>
<title>Regsearch</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<form method='POST' action='?'>
  <p align='left'><b>Поиск и регистрация.</b>
<p align='left'><font face='Tahoma'><input type='text' name='regname' size='40'>
  Регистрация</font></p>
<p align='left'><font face='Tahoma'><input type='submit' value='Зарегистрироваться' name='reg_button'>
</form>
<form method='GET' action='?'>
  <p align='left'><font face='Tahoma'><input type='text' name='search' size='40' 
  value="<?php echo adapting($_GET['search']); ?>">
  Поиск пользователей</font></p>
  <p align='left'><font face=

Спустя 6 часов, 11 минут, 42 секунды (22.08.2009 - 07:12) twin написал(а):
Цитата
Всё вроде работает. Есть только одна проблема. Возврат в форму выполняется с экранированными \ и '. Вместо " выводится \. Может быть вернуть чистую переменную?

Вот условия задачи я специально подбирал так, что бы решив её, можно было разобраться, где и как нужно применять функции. Что бы было все корректно.
На самом деле все очень просто и прозаично, но почему то начинающие программисты пытаются все усложнить, стараясь изобрести велосипед. Лень конечно двигатель прогресса, но не всегда. И это как раз тот случай.
Не нужно пытаться сделать все одним махом. Вот это:
PHP
function adapting ($value){
   
    if 
(!get_magic_quotes_gpc()) 
    
{
    $value = mysql_real_escape_string($value);
    }
    return trim($value);
}
в корне не верное решение, отсюда и все проблемы. Функция mysql_real_escape_string() предназначена для экранирования литеральных констант для подстановки в MySQL запросы. А не для обработки всех входящих данных. По этому и работать должна в запросх, и нигде иначе.
Вот посмотри, как сделал бы я на твоем месте (начиная с кодировки и заканчивая применением функций:

Свернутый текст
PHP
<?php
    
/* Функция адаптации данных под magic qoutes */
function adapting ($value){
   
    if 
(get_magic_quotes_gpc()) 
    $value 
= stripslashes($value);

    return $value;
}


    /* Функция переводит спецсимволы в эквиваленты, убирает пробелы и табуляцию */
function clean($value)
{
    $value = trim(htmlspecialchars($value));
    return $value;
}

     /* Параметры соединения с БД */
$hostname  = \"localhost\";
$username  = \"root\";
$password  = \"123\";
$dbName    = \"test\";

    
    
/* Соединение, выбор БД */
 $connect = mysql_connect($hostname,$username,$password) or die(\"Нет соединения\"); 
    mysql_select_db
($dbName) or die(\"Не найдена база данных\"); 

    
    
/* Выбираем кодировку */
mysql_query(\"SET NAMES utf8\") or die(mysql_error());
    
                        
    
/* Обозначаем переменные */
    $regname  = !empty($_POST['regname']) ? adapting($_POST['regname'])    :null;
    $search   = !empty($_GET['search'])   ?  adapting($_GET['search'])     :null;
    
                                    
/* Регистрация */
                                        
if(isset($_POST['reg_button'])) 
{
    if (mb_strlen($regname) < 3 ) //  начиная с 3 символов
    {  
    header 
(\"Location: \".$_SERVER['PHP_SELF']);   // до вывода
    exit();
    }
        

        
/* Добавляем пользователя в базу */
          mysql_query (\"INSERT INTO `users` 
                       ( `name` , `date`) 
                    VALUES 
                       ('\"
. mysql_real_escape_string($regname) .\"', NOW())\");
                       

                             
/* Редирект */
                    header(\"location: \".$_SERVER['PHP_SELF']);  // до вывода
                        exit();

}
 // Закончили регистрацию


                                /* Выодим имя пользователя + дата */
if(isset($_GET['id']))
{

 $sql_user = mysql_query (\"SELECT * FROM `users` WHERE `id` =\". intval($_GET['id']));
  while ($row = mysql_fetch_assoc($sql_user))
        {        
        echo 
'<h3>Имя пользователя: '.clean($row['name']). '<br /> 
        Дата регистрации пользователя '
.clean($row['date']).'</h3><br />';
        }
}
                          
                              
                              
                              
/* Поиск по базе */
                        /* Если нажали поиск, то ищем: */
        
if(isset($_GET['search_button'])) 
{
     /* Экранируем '\%_ */
$search = addcslashes($search, \"'\%_\");
        
    
/* Поиск слова по базе */
$sql_search = mysql_query(\"SELECT * FROM `users` WHERE `name` LIKE '%\". mysql_real_escape_string($search) .\"%' \")
                                                                     or die (mysql_error());
                                                                     
        
/* Считаем кол-во уже найденных пользователей */
    $number = mysql_num_rows($sql_search);

            /* Выводим кол-во найденных пользователей */
        if ($number == 0) 
        
{
        echo \"<CENTER><h3>Ничего не найдено</h3></CENTER>\";
        } 
            else 
            
{
            echo \"<CENTER><h3>Найдено пользователей: \".$number.\"<h3><BR/><BR/></CENTER>\";
              }

                /* Вывод результата поиска*/
                while ($row = mysql_fetch_assoc($sql_search)) 
                
{
     echo '<li> <a href = \"?id='.intval($row['id']).'\">'.clean($row['name']).'</a><br />';                
                
}
                               echo '<br/><br/>';
}
 // Закончили поиск      

    /* полосочка */
echo '<table width=\"100%\" bordercolor=\"#000000\" bgcolor=\"#000000\"><tr></tr></table><br/>';
                        


                                    
/* Изначальный вывод результата поиска*/

$sql_output = mysql_query(\"SELECT * FROM `users` ORDER BY `id` DESC\");                                
while 
($row = mysql_fetch_assoc($sql_output)) 
{
echo '<li> <a href = \"?id='.intval($row['id']).'\">'.clean($row['name']).'</a><br />';
}
                                    
?>

<html>
<head>
<title>Regsearch</title>
</head>
<body>

<form method='POST' action='?'>
  <p align='left'><b>Поиск и регистрация.</b>
<p align='left'><font face='Tahoma'><input type='text' name='regname' size='40'>
  Регистрация</font></p>
<p align='left'><font face='Tahoma'><input type='submit' value='Зарегистрироваться' name='reg_button'>
</form>
<form method='GET' action='?'>
  <p align='left'><font face='Tahoma'><input type='text' name='search' size='40' 
  value=\"<?php echo adapting($_GET['search']); ?>\">
  Поиск пользователей</font></p>
  <p align='left'><input type='submit' value='Искать' name='search_button'></p></form>

Комментировать не стал, найди сам 10 отличий smile.gif
По поводу
Цитата
Незнаю почему, но на хостинге скрипт не работает с ней, на локальном норм.
даже не знаю что сказать. Вообще этого не должно быть в принципе. Посмотри внимательно еще раз.
Вообще эта функция должна выглядеть несколько иначе, так как обрабатывать нужно все данные, поступающие из $_POST $_GET И $_COOCIE А там могут быть и массивы. П этому лучше сделать так:

PHP
function adapting ($value){

    if(is_array($value)) 
    $value 
= array_map('adapting',$value);
    else
    return stripslashes
($value);
}

if(
 get_magic_quotes_gpc() ) 
{ 
    $_GET 
= adapting($_GET); 
    $_POST 
= adapting($_POST);
    $_COOKIE = adapting($_COOKIE);     
}

И работать должно везде, не знаю что за хостинг у тебя такой...

Спустя 7 минут, 17 секунд (22.08.2009 - 07:19) twin написал(а):
Не пойму что случилось с форумом, почему то не хочет правильно форматировать.... Кстати говоря, на этом форуме как раз и перевернуто все с ног на голову smile.gif . Может как раз и по этому. tongue.gif

Спустя 5 часов, 23 минуты, 38 секунд (22.08.2009 - 12:42) ANG3 написал(а):
Отлично! Почти всё понял! biggrin.gif
Пара вопросов...

1. Для чего экранировать все кавычки? Пока оставил по-старому, ибо мой DreamWeaver всё выделяет красным, очень путает.
2. Что это за такие символы '\%_ ? Судя по коду они прослешиваются аш 2 раза, но код выполняется правильно.

PHP
$search addcslashes($search"'\%_"); // 1 раз
        
    /* Поиск слова по базе */
$sql_search mysql_query("SELECT * FROM `users` WHERE `name` 
    LIKE '%"
.mysql_real_escape_string($search)."%' ")   // второй раз


3. Единственный баг, который я обнаружил - кавычка " ищется, но в форму не возвращается.

Спустя 10 часов, 27 минут, 42 секунды (22.08.2009 - 23:10) ANG3 написал(а):
Кстати, из-за mb_strlen кусок кода с регистрацией не работал. Кодировку в этой функции обязательно указывать нужно?

Спустя 8 часов, 54 минуты, 7 секунд (23.08.2009 - 08:04) twin написал(а):
Цитата
1. Для чего экранировать все кавычки? Пока оставил по-старому, ибо мой DreamWeaver всё выделяет красным, очень путает.

Это не я, это форум заэкранировал, я и написал, что все испортилось. Думал догадаешься)))
Цитата
2. Что это за такие символы '\%_ ? Судя по коду они прослешиваются аш 2 раза, но код выполняется правильно.

Это спецсимволы, которые участвуют в SQL-запросах. По этому, чтобы они воспринимались как просто символы, а не спец-символы, их и нужно экранировать. То есть к примеру \ воспринимается как защитный слэш и SQL видит его как команду, а \\ воспринимается как экранированный слэш. То есть первый воспринимается как экран, а вотрой уже как сущность. Так же и с процентом. % с оператором LIKE воспринимается как команда (любой символ), а \% как просто символ %.
Цитата
3. Единственный баг, который я обнаружил - кавычка " ищется, но в форму не возвращается.

Тут просто я недосмотрел. У тебя в форме не та функция для обработки. Надо так:

HTML
<input type='text' name='search' size='40'
value=\"<?php echo clean($_GET['search']); ?>\">

Цитата
Кстати, из-за mb_strlen кусок кода с регистрацией не работал. Кодировку в этой функции обязательно указывать нужно?

Я не работаю с windows-1251, только с utf-8. А для корректной работы с ней нужно mb_strlen(); Кодировку можно указать один раз в начале скрипта для всех функций,
PHP
mb_internal_encoding('utf-8');

либо указывать прямо в самой функции
PHP
mb_strlen($regname,'utf-8');

Спустя 3 часа, 36 минут, 6 секунд (23.08.2009 - 11:40) ANG3 написал(а):
Спс. Теперь точно всё понятно. А в возврате в форму я сам не то сделал.
Там функция стаяла adapting (это даля магических кавычек), а нужно было

PHP
value ="<?php echo clean($_GET['search']; ?>">


(htmlspecialchars). Кавычка экранируется и выходит как значение между
value =""

А с этими кодировками что-то не получилось. Хотел изначально utf-8 ставить. Но что-то не вышло. Как-нибудь займусь.

Спустя 2 часа, 16 минут, 43 секунды (23.08.2009 - 13:57) ANG3 написал(а):
Решил поставить функцию:

PHP
function adapting ($value){

    if(
is_array($value)) 
    
$value array_map('adapting',$value);
    else
    return 
stripslashes($value);
}

if( 
get_magic_quotes_gpc() ) 

    
$_GET adapting($_GET); 
    
$_POST adapting($_POST);
    
$_COOKIE adapting($_COOKIE);     
}


Не могу понять, return stripslashes($value); происходит только в том случае, если $value не массив?

Если массив, то получается, что return stripslashes($value); не происходит, или
return возвращает значение независимо от условий и тд?



Спустя 12 минут, 28 секунд (23.08.2009 - 14:10) twin написал(а):
Это называется рекурсия. То есть функция будет вызывать сама себя, пока не кончится массив. Так она доберется до всех членов и по порядку их обстрипслэшет)))

Спустя 9 часов, 17 минут, 28 секунд (23.08.2009 - 23:27) ANG3 написал(а):
Почти понятно biggrin.gif
Времени нет разобраться. Уезжаю на 2 недели sad.gif
Ещё подниму эту тему smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.