我可以将字符串存储到mySQL中的一个字段中吗?我可以在PHP中回显该字段,该字段也声明变量?
我有一个.php页面,其中包含变量,每个变量都与几十个不同的搜索条件相关联。我认为将所有变量作为一个巨大的字符串塞进数据库是最容易的 然后,我认为将变量和它们的声明作为一个巨大的字符串塞满会更容易 所以我的意思是,不仅仅是这个:我可以将字符串存储到mySQL中的一个字段中吗?我可以在PHP中回显该字段,该字段也声明变量?,php,mysql,string,variables,echo,Php,Mysql,String,Variables,Echo,我有一个.php页面,其中包含变量,每个变量都与几十个不同的搜索条件相关联。我认为将所有变量作为一个巨大的字符串塞进数据库是最容易的 然后,我认为将变量和它们的声明作为一个巨大的字符串塞满会更容易 所以我的意思是,不仅仅是这个: Stewie 101 Green 相反,我希望将此作为数据库中的一个大blob: $user_name = 'Stewie'; $pants_size = '101'; $favorite_eggs = 'Green'; 这样,我就能够非常轻松地捕获和提取大量用户偏
Stewie
101
Green
相反,我希望将此作为数据库中的一个大blob:
$user_name = 'Stewie';
$pants_size = '101';
$favorite_eggs = 'Green';
这样,我就能够非常轻松地捕获和提取大量用户偏好数据,而不必以数组的方式做太多工作。毕竟,我必须经常更改页面,以至于更改数组会让人头疼
如果我能做到这一点,我可以简单地,它将能够简单地一次重新声明所有变量,我就不必再考虑它了
这些记录不需要是可搜索的,只需要使用变量声明(比如$var='value',带有引号和all)即可提取
到目前为止,我调查的情况如下:
- 一个javascript选项。是的,我知道可以用javascript做一些复杂的事情,但它比我的“一个大变量,我想响应,但神奇地也在”方法中声明变量要复杂得多。如果我这样做,我还不如做数组
- 数组选项。这涉及到.php中的intlode/explode内容,我担心在太长时间之前我将不得不选择它。然而,如果可能的话,我宁愿用我设想的一步方法来做
- “将每个变量分别存储在数据库中自己的字段中”选项。这太可怕了,因为字段的更改(并添加到)频率太高,会让我抓狂。我宁愿选择数组选项,因为这只是一些用户的小偏好
编辑:dave e在下面有一个很好的解决方案,可以通过eval检索这些数据。但我仍然有点困惑,如何将这些数据输入数据库。同样轻松地存储>100个变量及其声明($variable_name='value')有点令人费解 我认为如果您想做类似的事情,您应该将所有pref存储到一个数组中,并将该数组存储到db中。看一看
序列化
:你应该看一下PHP eval(),它可以将DB中的文本转换成文本PHP。但是,如果使用不当,您将面临许多潜在的安全问题
例如:
$code = get_whatever_from_DB();
$code = "
$user_name = 'Stewie';
$pants_size = '101';
$favorite_eggs = 'Green';
";
eval('?>' . $code . '<?');
$code=get_whatever_from_DB();
$code=”
$user_name='Stewie';
$pants_size='101';
$favorite_鸡蛋=‘绿色’;
";
eval(“?>”.$code.试试这个:
$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.
$data=array();
$data['user_name']='Stewie';
$data['pants_size']='101';
$data['favorite_eggs']='Green';
$one_big_string=序列化($data);
//在数据库中存储$one\u big\u字符串。
$one_big_string_from_db/提供如下选项:
$option_array['user_name'] = 'Stewie';
$option_array['pants_size'] = '101';
使用serialize存储数据
$stored_string = serialize($option_array);
当您从db返回数据时,请取消序列化它$option\u aray=unserialize($option\u array);
!对用户数据使用如下数组:
$USER['name'] = 'Stewie';
$USER['size'] = 101;
$USER['eggs'] = 'Green';
然后:
以及取回:
$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;
使用来自的评论
使用此稍微调整的功能
/**
* @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'
我使用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;
}
}
?>
使用Set方法设置新值
$settings->Set('name','Stewie');
$settings->Set('pant_size','101');
$settings->Set('favorite_eggs','Green');
使用Get方法获取值
echo $settings->Get('name');
当存储到DB时,只需使用$settings->Serialized()
现在,设置是以一种并非PHP独有的格式存储的,也许有一天会是一件好事,谁知道呢。好吧,到目前为止,我最喜欢这个选项。检索一大堆似乎每天都在变化的东西(我指的是它的结构每天都在变化)变得非常简单。我正在试图找出是否可以用相同的或类似的方式存储这些东西——只需在边缘添加几个标记。这可能吗?(感谢您提供的替代方案!数组对于如此庞大且多变的琐事来说将是一个非常头疼的问题。)我最终不得不将此作为我的解决方案。尽管它确实有效,但花了整整12个小时才将$date['0000u和'1u变量']全部放入一个数组。遗憾的是,这是12个小时的时间(似乎没有必要)首先我试图避免的工作。如果可以的话,正如我在帖子编辑中所说的,我会选择dave e的eval解决方案:它几乎不需要任何工作。在我看来,这个解决方案是所有与数组相关的解决方案中编写得最好的,因为代码在第一次尝试时就工作了。我非常感谢您的回复,ipsum,因为这就是我想要的非常有用!非常感谢。@Jerry Rowe:那么你应该把这个设置为你接受的答案。
$settings->Set('name','Stewie');
$settings->Set('pant_size','101');
$settings->Set('favorite_eggs','Green');
echo $settings->Get('name');