#php #mysql #oop
#php #mysql #ооп
Вопрос:
Допустим, у меня есть:
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, здесь у нас есть текущее решение:
Используйте статический метод для получения экземпляров object.
$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, итак, как я могу извлечь, например, ‘welcome_body’ из $ data?
Комментарии:
1. что именно вы пытаетесь сделать???
2. я спрашиваю, хорошая ли идея загружать ВСЕ тексты из databace СРАЗУ вместо того, чтобы загружать каждый из них отдельно с помощью собственного запроса
3. извините, я был не в сети, не могли бы вы рассказать мне, как вы добились этого своим предыдущим методом.
4. ну, я же говорил вам, что я выполняю один запрос, чтобы получить каждый $ String = get_texto_clave(3, ‘hola’); —-> ‘hello’ (это все?)
5. @ToniMichekCaubel Вы имеете в виду, что хотите загружать все сообщения?? Я бы посоветовал вам пересмотреть структуру вашей базы данных.
Ответ №1:
Обновить::
Я думаю, что база данных не совсем подходит для такого рода операций. Я бы посоветовал вам пересмотреть дизайн вашей базы данных.
---- --------------- --------------- ----------
| 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
для выбора. Позже я объясню, почему. -
И используйте тип content
message_type
для добавления свойства к объекту.while($item = mysql_fetch_array($consulta))
{
$selfitem = new self;
$selfitem->$item['message_type'] = $item['message_type'];
$data[] = $selfitem;
}
return $data;
-
А теперь повторите свойство
echo $data->hello_message;
или прощальное сообщение
Теперь вы должны учитывать, что не следует добавлять две повторяющиеся записи для message_type
для одного и того же языка. Итак, лучше добавить DISTINCT
в инструкцию select. И также вы должны это проверить.
ДРУГОЙ СПОСОБ:: Вы также можете создать базу данных со статическими сообщениями, это не гибко, но надежно, и ее можно использовать с другим методом, который я вам представил.
---- ------------ -------------- -------------
| id | language | goodmorning | goodnight |
---- ------------ -------------- -------------
| 1 | english | good morning | good night | -- and so on and on
| 2 | spanish | something....| .......... | -- and so on and on
---- --------------- ----------- -------------
ПРИМЕЧАНИЕ::Обычно содержимое страницы загружается сразу, а не по очереди.
PS::Ваш английский ужасен.
Комментарии:
1. я не уверен, что я следую… так где же запрос? :$
2. @ToniMichelCaubet обновил ответ. но уверен, что это будет сложно для вас
3. Спасибо! то есть вы имеете в виду, что эта que $ consulta получит доступ к DDBB только один раз? я добавил пример того, как и когда я его использую, возможно, я недостаточно хорошо объяснил
![]()
4. @ToniMichelCaubet хорошо, что вы написали в комментарии, также проверьте, как это использовать.
5. Хорошо, у меня есть только 1 текст на $ lan и на $ ключевое слово. я всегда использую a while там, потому что if(mysql_num_rows>0) никогда не работал у меня очень хорошо… то есть вы хотите загрузить все тексты с помощью getData, а затем, как мне получить доступ к каждому тексту?