Сокращение запросов Mysql и ООП

#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  |
 ---- --------------- --------------- ---------- 
  
  1. Сначала создайте базу данных, подобную

  2. Создайте объект базы данных для запроса базы данных, подобной этой.
    //не используйте ключевое слово, оно вообще бесполезно
    //Конечно, бессмысленно говорить «доброе утро» и в конце «До свидания» на каком-то языке
    //а также логически это бесполезно, потому что мы должны запрашивать данные

    $message = language_text::getData($lan);

  3. Ваш запрос должен быть чем-то вроде этого SELECT* FORM message WHERE language='english' или что-то в этом роде. //также лучше добавить DISTINCT для выбора. Позже я объясню, почему.

  4. И используйте тип content message_type для добавления свойства к объекту.

    while($item = mysql_fetch_array($consulta))
    {
    $selfitem = new self;
    $selfitem->$item['message_type'] = $item['message_type'];
    $data[] = $selfitem;
    }
    return $data;

  5. А теперь повторите свойство 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, а затем, как мне получить доступ к каждому тексту?