Класс для безопасной работы с MySQL

craz

Нестандартное звание
Слушайте я вот до поры до времени не хотел вам ничего говорить, но что это такой за класс, которым может пользоваться каждый школоло, который обсуждают сливки пхпклаба? Не видите не логичности?

Где тот самый пресловутый юзкейс?

Или опять:
"Мы напишем всей элитарной деревней классный класс, будем говорить ну ты че тупица не умешь им пользоваться там же все просто? Человек вон 15 лет занимается программированием, он за полтора часа разобрался!"

не?
 

Фанат

oncle terrible
Команда форума
Сложно сказать.
Я собираюсь его показывать и говорить - "Вот, смотри - безопасно и удобно!".
А там - как пойдёт.
 

craz

Нестандартное звание
Сложно сказать.
Я собираюсь его показывать и говорить - "Вот, смотри - безопасно и удобно!".
А там - как пойдёт.
как ты можешь это сделать если вы все вместе тут упражняетесь в знание всевозможных аспектов пхп, настолько частных... что вы уже даже перестаете друг друга понимать иногда(пример твой топки про проверку числа)? Помоему школоло опять выберет эти три долбанные строки опять
mysql_connect
mysql_select_db
mysql_query
Чтобы не вникать в новый язык... У тебя то книги по твоему классу нет... А у пхп есть.

Где та самая бритва оккамы?

Как бы безгранично я тебя не уважал... но ты пишешь целый фреймворк, для того чтобы отослать
SELECT * from tbl WHERE id>=10;

ВСЕ!

Ты прости конечно: ты много написал... Хороший код и т.п. Но я средний программист, я не зеленка, но твоим классом я пользоваться не буду никогда, по многим причинам, но главная мну парит в нем разбираться!!!!
 

Фанат

oncle terrible
Команда форума
посмотрел внимательно
погоди.
идея с плейсхолдером - действительно, тупая, как две копейки.
но зачем классы и инстансы? Почему просто не заменить при парсинге на содержимое, как есть?

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

craz

Нестандартное звание
я это видел.
Прикинь нуба на форум он такой пришел "ойюшки аюшки у меня то не работает се не работает, ты его сам в танк посылаешь или куда там, или на ман, он там читает если не дебил, учиться, решает свою проблему, и все он потерянный для тебе пациент"

Раздели все сущности! мой тебе совет))))
И ты поймешь как это прекрасно.
 

Фанат

oncle terrible
Команда форума
но ты пишешь целый фреймворк, для того чтобы отослать
SELECT * from tbl WHERE id>=10;
у тебя здесь сразу три ошибки.
1. не целый фреймворк, а единственный портабельный класс.
2. "отослать" мало. Надо ещё результат получить, ошибки обработать, запрофайлить при надобности.
3. Если значение id - динамическое, надо его корректно отформатировать перед вставкой в запрос.

Напиши ПОЛНЫЙ код с использованием mysql_query, а не этот огрызок - и сравним, стоит ли учить "целый фреймворк", состоящий из 5 функций и 5 плейсхолдеров
 

damner2

Новичок
посмотрел внимательно

мысли такие

1) разделить четко raw query и prepared query, prepared можно обернуть в тупой класс с одной строкой внутри например - просто как маркер. preparequery дергать для данной raw query-(под)строки всегда 1 раз
2) добавить плейсхолдер для подстановки части запроса, руками строки не собирать

то есть в итоге в примере WR будет так
PHP:
$one = 'some text with ?s placeholders';

$where = $db->parse("one = ?s",$one); 
assert('$where instanceof SafeMysqlString');
$data = $db->getAll("SELECT * FROM table WHERE ?q LIMIT ?i,?i", $where,$start,$per_page); // $q - (instanceof SafeMysqlString)->__toString()
как вариант - в п.1 проверять если не instanceof SafeMysqlString то prepareQuery.

что-то по типу перлового taint :)
Решение хорошее, но не решает все проблемы, например:
PHP:
$where = array();
if (!empty($from)) {
  $where[] = $db->parse(' AND `from` = ?i', $from);
}
if (!empty($to)) {
  $where[] = $db->parse(' AND `to` = ?i', $to);
}
$data = $db->getAll("SELECT * FROM table WHERE a = 1 ?q", implode('', $where));
Тут всё-равно нужно уметь подставлять в запрос строки, не обёрнутые в SafeMysqlString, без преобразования.

Как вариант, можно сделать "публичным" (не инкапсулировать его внутри библиотеки) класс SafeMysqlString. Тогда запрос должен будет выглядеть так:
PHP:
$data = $db->getAll("SELECT * FROM table WHERE a = 1 ?q", new SafeMysqlString(implode('', $where)));
Но в этом случае будет достаточно просто специального плейсхолдера, для указания, что строку нужно подставить без изменения.
 

Фанат

oncle terrible
Команда форума
и я уже написал в начале, что самых отпетых нубов я оставлю в покое.
класс этот для тех, кто хотя бы минимально представляет, что делает mysql_query
 

craz

Нестандартное звание
у тебя здесь сразу три ошибки.
1. не целый фреймворк, а единственный портабельный класс.
2. "отослать" мало. Надо ещё результат получить, ошибки обработать, запрофайлить при надобности.
3. Если значение id - динамическое, надо его корректно отформатировать перед вставкой в запрос.

Напиши ПОЛНЫЙ код с использованием mysql_query, а не этот огрызок - и сравним, стоит ли учить "целый фреймворк", состоящий из 5 функций и 5 плейсхолдеров
Я тебя поддерживаю, ты пойми - ты пиши, ты только монстра начал комстрячить уже. Ну полугодавалый просто поимеет чилда твоего класса у себя. А трехлетку не устроит твой класс. Сделай только для 0-0.5, остальные плющки уведи в другие классы
 

fixxxer

К.О.
Партнер клуба
погоди.
идея с плейсхолдером - действительно, тупая, как две копейки.
но зачем классы и инстансы? Почему просто не заменить при парсинге на содержимое, как есть?

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

вот чтобы таких ситуаций избежать в принципе, безо всяких там парсингов строк и прочих извращений

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

С.

Продвинутый новичок
Решение хорошее, но не решает все проблемы, например:
PHP:
$where = array();
if (!empty($from)) {
  $where[] = $db->parse(' AND `from` = ?i', $from);
}
if (!empty($to)) {
  $where[] = $db->parse(' AND `to` = ?i', $to);
}
$data = $db->getAll("SELECT * FROM table WHERE a = 1 ?q", implode('', $where));
Ну чего уже фигней маяться до такой степени? Зачем усложнять там, где это никому не нужно? Вот как решается эта проблема:
PHP:
$data = $db->getAll("SELECT * FROM table WHERE a = 1 ".implode('', $where));
 

Фанат

oncle terrible
Команда форума
Ну чего уже фигней маяться до такой степени? Зачем усложнять там, где это никому не нужно? Вот как решается эта проблема:
она здесь не решается, а наоборот - остаётся. если в $from что-то похожее на плейсхолдер, то будет ошибка
 

С.

Продвинутый новичок
она здесь не решается, а наоборот - остаётся. если в $from что-то похожее на плейсхолдер, то будет ошибка
Здесь две назависимые друг от друга проблемы. Первая и не проблема вообще, поскольку для сборки запроса из кусков естествено и логично исползовать простую конкатенацию, а не придумывать еще один вид плесйхолдера (горе от ума, блин).

Вторая -- комбинации, похожие на плейсхолдеры, в данных. Решается так же, как проблема с кавычками, а именно экранированием (я писал уже об этом выше). С единственной разницей, что плейсхолдеры пперед запуском запроса надо опять разэкранировать.
 

Фанат

oncle terrible
Команда форума
Здесь две назависимые друг от друга проблемы. Первая и не проблема вообще, поскольку для сборки запроса из кусков естествено и логично исползовать простую конкатенацию, а не придумывать еще один вид плесйхолдера (горе от ума, блин).

Вторая -- комбинации, похожие на плейсхолдеры, в данных. Решается так же, как проблема с кавычками, а именно экранированием (я писал уже об этом выше). С единственной разницей, что плейсхолдеры пперед запуском запроса надо опять разэкранировать.
Блин, кажется начало доходить!
parse() надо изменить так, чтобы она была не тупой обёрткой для prepareQuery, а острой - экранировала бы в возвращаемой строке вопросеги. Так?

parse, на самом деле, ИЗНАЧАЛЬНО должна была удваивать вопросы.

Тут, конечно, ухудшается её полезность для отладки, но это уже такая вещь, которой можно пожертвовать для тех долей процентов случаев, когда нам встретится вопрос в данных.
 
Сверху