(PHP& mySQL)将行视为列

时间:2010-01-04 05:38:11

标签: php mysql row entity-attribute-value

我正在研究PHP&基于mySQL的网站。我正在尝试在管理面板中设置“设置”页面,我可以在其中输入不同的设置来管理网站。根据要求,设置可以达到100(甚至更多)。因此,不是制作100列(如果我将来必须添加更多列,则增加),我希望以行方式存储数据并获取值,就像我从列中获取它一样。

参考:

我在最流行的博客工具'Wordpress'中找到了类似的现实生活。作为参考,我正在谈论的是'wp_options'表。(请纠正我,我错了)

示例:

以下是我尝试这样做的原因(以及为什么)的一个简单示例:

--Table settings

P.KEY   option_name      option_value
1       site_name        XYZ site inc.
2       siteurl          http://www.xyz.com
3       slogan           Welcome to my XYZ site
4       admin_email      admin@xyz.com
5       mailserver_url   mail.xyz.com
6       mailserver_port  23
..... etc.

从上面可以看出,我列出了很少的选项,而且它们的数量正在增加。 (仅为了记录,我的Wordpress安装在wp_options表中有902行,我没有看到任何重复的option_name)。所以,如果我运用与Wordpress相同的工作原理来适应设置的增长,我感觉自己很健康。另外我想这样做,这样一旦我保存了DB中的所有设置,我想检索所有设置并填充表单中的相应字段,这些条目存在于DB中。

我的代码试验之一:

--
-- Table structure for table `settings`
--

CREATE TABLE IF NOT EXISTS `settings` (
  `set_id` tinyint(3) NOT NULL auto_increment,
  `option_name` varchar(255) NOT NULL,
  `option_value` varchar(255) NOT NULL,
  PRIMARY KEY  (`set_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Dumping data for table `settings`
--

INSERT INTO `settings` (`set_id`, `option_name`, `option_value`) VALUES
(1, 'site_name', 'XYZ site inc.'),
(2, 'slogan', 'Welcome to my XYZ site');

$result = mysql_query("SELECT option_name, option_value FROM settings");
$defaults = array('option_name', 'option_value');


while( list($n, $v) = mysql_fetch_array($result) )
{
 $defaults['option_name'] .= $n;
 $defaults['option_value'] .= $v;
}

echo  $defaults['option_name'].'---'.$defaults['option_value'].'<br />';

//The above code gives me the following Output:
//site_nameslogan---XYZ site inc.Welcome to my XYZ site

当我运行上述查询时,我还收到2条PHP通知,上面写着:

未定义的索引:option_name

未定义的索引:option_value

我将非常感谢能够显示 PHP代码的任何回复,以便成功检索选项并消除未定义的索引问题。另外,就像我之前提到的那样,我希望检索所有现有设置,并在存储数据后访问设置页面时填充表单中的相应字段。

谢谢你提前全力以赴。

2 个答案:

答案 0 :(得分:4)

PHP会向您发出警告,因为$defaults['option_name']$defaults['option_value'].=操作中使用之前尚未初始化。

所以只需加上

$defaults['option_name'] = '';
$defaults['option_value'] = '';
在循环和警告消失之前

其余代码完全正确,但您根本不必拥有set_id列,因为每个设置都有唯一的名称,该名称(option_name列)可用作主键。

您可以改进代码的另一个方面是以不同方式使用$defaults,如此

$defaults[$n] = $v;

然后你可以自己使用每个设置,而无需查看两个巨大的字符串。

$site_url = $defaults['site_url'];
foreach ($defaults as $name => $value) {
   echo $name, ' = ', $value, '<br>';
}

答案 1 :(得分:1)

这应该可以解决问题:

$defaults = array('option_name' => array( ), 'option_value' => array( ) );

while( list($n, $v) = mysql_fetch_array($result) )
{
 $defaults['option_name'][] = $n;
 $defaults['option_value'][] = $v;
}

然后在您的视图中迭代$defaults['option_name']$defaults['option_value']