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

Форум PHP

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

 

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

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

тема: magic_quotes_gpc & magic_quotes_runtime
 
 автор: Loki   (30.03.2006 в 22:23)   письмо автору
 
 

пара вопросов после прочтения мануала:
1. Считается ли нормальной практикой установка magic_quotes_gpc и magic_quotes_runtime с одинаковыми значениями, или как повезет?
2. в случае внешних данных (НЕ POST, GET или COOKIE) что выгоднее по производительности установка значения через set_magic_quotes_runtime() или обработка данных с помощью mysq_escape_string или stripslashes?

это я все дампер свой доделываю:)

   
 
 автор: JIEXA   (31.03.2006 в 00:38)   письмо автору
 
   для: Loki   (30.03.2006 в 22:23)
 

Я думаю, что всё таки mysql_escape_string самый лучший вариант. Так как mysqc_quotes обрабатывает все данные, а вы будете обрабатывать только то, что вам нужно. Хотя думаю ращзницы особой не увидите в производительности. Насчет stripslashes я вообще непонял. Насколько я знаю это функция обратная addslashes. Поэтому данные перед помощение в БД не в коем случае не обрабатывайте stripslashes. Либо mysql_escape_string или addslashes(). А в php.ini советую отключить magic_quotes.

   
 
 автор: Loki   (31.03.2006 в 09:40)   письмо автору
 
   для: JIEXA   (31.03.2006 в 00:38)
 

Вы не поняли. Дамп уже экранирован. И при помещении в базу встает вопрос: вырезать ли слеши саому, либо доверить это magic_quotes_runtime. Это по второму вопросу. А по первому: достаточно ли проверять включенность какой-то одной настройки, либо надо проверять обе, для полного спокойствия:)

   
 
 автор: Trianon   (31.03.2006 в 10:29)   письмо автору
 
   для: Loki   (31.03.2006 в 09:40)
 

magic_quotes_runtime не вырезает слэши. :)))))))
Она добавляет их. Добавляет при вызовах mysql_result, mysql_fetch_array и им подобных.

   
 
 автор: Loki   (31.03.2006 в 11:14)   письмо автору
 
   для: Trianon   (31.03.2006 в 10:29)
 

да нет:) условие задачки такое: на сервере влючено magic_quotes_runtime и есть дамп.
что предпочтительнее (по производительности или еще каким причинам):
вырезать из дампа слеши самому, либо временно отключить magic_quotes_runtime при помощи set_magic_quotes_runtime?

   
 
 автор: Trianon   (31.03.2006 в 11:54)   письмо автору
 
   для: Loki   (31.03.2006 в 11:14)
 

>на сервере влючено magic_quotes_runtime

Всё равно до меня не доходит.
Мы говорим об импорте дампа в базу данных, или о его экспорте?

Или "и есть дамп" надо читать как "и есть скрипт, в задачу которого входит сформировать дамп" ?

   
 
 автор: Loki   (31.03.2006 в 12:16)   письмо автору
 
   для: Trianon   (31.03.2006 в 11:54)
 

в данном случае речь идет об импорте. Есть настройка php.ini magic_quotes_runtime (по условию задачи - включена) и есть функция php set_magic_quotes_runtime, которая позволяет менять эту настройку на время выполнения скрипта.
Есть дамп:

INSERT INTO table VALUES ('текст с \' экранированием')

так как магические кавычки включены, то лишние слеши нужно убрать при помощи stripslashes. Но можно пойти другим путем, и на время выполнения скрипта отключить магические кавычки: set_magic_quotes_runtime(0). Так вот хочется понять, какой путь целесообразнее?

   
 
 автор: Trianon   (31.03.2006 в 12:31)   письмо автору
 
   для: Loki   (31.03.2006 в 12:16)
 

Loki, я сейчас с ума свихнусь! :) Ради всего святого, где Вы прочли, что magic_quotes_runtime влияет на процесс исполнения mysql_query("INSERT ....")?
Она не может на это воздействовать! Она влияет на mysql_result, mysql_fetch... и им подобные. И только.
Во всяком случае, я очень на это надеюсь.

   
 
 автор: Loki   (31.03.2006 в 12:57)   письмо автору
 
   для: Trianon   (31.03.2006 в 12:31)
 

Ради всего святого , готов сказать - в мануале по php:)
magic_quotes_gpc влияет на переменные GET, POST и COOKIE (как следует из названия), а magic_quotes_runtime обрабатывает все даныне полученные из внешних источников, включая БД и текстовые файлы. То есть как раз наш случай.

ЗЫ Да я вчера проверил, теперь я умный:)

   
 
 автор: Trianon   (31.03.2006 в 13:29)   письмо автору
 
   для: Loki   (31.03.2006 в 12:57)
 

Пошел делать проверочный скрипт.

   
 
 автор: Trianon   (31.03.2006 в 14:28)   письмо автору
 
   для: Loki   (31.03.2006 в 12:57)
 

<?php
include 'config.inc.php';
$r = array('disabled','enabled');
   echo 
'<font face=courier>';
   
$query "CREATE TABLE IF NOT EXISTS tab(txt TEXT NOT NULL)";
   
$res mysql_query($query); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";

echo 
"MQGPC GET  :".$r[get_magic_quotes_gpc    ( )]."<br>\r\n";

    
$dump = isset($_POST['dump'])? $_POST['dump'] : "";
    echo 
"===[query on input]===<br>\r\n".nl2br(htmlspecialchars($dump))."=======================<br>\r\n";
if(isset(
$_POST['strip']))
  if(
get_magic_quotes_gpc())
  {
    
$dump stripslashes($dump);
    echo 
"===[query after stripping ]===<br>\r\n".nl2br(htmlspecialchars($dump))."===================<br>\r\n";
  }

echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";
    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";

echo 
"MQRTM SET 1:".$r[set_magic_quotes_runtime(1)]."<br>\r\n";
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";

    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";

echo 
"MQRTM SET 0:".$r[set_magic_quotes_runtime(0)]."<br>\r\n";
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";

    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";


?>
<form method=post>
<textarea name=dump cols=80 rows=10>
INSERT INTO tab VALUES ('текст с \' экранированием')
</textarea>
<br> <input type=checkbox name=strip> Strip slashes if magic_quotes_gpc is on
<br> <input type=submit value=test></form>

   
 
 автор: Trianon   (31.03.2006 в 14:31)   письмо автору
 
   для: Loki   (31.03.2006 в 12:57)
 

Есть разница между получением данных из внешних источников и размещением данных во внешних ..э... примемниках.

   
 
 автор: Trianon   (31.03.2006 в 14:41)   письмо автору
 
   для: Trianon   (31.03.2006 в 14:31)
 

Вот здесь можно поглядеть эффект.
<?php
include 'config.inc.php';
$r = array('disabled','enabled');
   echo 
'<font face=courier>';
   
$query "CREATE TABLE IF NOT EXISTS tab(txt TEXT NOT NULL)";
   
$res mysql_query($query); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";

echo 
"MQGPC GET  :".$r[get_magic_quotes_gpc    ( )]."<br>\r\n";

    
$dump = isset($_POST['dump'])? $_POST['dump'] : "";
    echo 
"===[query on input]===<br>\r\n".nl2br(htmlspecialchars($dump))."=======================<br>\r\n";
if(isset(
$_POST['strip']))
  if(
get_magic_quotes_gpc())
  {
    
$dump stripslashes($dump);
    echo 
"===[query after stripping ]===<br>\r\n".nl2br(htmlspecialchars($dump))."===================<br>\r\n";
  }

echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";
    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";
    else while(
$row mysql_fetch_array($res)) foreach( $row as $col => $val) echo "[$col] = $val<br>";


echo 
"MQRTM SET 1:".$r[set_magic_quotes_runtime(1)]."<br>\r\n";
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";

    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";
    else while(
$row mysql_fetch_array($res)) foreach( $row as $col => $val) echo "[$col] = $val<br>";

echo 
"MQRTM SET 0:".$r[set_magic_quotes_runtime(0)]."<br>\r\n";
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n";

    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n";
    else while(
$row mysql_fetch_array($res)) foreach( $row as $col => $val) echo "[$col] = $val<br>";


?>
<form method=post>
<textarea name=dump cols=80 rows=10>
SELECT * FROM tab
</textarea>
<br> <input type=checkbox name=strip> Strip slashes if magic_quotes_gpc is on
<br> <input type=submit value=test></form>

   
 
 автор: Loki   (31.03.2006 в 16:26)   письмо автору
 
   для: Trianon   (31.03.2006 в 14:31)
 

Так, собственно, в чем данный пример расходится с тем, что я написал?

   
 
 автор: Trianon   (31.03.2006 в 16:30)   письмо автору
 
   для: Loki   (31.03.2006 в 16:26)
 

А Вы пробовали его запустить? :)

   
 
 автор: Loki   (31.03.2006 в 16:51)   письмо автору
 
   для: Trianon   (31.03.2006 в 16:30)
 

пробовал:)
фунциклирует:)
при включенных magic_quotes - экранирует, а так же включает их и выключает. В общем, все как в мануале... только вопрос-то был совсем не об этом:)

   
 
 автор: Trianon   (31.03.2006 в 16:59)   письмо автору
 
   для: Loki   (31.03.2006 в 16:51)
 

Вопрос был в том, будет ли magic_quotes_runtime добавлять/убирать лишние слэши при выполнении операции INSERT.
Ответ - нет. не будет. Она не участвует в процессе обработки строки запроса. Она обрабатывает лишь результат. Результат выдаваемый запросом SELECT через mysql_result и mysql_fetch_xxxxxx. (и возможно результаты итераторов mysql_fetch_field, но речь сейчас не о них).

   
 
 автор: Loki   (31.03.2006 в 17:23)   письмо автору
 
   для: Trianon   (31.03.2006 в 16:59)
 

Так вы не то тестировали: за POST отвечает magic_quotes_gpc, magic_quotes_runtime отвечает за другие внешние данные.
Вот вам мой пример:

<?php 
include 'config.php'
$r = array('disabled','enabled'); 
   echo 
'<font face=courier>'
   
$query "CREATE TABLE IF NOT EXISTS tab(txt TEXT NOT NULL)"
   
$res mysql_query($query); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n"
   
$dump=file("test.txt");
   
$dump=$dump[0];

   echo 
"===[query on input]===<br>\r\n".nl2br(htmlspecialchars($dump))."=======================<br>\r\n"

echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime()]."<br>\r\n"
    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n"

echo 
"MQRTM SET 1:".$r[set_magic_quotes_runtime(1)]."<br>\r\n"
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n"
   
$dump=file("test.txt");
   
$dump=$dump[0];
    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n"

echo 
"MQRTM SET 0:".$r[set_magic_quotes_runtime(0)]."<br>\r\n"
echo 
"MQRTM GET  :".$r[get_magic_quotes_runtime( )]."<br>\r\n"
   
$dump=file("test.txt");
   
$dump=$dump[0];
    
$res mysql_query($dump); if(!$res) echo 'Error in query :'mysql_error()."<br>\r\n"
?> 

test.txt

INSERT INTO tab VALUES ('текст с \' экранированием')

Дамп же у нас не в воздухе висит, а в файле хранится.

   
 
 автор: Trianon   (31.03.2006 в 17:42)   письмо автору
 
   для: Loki   (31.03.2006 в 17:23)
 

Теперь понял.
Ответ. Предпочтительно временно выключить magic_qoutes , а если она не позволила себя выключить (если get_magic_quotes вернула 1) сдирать слэши самостоятельно с помощью stripslashes().
Пожалуй, независимо от того, gpc это или runtime.

   
 
 автор: Trianon   (31.03.2006 в 17:46)   письмо автору
 
   для: Trianon   (31.03.2006 в 17:42)
 

И всё же я не представляю, чтоб кто-то по доброй воле в здравом рассудке включил magic_quotes_runtime прямо в конфиге php.
Вообще, у Котерова есть статья на эту тему. По-моему там сказано всё.

   
Rambler's Top100
вверх

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