Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Класс для работы с MySQL, class DB
$result= db::get("SELECT name FROM users WHERE id = 1 LIMIT 1");
// вернет $result = "имя" (не массив)
$result= db::get("SELECT id,name FROM users WHERE id = 1 LIMIT 1");
// вернет уже массив $result = array("1","имя")
$result= db::get("SELECT * FROM users LIMIT 20");
// ну догадались что вернет :)
// в случае если запрос прошел но ничего не вернул $result = false
// ошибку вывести можно в любое время в любом месте
// естественно даже после закрытия соединения с базой
// про накопление ошибок в массив думал
echo db::emessage();
db::close();
Не особо нраца оно мне. Но работает так как задумал... (Добавление)
Только раместил - пришла мысль закатать любой и каждый запрос,
в том числе и внутренние "приватные", в обертку проверки на эксцепшн.
Щас переделаю...
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
1) многие юзают mysqli
2) Честно сказать не понял смысла класса
3) Где не уверен? что не пройдет ошибка, не ставь собак, а просто делай проверку на ошибки и выводи на экран
Champion
Отправлено: 07 Марта, 2011 - 09:26:53
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
DeepVarvar пишет:
('host','user','pass')
Лучше сделать это свойствами класса и инициализировать либо передав параметры в конструктор, либо сделать метод для инициализации их.
DeepVarvar пишет:
"utf8"
Тоже должен быть гибкий настраиваемый параметр.
И тип БД тоже неплохо бы выбирать, а не привязываться к одному mysql.
// вернет $result = "имя" (не массив)
...
// вернет уже массив $result = array("1","имя")
На мой взгляд, такое разное поведение функции - не гуд.
ALEN
Отправлено: 07 Марта, 2011 - 09:32:35
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
Champion пишет:
На мой взгляд, такое разное поведение функции - не гуд.
Согласен
DeepVarvar
Отправлено: 09 Марта, 2011 - 09:11:08
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Доработаю сегодня вечером. Сейчас на работе. (Добавление)
Champion пишет:
На мой взгляд, такое разное поведение функции - не гуд.
Раньше всегда массив возвращала. Решил сделать чуть удобнее.
Зачем инициализировать лишний массив для хранения результата,
если мы всеравно тащим только одну строчку из БД?
В остальных случаях возвращает массив.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Не используйте static где попало
Используйте Singleton для создания соединений к БД (иначе на каждый вызов будете соединяться - беда)
Используйте try..catch вместо @
Желательно использовать возможность подстановки параметров в запросы, дабы снизить риск injection (впрочем, в ряде случаев его не избежать как правило, но в том же Zend это оформлено изящно)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 09 Марта, 2011 - 09:41:46
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen,ALEN,Champion спасибо за замечания - буду переделывать.
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
DeepVarvar
Проще работать с массивом всегда.
Таким образом ты сократишь действия в своем классе, а кому нужно в частном порядке сам будет выводить и проверять. Тем более, что в общем плане скорость обращения к массиву с одним элементом, не будет отличатся от скорости обращения к переменной. Чтоб было хоть какое-то значительное изменение нужно умножать в сотни раз. Да и потом сделать нечто в виде:
$name=$array['name']; unset($array); - не составит труда для тех кому это нужно, а такие случаи достаточно редко будут встречаться.
В общем действительно не нужна штука.
DeepVarvar
Отправлено: 12 Марта, 2011 - 17:58:02
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
$result=$db->get("SELECT name FROM users WHERE id = $find",PARSE);
$db->close();
if(error::$init)echo error::viewlog();
?>
0. Убрал собак, объявил иной уровень вывода ошибок.
1. Установка host,user,pass при инициализации.
2. В метод ->param() можно отправлять любой запрос, он ссылается на обычный mysql_query();
3. Выбор БД вынес в публичный метод ->selectDB()
4. От SQL-инъекций сперва чистим, ф-ция clean() работает и с массивами.
5. Необязательный аргумент PARSE в методе ->get(), если объявлен,
делает "$name=$array['name'];" внутри обработки запроса, (for Champion,ALEN)
в противном случае возвращает "$array['name']".
6. Ошибки теперь собирает в массив и если надо, выводит списком <ul><li>.....
To EuGen: что-то я запарился с try...throw...catch и прочими экспериментировать.
Пока эта часть не реализована, смысл и принцип ясны, но пока не прикрутил...
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
DeepVarvar пишет:
метод ->param()
Не очень удачное название) Название clean для функции обезопашивания данных тоже не вызывает чувства удовлетворения при прочтении. И раз уж она призвана обезопашивать данные, почему бы ее не сделать членом класса?
Потом можно использовать запросы с подставляемыми параметрами и не утруждать пользователя руками вызывать функцию clean().
DeepVarvar пишет:
public static $init = false;
public static $errors = array(false);
плохо.
Раз речь пошла о синглтонах, то конструктор надо сделать приватным, а инициализацию host, login, pass производить другим методом.
Очень мне не нравится подход с функцией checker(). И как-то не очень он с инъекциями по-моему борется. А больше никто не борется. Функцию clean() никто не обязывает пользователя использовать.
Ай-ай-ай. Давай что-нибудь другое рожай)
DeepVarvar
Отправлено: 12 Марта, 2011 - 18:29:03
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Champion пишет:
Раз речь пошла о синглтонах
Сделаем..
Champion пишет:
Не очень удачное название ->param
Почему?
Champion пишет:
почему бы clean() не сделать членом класса?
Думал об этом - сделаю.
Champion пишет:
public static $init = false;
public static $errors = array(false); ПЛОХО
Почему?
Champion пишет:
checker()
Он не борется с инъекцией - он только проверяет успешность запроса. (Добавление)
Champion пишет:
Название clean для функции обезопашивания данных тоже не вызывает чувства удовлетворения при прочтении
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
DeepVarvar пишет:
Почему?
Название функции должно описывать, что она делает. Например, на турецком языке это слово означает деньги. Турецких программистов ты запутаешь, у них начнется паника и стресс.
DeepVarvar пишет:
Он не борется с инъекцией
А кто же тогда бороться будет? Я вызываю публичный метод класса, я должен быть уверен, что всё будет хорошо и безопасно.
DeepVarvar пишет:
ПЛОХО
Почему?
Потому что я могу поменять эти члены класса снаружи и нарушить работу внутренних методов. Менять свойства класса должны только методы класса. И поэтому св-ва должны быть приватными. (Добавление)
DeepVarvar пишет:
Однако обезопашивает.
Или есть методы обхода?
Я не написал, что она не обезопашивает. Я написал, что название не удачно. Такое название больше подойдет для функции, которая что-то полностью очищает. (Добавление)
А то, что она возвращает значение в двойных кавычках не хорошо, потому что, например в firebird двойные кавычки выполняют такую же функцию, как в mysql символ `.
Еще обезопашивать данные именно htmlentities не очень здорово, потому что не все данные предназначены для вывода на веб страницы. Иногда лучше сохранять их в первоначальном виде, просто проэкранировав опасные символы.
Мелкий
Отправлено: 12 Марта, 2011 - 18:57:37
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
DeepVarvar пишет:
Или есть методы обхода?
Есть. Не обрабатываются одинарные кавычки. См описание htmlentities.
Использование eval - жирный минус классу. Он здесь не требуется и класс теряет в переносимости, т.к. может быть отключен eval на хостингах.
----- PostgreSQL DBA
DeepVarvar
Отправлено: 12 Марта, 2011 - 19:28:31
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Champion пишет:
на турецком языке
Ну и пусть турки едут в дурку
Champion пишет:
А кто же тогда бороться будет?
Только clean()
Champion пишет:
Потому что я могу поменять эти члены класса снаружи.
В контексте именно этого класса это необходимо...
Champion пишет:
например в firebird...
Не подумал об этом, однако тут идет речь только о MySQL, т.к. я отказался делать поддежку других БД.
Champion пишет:
потому что не все данные предназначены для вывода на веб страницы
Эти данные никогда не выводятся на страницу - они посылаются в запросе к БД. (Добавление)
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.