Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятка с eval, непонятка с функцией 
:(
    Опции темы
Frozen_Coyote
Дата 16.11.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Приветствую!

Сейчас постараюсь сформулировать проблему

значит так: есть файл second.php. Его нутро следующее без (<? и ?> кстати, просто текстовый файл как бы)
Код

mysql_query("SELECT *, DATE_FORMAT($DataField, '%d.%m.%Y') AS FDate FROM $tablename ORDER BY $DataField");

все. больше ничего. это просто запрос к базе. Есть также файл index.php со следующийм нутром
Код

$DataField = 'test_data_data';

$link = "second.php";
$fd = fopen($link, "r");
$MysqlCode = "";

while (!feof ($fd)) $MysqlCode .= fgets($fd, 4096); 
fclose ($fd);

eval ("\$MysqlCode=\"$MysqlCode\";");
echo $MysqlCode;

так вот: в финальном файле $MysqlCode после eval так и осталась $DataField вместо ожидаемого мною ЗНАЧЕНИЯ $DataField
т.е. вместо
Код

mysql_query("SELECT *, DATE_FORMAT(test_data_data, '%d.%m.%Y') AS FDate FROM $tablename ORDER BY test_data_data DESC"); 

я получаю все ту же
Код

mysql_query("SELECT *, DATE_FORMAT($DataField, '%d.%m.%Y') AS FDate FROM $tablename ORDER BY $DataField");

но при этом если я в файле second.php заменю запрос к базе на просто 
Код

echo $DataField; 

то в таком случае замена происходит нормально, получаю
Код

echo test_data_data;

в более сложной строке всё: евал перестает производить подстановку вместо имени его значения. Скажите пожалуйсьа, как мне сделать, чтобы евал нормально заменял все имена переменных в строке на их значения? preg_replace неспортивно, конечно же.

M
skyboy
Будь добр, пользуйся тегом "Код"


Это сообщение отредактировал(а) skyboy - 16.11.2007, 16:11
PM MAIL   Вверх
flashaa
Дата 16.11.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



eval() выполняет определенный код,
в данном случае вот этот
Код

mysql_query("SELECT *, DATE_FORMAT(test_data_data, '%d.%m.%Y') AS FDate FROM $tablename ORDER BY test_data_data DESC"); 

Но она ни коим образом не влияет на свой аргумент.
Да и зачем?
При каждом обращении к своей строке "SELECT *, DATE_FORMAT(test_data_data, '%d.%m.%Y') AS FDate FROM $tablename ORDER BY test_data_data DESC" ты будешь получать уже результат подстановки.
PM MAIL   Вверх
kasmanaft
Дата 16.11.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата
preg_replace неспортивно, конечно же.

Нуну.. А eval() спрортивно, да?

Попробуйте так:
Код
eval('$MysqlCode = stripslashes("' . addslashes($MysqlCode) . '");');



Цитата
eval() выполняет определенный код,
в данном случае вот этот

Выполнит тот, который в нее передать. Передали "\$MysqlCode=\"$MysqlCode\";" - выполнит его.
Цитата
Но она ни коим образом не влияет на свой аргумент.

То есть? smile  

Это сообщение отредактировал(а) kasmanaft - 16.11.2007, 16:30
PM MAIL   Вверх
skyboy
Дата 16.11.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Frozen_Coyote @  16.11.2007,  13:52 Найти цитируемый пост)
eval ("\$MysqlCode=\"$MysqlCode\";");

что это значит?
если тебе просто вывести - почему сразу не вывести $MysqlCode? Если выполнить - почему бы просто не выполнить?
Код

eval($MysqlCode);
?
У меня все работает, если в eval не плодить кавычки на кавычках. В противном случае, одинарное экранирование при выполнении кода eval убирается и получается наложение двойных кавычек.

PM MAIL   Вверх
Frozen_Coyote
Дата 16.11.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Цитата(kasmanaft @ 16.11.2007,  16:29)
Цитата
preg_replace неспортивно, конечно же.

Нуну.. А eval() спрортивно, да?

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

Код




Добавлено через 5 минут и 12 секунд
Цитата(skyboy @  16.11.2007,  16:39 Найти цитируемый пост)
У меня все работает, если в eval не плодить кавычки на кавычках. В противном случае, одинарное экранирование при выполнении кода eval убирается и получается наложение двойных кавычек.


версия пхп какая? 5? или 4+? в 4+ однозначно не работает. а если убрать эти, как ты говоришь "кавычки на кавычках" перестает работать даже упрощенный, указанный мною выше, вывод 

Код

echo test_data_data;


вмето него тогда выходит изначальное

Код

echo $DataField;

PM MAIL   Вверх
kasmanaft
Дата 16.11.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата(Frozen_Coyote @  16.11.2007,  17:52 Найти цитируемый пост)
Не, а какие варианты еще есть, если мне необходимо записать шаблон кода в базу, а потом при необходимости, скрипт должен дернуть этот шаблон и подставить в него значения? Буду признателен за любое другое решение

Да, вариатнов не много. Я бы использовал обычную str_replace(). А в шаблоне бы использовал не php переменные, а что-то вроде "{DATAFIELD}".

Моё "Попробуйте так" попробовали? smile 
Цитата(Frozen_Coyote @  16.11.2007,  17:52 Найти цитируемый пост)
версия пхп какая? 5? или 4+? в 4+ однозначно не работает.

Да и в 5 работать не будет. Тут различий между версиями принципиальных нет.
Чтобы не было "наложения двойных кавычек" я у себя в примере применил addslashes()..
PM MAIL   Вверх
HotHead
Дата 16.11.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 26.10.2007

Репутация: 3
Всего: 4



Frozen_Coyote, если вы собрались хранить в таком виде исключительно запросы к БД, то почему бы их не хранить без mysql_query? Т.е. хранить строку запроса. Вместо переменной ставить %s, а потом пропускать строку через sprintf($MysqlCode, $DataField). Т.е. конечный код будет типа:
Код

$MysqlCode = "SELECT *, DATE_FORMAT(%1\$s, '%%d.%%m.%%Y') AS FDate FROM %2\$s ORDER BY %1\$s";
$table = 'tablename';
$data = 'data';
mysql_query(sprintf($MysqlCode, $table, $data));

Правда не знаю насколько вам понравится такой метод. Проценты придётся делать двойными, чтоб sprintf не наформатировал лишнего, а цифрами после процента указывать, какой аргумент подставлять. И ещё указывать чем является аргумент ($s - строка). Но вообще sprintf очень удобен для подобных задач.
PM MAIL   Вверх
Frozen_Coyote
Дата 17.11.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Цитата(HotHead @  16.11.2007,  21:32 Найти цитируемый пост)
Но вообще sprintf очень удобен для подобных задач. 


ну Ваш метод конечно хорош, но применяя сторонние воздействия тогда уж регулярки несокрушимы: прег реплэйс спасет от чего угодно! мне то хотелось поянть, может я неправильно евал долбаю, что он мне некорректно обрабатывает )) а так - я регэкспами любую строку-переменную раздолбаю как хочу )) но спасибо все равно

Добавлено через 7 минут и 4 секунды
Цитата(kasmanaft @  16.11.2007,  20:40 Найти цитируемый пост)
Моё "Попробуйте так" попробовали?


Вы знаете - интересное кино! именно мой пример - упрощенный - заработал нормально. Но как только я "навернул" код внутри подгружаемого в переменную  файла поболее - т.е. с иф-ами елсасми - опять таже канитель! Притом поверхностный анализ намекает на то, что именно вложение переменной внутри строки - неважно - запроса к базе, или простой конкатенации строк - срфзу дает негативный эффект - ну в смысле вместо значения переменной выводит имя ..Прритом применимо сразу ко всему коду, где эта перменная задействована, а не к этому конкретному участку. Мдас.. Наверно какие то особености я не знаю
PM MAIL   Вверх
kasmanaft
Дата 17.11.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата(Frozen_Coyote @  17.11.2007,  00:14 Найти цитируемый пост)
именно мой пример - упрощенный - заработал нормально. Но как только я "навернул" код внутри подгружаемого в переменную  файла поболее - т.е. с иф-ами елсасми - опять таже канитель!

Что-то слабо верится.. smile 

Эту строку "eval('$MysqlCode = stripslashes("' . addslashes($MysqlCode) . '");');" никак не меняете?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.