Лучше ли делать меньше обращений к базе данных и выводить результаты в массиве?

0

Я пытаюсь создать более сжатый способ сделать сотни вызовов db. Вместо того, чтобы писать весь запрос каждый раз, когда я хотел вывести одно поле, я попытался перенести код в класс, который выполнял весь запрос. Это класс, который у меня есть до сих пор:

class Listing {

/* Connect to the database */
private $mysql;

function __construct() {
    $this->mysql = new mysqli(DB_LOC, DB_USER, DB_PASS, DB) or die('Could not connect');
}
function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") {
    $condition = "`status` = '$status'";
    if (!empty($l_id)) $condition .= "AND `L_ID` = '$l_id'";
    if (!empty($category)) $condition .= "AND `category` = '$category'";
    if (!empty($subcategory)) $condition .= "AND `subcategory` = '$subcategory'";
    if (!empty($username)) $condition .= "AND `username` = '$username'";
    $result = $this->mysql->query("SELECT * FROM listing WHERE $condition") or die('Error fetching values');
    $info = $result->fetch_object() or die('Could not create object');
    return $info;
}
}

Это упрощает доступ к любой информации, которую я хочу получить из одной строки.

$listing = new Listing;
echo $listing->getListingInfo('','Books')->title;

Это выводит заголовок первого листинга в категории "Книги". Но если я хочу вывести цену этого листинга, я должен сделать еще один вызов getListingInfo(). Это делает другой запрос на db и снова возвращает только первую строку.

Это намного проще, чем писать весь запрос каждый раз, но я чувствую, что часто звоню в db. Есть ли лучший способ вывода данных из моего класса и по-прежнему быть кратким в доступе к нему (возможно, вывести все строки в массив и вернуть массив)? Если да, то как?

  • 0
    какое количество строк в этой таблице?
Теги:
oop
resultset

4 ответа

0
Лучший ответ

Вы должны иметь возможность хранить весь объект из запроса в переменной и затем получать доступ к отдельным значениям из этого объекта:

$object = $listing->getListingInfo('','Books');
$title = $object->title;
$price= $object->price;

Но вы также можете использовать fetch_assoc() и вернуть весь Assiciative массив:

$array = $listing->getListingInfo('','Books');
$title = $object['title'];
$price= $object['price'];

Это даст вам те же результаты, а также только один запрос к БД.

EDIT. Если функция getListingInfo() является единственной функцией, вы должны подумать о следующем:

  • переименуйте функцию в prepareListingInfo(), и внутри функции только подготовьте запрос и сохраните его в переменной класса.
  • добавить функцию getNextListingInfo(), которая вернет объект или ассоциативный массив со следующей строкой.

Используя эту новую функцию, вы можете получить каждую строку, соответствующую вашему запросу.

7

У вас действительно проблема с производительностью?

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

Такой вид абстракции доступа к БД, вероятно, станет проблемой обслуживания и, вероятно, не поможет производительности.

Кроме того, вы подвержены SQL-инъекции.

  • 0
    +1 за указание на уязвимость SQL-инъекции.
  • 0
    Я думаю, что загрузка точно такой же снова, чтобы получить столбец, который вы уже получили в запросе, неэффективна. Сохранение результата в переменной - очень простой способ избежать этого.
Показать ещё 5 комментариев
0

Либо кешируйте результат во внутреннем var

Или Прокомментируйте это с предупреждением и объясните, как пользователи могут копировать результат в var вместо вызова его снова и снова с теми же параметрами

0

Да, это слишком часто вызывает db.

Несколько решений

1) поместите информацию о листинге в переменную

2) кэширует результаты в хэш-карте или словаре (будьте осторожны при утечке памяти)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню