假设我有:
class language_text{
protected $id;
protected $keyword;
protected $language;
protected $text;
function __construct($clave,$lan){
$consulta = mysql_query("SELECT id,clave,lengua,texto,id_usuario FROM textos WHERE clave = '$clave' AND lengua = '$lan'");
if(mysql_num_rows($consulta)>0){
while($item = mysql_fetch_array($consulta)){
$this->id = $item['id'];
$this->clave = $item['clave'];
$this->lengua = $item['lengua'];
$this->texto = $item['texto'];
$this->id_usuario = $item['id_usuario'];
$this->exists = true;
}
return true;
}else{
$this->exists = false;
$this->clave = $clave;
return $this->clave;
}
}
}
function get_texto_clave_html($clave){
$clave = htmlspecialchars($clave);
$lan = detectarIdioma();
$temporal = new texto($clave, $lan);
if($temporal->exists()==true){
return $temporal->get_texto_html();
}else{
return $clave;
}
}
}
所以每次我都需要一些我调用的语言文本:get_texto_clave($lan, $keyword)
,但在每个页面中可能有大约 25 个文本,所以我想我应该将所有语言加载到一个数组中,然后访问它而不是数据库。
例如:
- 我想要西类牙语的欢迎文字
get_texto_clave(2,'welcome_html')
; - 我想要西类牙语的再见文本
get_texto_clave(2,'bye_bye_html')
;
问题:
- 你怎么看?
- 您会添加一个新类,例如 language_text_collection 或类似的类吗?
感谢 experimentX 的贡献,这里我们有了当前的解决方案:
使用静态方法获取对象的实例。
$data = language_text::getData($lan, $keyword);
在 getData 方法上
public function getData($lan, $keyword)
{
$data = array();
//query here
$consulta = mysql_query("SELECT id,clave,lengua,texto,id_usuario FROM textos WHERE clave = '$clave' AND lengua = '$lan'");
while($item = mysql_fetch_array($consulta))
{
$selfitem = new self;
$selfitem->id = $item['id'];
$selfitem->clave = $item['clave'];
...
...
$data[] = $selfitem;
}
return $data[]; //end the end you send an array of data
}
现在 $data 将包含一个对象数组。使用循环访问其属性。
foreach($data as $d)
{
echo $d->id;
echo $d->clave;
...
...
}
但是我还看不到,
我假设在 $data 中我们有当前 languageId 的所有语言文本, 那么,我如何才能从 $data 中提取“welcome_body”?
最佳答案
更新::
我认为数据库不太适合这种操作。我建议您修改数据库设计。
+----+---------------+---------------+----------+
| id | message_type | message_text | language |
+----+---------------+---------------+----------+
| 1 | good morning | good morning | english |
| 2 | good_morning | something.... | spanish |
+----+---------------+---------------+----------+
首先创建一个数据库如
像这样创建一个数据库对象来查询数据库。
//不要使用关键字,根本没用
//当然,说早安和最后……用某种语言说再见是毫无意义的
//而且从逻辑上讲,它是无用的,因为我们必须查询数据$message = language_text::getData($lan);
您的查询必须是这样的
SELECT* FORM message WHERE language='english'
之类的。//另外最好加上DISTINCT
来选择。我稍后会解释原因。并使用内容
message_type
类型向对象添加属性。while($item = mysql_fetch_array($consulta))
{
$selfitem = new self;
$selfitem->$item['message_type'] = $item['message_type'];
$data[] = $selfitem;
返回 $data;
现在回显属性
echo $data->hello_message;
or goodbye message
现在,您必须考虑不要为同一语言添加 message_type
的两个重复条目。因此,最好在 select 语句中添加 DISTINCT
。而且你还必须检查它。
其他方式:您还可以使用静态消息创建数据库,它不灵活,但可靠,可以与我介绍给您的其他方法一起使用。
+----+------------+--------------+-------------+
| id | language | goodmorning | goodnight |
+----+------------+--------------+-------------+
| 1 | english | good morning | good night | -- and so on and on
| 2 | spanish | something....| .......... | -- and so on and on
+----+---------------+-----------+-------------+
注意::通常一次加载页面内容而不是一个一个加载。
PS::你的英语很糟糕。
关于php - 减少 Mysql 查询和 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565430/