Нужен совет по созданию класса для работы с базой
Код:
class DB
{
function connect()
{
$db = new mysqli("localhost", "user", "pass", "bd");
$db->query("SET CHARSET SET utf8");
$db->query("SET NAMES 'utf8'");
$this->query = $db;
return $db;
}
function select($select)
{
if ($result = $this->query->query($select))
{
if($result->num_rows > 0)
{
$row = $result->fetch_assoc();
return $row;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
$result->close();
}
}
$DB = new DB();
$DB->connect();
$select = $DB->select("SELECT `name` FROM `users` WHERE `id`='1'");
echo $select['name'];
{
function connect()
{
$db = new mysqli("localhost", "user", "pass", "bd");
$db->query("SET CHARSET SET utf8");
$db->query("SET NAMES 'utf8'");
$this->query = $db;
return $db;
}
function select($select)
{
if ($result = $this->query->query($select))
{
if($result->num_rows > 0)
{
$row = $result->fetch_assoc();
return $row;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
$result->close();
}
}
$DB = new DB();
$DB->connect();
$select = $DB->select("SELECT `name` FROM `users` WHERE `id`='1'");
echo $select['name'];
Все работает, но опасаюсь что в функция select могу передать все что угодно, даже если фильтровать могут передать не то что мне нужно. Если сделать так то тут явно указываю что вывести
Код:
$db = new mysqli("localhost", "user", "pass", "bd");
$db->query("SET CHARSET SET utf8");
$db->query("SET NAMES 'utf8'");
if ($result = $db->query("SELECT `name` FROM `users` WHERE `id`='1'"))
{
if($result->num_rows > 0)
{
$row = $result->fetch_assoc();
echo $row['name'];
}
else
{
die;
}
}
else
{
die;
}
$result->close();
$db->query("SET CHARSET SET utf8");
$db->query("SET NAMES 'utf8'");
if ($result = $db->query("SELECT `name` FROM `users` WHERE `id`='1'"))
{
if($result->num_rows > 0)
{
$row = $result->fetch_assoc();
echo $row['name'];
}
else
{
die;
}
}
else
{
die;
}
$result->close();
Какой метод безопасней и все таки лучше использовать?
У вас как-то все убого. Посмотрите готовые решения, какая у них архитектура и прочее, а потом выберите, что вам важнее и пишите аналоги.
А где можно найти готовые решения? Потом я мог бы их подстроить под себя. Нет фильтрация и проверка это все понятно,я только про метод спрашивал. А вообще что не то в этом классе?
Если работали с Java, то там как раз средство работы с БД очень хорошо орагнизовано.
Есть один интерфейс, который описывает класс, абстрактный класс, который реализует общий функционал (профилирование и т.д.) и также набор классов, расширяющих его - для MySQL, для постгреса и т.д.
Таким же образом устроен набор классов для работы с полученным результатами)
Цитата:
$mysqli = new mysqli("localhost", "user", "password", "world");
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5")) {
$stmt->bind_param("s", $code);
$code = "C%";
$stmt->execute();
$stmt->bind_result($col1, $col2);
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}
$stmt->close();
}
$mysqli->close();
Тут как знаю prepare кэширует и защищает от частых запросов
Цитата: cyberx
Ну подсчитывать количество запросов можно же сделать с помощью сессий?
Учет запросов - имеется в виду для конкретно вызываемой страницы (т.е. только в рамках одной генерации страницы/отработки какого-либо задания), а не в общем.
Посчет кода. Вы определитесь, что вы хотите. Обертку написать или mysqli научиться юзать. По крайней мере в том коде и так все видно на 6 и 8 строчках. Для начала местами поменяйте + C% - некорректно указкано, должно выдать ошибку запроса (ибо где кавычки для строки??).
Посчет ввода данных в запрос - откройте для себя могучую функцию sprintf.
Да я его просто скопировал, просто не знаю как его подстроить под единый класс. Мне для начала не обязательно делать профессиональный класс, пока хочу сделать средненький. А вообще как я знаю sprintf больше ресурсов требует чем echo
По теме - я вам уже ответил. Пишите интерфейс, какой вам нужен, под него пишите класс.
Готовое решение можно посмотреть например тут: