Могу ли я сохранить строку в одном поле в MySQL, которое я могу отобразить в PHP, который также объявляет переменные? - PullRequest
5 голосов
/ 16 апреля 2011

У меня есть страница .php с переменными, каждая из которых связана с десятками различных критериев поиска.Я подумал, что будет проще всего вставить все переменные в базу данных как одну гигантскую строку.

Тогда я подумал, что было бы еще проще сжать переменные и их объявления с ними какодна гигантская строка.

Итак, что я имею в виду, вместо того, чтобы просто:

Stewie
101
Green

Я хотел бы вместо этого иметь один большой большой объект в базе данных:

$user_name = 'Stewie';
$pants_size = '101';
$favorite_eggs = 'Green';

Таким образом, я мог бы ОЧЕНЬ легко захватывать и извлекать большой объем данных о пользовательских предпочтениях без необходимости делать что-либо с массивами.В конце концов, мне приходится менять страницу достаточно часто, чтобы изменение массивов было головной болью.

Если бы я мог это сделать, я мог бы просто и просто переопределить все переменные одновременно, иМне больше не нужно об этом думать.

Записи не должны быть доступны для поиска, просто извлекаться с объявлением переменной (например, $ var = 'value'; с кавычками и всем).

До сих пор я исследовал следующее:

  • Опция javascript.Да, я знаю, что было бы возможно сделать некоторые сложные вещи с помощью javascript, но это намного сложнее, чем моя «одна большая переменная, которую я хочу отобразить, но волшебным образом также объявляю переменные в» методе.Если я сделаю это, я также могу сделать массивы.
  • Опция массива.Это включает в себя взрыв / взорвать вещи в .php, и это то, что я боюсь, мне придется выбирать, прежде чем слишком долго.Тем не менее, я бы предпочел сделать это одностадийным методом, который я представляю вместо этого, если это возможно.
  • A - сохранить каждую переменную отдельно в ее собственном поле в базе данных.Это ужасно, потому что поля меняются (и добавляются) достаточно часто, так что это может привести меня в замешательство.Я бы намного раньше сделал опцию массива, потому что это всего лишь несколько небольших пользовательских предпочтений.

Любая помощь будет приветствоваться, даже если она скажет мне: «Это невозможно.Я рекомендую [XYZ]. "

Спасибо!

РЕДАКТИРОВАТЬ: dave e предлагает отличное решение для извлечения таких данных через eval.Но я все еще немного озадачен тем, как начать получать эти данные в базу данных.Хранение> 100 переменных и их объявлений ($ variable_name = 'value') с одинаковой легкостью немного озадачивает!

Ответы [ 7 ]

1 голос
/ 17 апреля 2011

Использование комментария от http://www.php.net/manual/en/function.get-defined-vars.php#73608

Используйте эту слегка адаптированную функцию

/**
* @desc   works out the variables in the current scope(from where function was 
*         called).  Returns a serialized version of an array with variable name
*         as key and vaiable value as value
* @param  $varList: variables returned by get_defined_vars() in desired scope.
*         $excludeList: variables to be excluded from the list.
* @return string
*/
    function get_refined_vars($varList, $excludeList) {
        $temp1 = array_values(array_diff(array_keys($varList), $excludeList));
        $temp2 = array();
        while (list($key, $value) = each($temp1)) {
            global $$value;
            $temp2[$value] = $$value;
        }
        return serialize($temp2);
    }

Затем создайте массив списков исключений

$excludeList = array('GLOBALS', '_FILES', '_COOKIE', '_POST', '_GET', 'excludeList');

Определите ваши переменные

    $user_name = 'Stewie';
    $pants_size = '101';
    $favorite_eggs = 'Green';

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

    //get all variables defined in current scope
    $varList = get_defined_vars();
    // refine the list, serialized.
    $storeThis = get_refined_vars($varList, $excludeList);

Сохраните значение $ storeThis в своей таблице mysql

Когда вы получаете строку из mysql ...

    extract(unserialize($someStringFromDatabaseResult));

    echo $user_name;
    echo $pants_size;
    echo $favorite_eggs'
1 голос
/ 16 апреля 2011

Создайте множество вариантов, подобных этому:

$option_array['user_name'] = 'Stewie';
$option_array['pants_size'] = '101';

Используйте сериализацию для хранения данных

$stored_string = serialize($option_array);

, когда вы получите данные из базы данных, отмените их сериализацию $option_araay = unserialize($option_array);

!

0 голосов
/ 17 апреля 2011

Я использую формат JSON для хранения настроек в одном из моих проектов, и он прекрасно работает.Вот мой класс для работы с JSON:

<?php

/**
* Settings getter and setter
*/
class Settings
{
  private $settings;
  function __construct($rawSettings)
  {
    $this->settings = json_decode($rawSettings);
  }

  // returns the serialized settings object, so we can save it someware
  protected function Serialized()
  {
    return json_encode($this->settings);
  }

  // return the setting, or null if it is not set
  public function Get($setting)
  {
    if (isset($this->settings->$setting)) return $this->settings->$setting;
    else return null;
  }

  public function Set($setting, $value)
  {
    $this->settings->$setting = $value;
  }
}


?>

Извлеките настройки из БД и передайте их конструктору,

$settings = new Settings($jsonStringFromDB);

Используйте метод Set для установки новых значений,

$settings->Set('name','Stewie');
$settings->Set('pant_size','101');
$settings->Set('favorite_eggs','Green');

Используйте метод Get для получения значений,

echo $settings->Get('name');

А при сохранении в БД просто используйте $ settings-> Serialized ();

ТеперьНастройки хранятся в формате, не уникальном для PHP, может быть, когда-нибудь это будет хорошо, кто знает.

0 голосов
/ 16 апреля 2011

Используйте массив для ваших пользовательских данных, например:

$USER['name'] = 'Stewie';
$USER['size'] = 101;
$USER['eggs'] = 'Green';

тогда:

mysql_query('UPDATE users SET data="'.serialize($USER).'" WHERE id='.$uid);

И для получения:

$q = mysql_query('SELECT data FROM users WHERE id='.$uid);
if($r=mysql_fetch_object($q)) $USER = unserialize($r->data);
else echo 'Error no such user id: '. $uid;
0 голосов
/ 16 апреля 2011

попробуйте это:

$data = array();
$data['user_name'] = 'Stewie';
$data['pants_size'] = '101';
$data['favorite_eggs'] = 'Green';
$one_big_string = serialize($data);
// store $one_big_string in your database.

$one_big_string_from_db // <= string from db
extract(unserialize($one_big_string_from_db));
// All array keys will become local variables.
0 голосов
/ 16 апреля 2011

Вы должны посмотреть на PHP eval (http://php.net/manual/en/function.eval.php), это может преобразовать текст из БД в буквальный PHP. Однако вы открываете себя для множества потенциальных проблем безопасности, если используются неправильно.

Пример:

$code = get_whatever_from_DB();

$code = "
$user_name = 'Stewie';
$pants_size = '101';
$favorite_eggs = 'Green';
";

eval('?>' . $code . '<?');
0 голосов
/ 16 апреля 2011

Я думаю, что если вы хотите сделать что-то подобное, вы должны сохранить все префы в массив и сохранить массив в БД.Посмотрите serialize: serialize () на php.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...