|
|
|
| пара вопросов после прочтения мануала:
1. Считается ли нормальной практикой установка magic_quotes_gpc и magic_quotes_runtime с одинаковыми значениями, или как повезет?
2. в случае внешних данных (НЕ POST, GET или COOKIE) что выгоднее по производительности установка значения через set_magic_quotes_runtime() или обработка данных с помощью mysq_escape_string или stripslashes?
это я все дампер свой доделываю:) | |
|
|
|
|
|
|
|
для: Loki
(30.03.2006 в 22:23)
| | Я думаю, что всё таки mysql_escape_string самый лучший вариант. Так как mysqc_quotes обрабатывает все данные, а вы будете обрабатывать только то, что вам нужно. Хотя думаю ращзницы особой не увидите в производительности. Насчет stripslashes я вообще непонял. Насколько я знаю это функция обратная addslashes. Поэтому данные перед помощение в БД не в коем случае не обрабатывайте stripslashes. Либо mysql_escape_string или addslashes(). А в php.ini советую отключить magic_quotes. | |
|
|
|
|
|
|
|
для: JIEXA
(31.03.2006 в 00:38)
| | Вы не поняли. Дамп уже экранирован. И при помещении в базу встает вопрос: вырезать ли слеши саому, либо доверить это magic_quotes_runtime. Это по второму вопросу. А по первому: достаточно ли проверять включенность какой-то одной настройки, либо надо проверять обе, для полного спокойствия:) | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 09:40)
| | magic_quotes_runtime не вырезает слэши. :)))))))
Она добавляет их. Добавляет при вызовах mysql_result, mysql_fetch_array и им подобных. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2006 в 10:29)
| | да нет:) условие задачки такое: на сервере влючено magic_quotes_runtime и есть дамп.
что предпочтительнее (по производительности или еще каким причинам):
вырезать из дампа слеши самому, либо временно отключить magic_quotes_runtime при помощи set_magic_quotes_runtime? | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 11:14)
| | >на сервере влючено magic_quotes_runtime
Всё равно до меня не доходит.
Мы говорим об импорте дампа в базу данных, или о его экспорте?
Или "и есть дамп" надо читать как "и есть скрипт, в задачу которого входит сформировать дамп" ? | |
|
|
|
|
|
|
|
для: 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). Так вот хочется понять, какой путь целесообразнее? | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 12:16)
| | Loki, я сейчас с ума свихнусь! :) Ради всего святого, где Вы прочли, что magic_quotes_runtime влияет на процесс исполнения mysql_query("INSERT ....")?
Она не может на это воздействовать! Она влияет на mysql_result, mysql_fetch... и им подобные. И только.
Во всяком случае, я очень на это надеюсь. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2006 в 12:31)
| | Ради всего святого , готов сказать - в мануале по php:)
magic_quotes_gpc влияет на переменные GET, POST и COOKIE (как следует из названия), а magic_quotes_runtime обрабатывает все даныне полученные из внешних источников, включая БД и текстовые файлы. То есть как раз наш случай.
ЗЫ Да я вчера проверил, теперь я умный:) | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 12:57)
| | Пошел делать проверочный скрипт. | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 12:57)
| | Есть разница между получением данных из внешних источников и размещением данных во внешних ..э... примемниках. | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: Trianon
(31.03.2006 в 14:31)
| | Так, собственно, в чем данный пример расходится с тем, что я написал? | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 16:26)
| | А Вы пробовали его запустить? :) | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2006 в 16:30)
| | пробовал:)
фунциклирует:)
при включенных magic_quotes - экранирует, а так же включает их и выключает. В общем, все как в мануале... только вопрос-то был совсем не об этом:) | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 16:51)
| | Вопрос был в том, будет ли magic_quotes_runtime добавлять/убирать лишние слэши при выполнении операции INSERT.
Ответ - нет. не будет. Она не участвует в процессе обработки строки запроса. Она обрабатывает лишь результат. Результат выдаваемый запросом SELECT через mysql_result и mysql_fetch_xxxxxx. (и возможно результаты итераторов mysql_fetch_field, но речь сейчас не о них). | |
|
|
|
|
|
|
|
для: 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 ('текст с \' экранированием')
|
Дамп же у нас не в воздухе висит, а в файле хранится. | |
|
|
|
|
|
|
|
для: Loki
(31.03.2006 в 17:23)
| | Теперь понял.
Ответ. Предпочтительно временно выключить magic_qoutes , а если она не позволила себя выключить (если get_magic_quotes вернула 1) сдирать слэши самостоятельно с помощью stripslashes().
Пожалуй, независимо от того, gpc это или runtime. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2006 в 17:42)
| | И всё же я не представляю, чтоб кто-то по доброй воле в здравом рассудке включил magic_quotes_runtime прямо в конфиге php.
Вообще, у Котерова есть статья на эту тему. По-моему там сказано всё. | |
|
|
|