Я пытаюсь создать более сжатый способ сделать сотни вызовов 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. Есть ли лучший способ вывода данных из моего класса и по-прежнему быть кратким в доступе к нему (возможно, вывести все строки в массив и вернуть массив)? Если да, то как?
Вы должны иметь возможность хранить весь объект из запроса в переменной и затем получать доступ к отдельным значениям из этого объекта:
$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() является единственной функцией, вы должны подумать о следующем:
Используя эту новую функцию, вы можете получить каждую строку, соответствующую вашему запросу.
У вас действительно проблема с производительностью?
Если ваша текущая настройка работает и не страдает от проблем с производительностью, я бы не стал ее трогать.
Такой вид абстракции доступа к БД, вероятно, станет проблемой обслуживания и, вероятно, не поможет производительности.
Кроме того, вы подвержены SQL-инъекции.
Либо кешируйте результат во внутреннем var
Или Прокомментируйте это с предупреждением и объясните, как пользователи могут копировать результат в var вместо вызова его снова и снова с теми же параметрами
Да, это слишком часто вызывает db.
Несколько решений
1) поместите информацию о листинге в переменную
2) кэширует результаты в хэш-карте или словаре (будьте осторожны при утечке памяти)