Allepta
@Allepta

Методы выборки из БД?

Приветствую, пишу не большой скрипт блога. При написание категорий к постам задался вопросом, как можно организовать выборку категорий к постам с наименьшим написанием кода.

Вот сам фрагмент:
function GetHashtagInfo($id = null, $tag = null, $type = null)
  {
    if(!is_null($id) && is_numeric($id) && !is_null($tag) && !is_numeric($tag) && !is_null($type) && !is_numeric($type))
      $sql = "SELECT * FROM `hashtags` WHERE `id` = '$id' AND `tag` = '$tag' AND `type` = '$type'"; //1, 1, 1
    else if(!is_null($id) && is_numeric($id) && !is_null($tag) && !is_numeric($tag) && is_nullt($type))
      $sql = "SELECT * FROM `hashtags` WHERE `id` = '$id' AND `tag` = '$tag'"; //1, 1, 0
    else if(!is_null($id) && is_numeric($id) && is_null($tag) && is_null($type))
      $sql = "SELECT * FROM `hashtags` WHERE `id` = '$id'"; //1, 0, 0
    else if(!is_null($id) && is_numeric($id) && is_null($tag) && !is_null($type) && !is_numeric($type))
      $sql = "SELECT * FROM `hashtags` WHERE `id` = '$id' AND `type` = '$type'"; //1, 0, 1
    else if(is_null($id) && !is_null($tag) && !is_numeric($tag) && !is_null($type))
      $sql = "SELECT * FROM `hashtags` WHERE `tag` = '$tag' AND `type` = '$type'"; //0, 1, 1

    $sql_result = $this->mysql->Query($sql);

    if(($sql_row = mysqli_fetch_assoc($sql_result)) != null)
      return $sql_row;
    else
      return $sql_row = null;
  }


Входные переменные: $id = Идентификатор тэга из бд, $tag = Системный тэг для фильтрации, $type = маркер для назначения тэга к примеру стоит articles

Как вы видите очень много ветвления, что приводит к путанице, можно ли иначе реализовать данный подход?
В голове крутится switch, но он ведь тоже из той оперы.
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 3
profesor08
@profesor08 Куратор тега PHP
Вообще-то достаточно знать несколько базовых функций для работы с массивами и уметь работать с данными. Либо освоить какой-то sql query builder

function BuildGetHashtagInfoQuery($id = null, $tag = null, $type = null) {
    $sql = "SELECT * FROM `hashtags`";
    $where = [];
    
    if (is_numeric($id)) {
        $where["id"] = $id;
    }
    
    if (is_string($tag)) {
        $where["tag"] = $tag;
    }
    
    if (is_string($type)) {
        $where["type"] = $type;
    }
    
    if (count($where) > 0) {
        $sql .= " WHERE ";
        
        $sql .= implode(" AND ", array_map(function($key) use($where) {
            return "`{$key}` = '{$where[$key]}'";
        }, array_keys($where)));
    }
    
    return $sql;
}

echo BuildGetHashtagInfoQuery(123, "cat", "animal");
Ответ написан
@Aricus
$sql = "SELECT * FROM `hashtags` WHERE ";
if (...) {
  $sql .= "`id` = '$id' AND ";
}
if (...) {
  $sql .= "`tag` = '$tag' AND ";
}
if (...) {
  $sql .= "`type` = '$type' AND ";
}
$sql = substr($sql, 0, -5);
Ответ написан
@BorisKorobkov Куратор тега PHP
Web developer
Используйте любой "query builder".
Например, https://laravel.com/docs/master/queries или https://www.yiiframework.com/doc/guide/2.0/en/db-q...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы