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

Фанат

oncle terrible
Команда форума
По хорошему должен быть хелпер, добавляющий правило:)
PHP:
$db->addParseHelper('f', function($val) {
    return floatval($val);
});
интересная мысль...
Нет.
Я тут подумал, и понял, что мысль ужасная.

Это то, что я ненавижу в программировании.

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

Мне же приходится заниматься поддержкой кода не меньше, чем написанием нового.
А проблема в том, что для читателя, которому потом этот код приходится поддерживать, отладка превращается в АД. Ну, допустим, плесхолдер простой и интуитивный типа f. Но ведь если есть инструмент - забацаем еще штучку для условий каких-нибудь. И вот встретив такую фигню в коде, натурально пробивает на измену. ЧТО ЭТО? ОТКУДА? Где искать концы? И ведь ответов нету. "Где-то в коде" определен новый плейсхолдер. Где - аллах его знает.
 

fixxxer

К.О.
Партнер клуба
угу. но можно иначе

PHP:
class Db extends SafeMysql {

     protected function parsePlaceholder_f($val) {
         return floatval($val);
     }

}
Конечно, и тут можно нагородить 100500 уровней наследования, но это уж сам дурак. Где искать в любом случае понятно.
 

hell0w0rd

Продвинутый новичок
Фанат
То есть унаследоваться от класса и написать гавнокода нельзя, а вот в расширении системы фильтров - плейсхолдеров - запросто?
 

fixxxer

К.О.
Партнер клуба
дело не в том, говно или не говно код, а в том, чтобы было легко понять, откуда взялось это (не) говно.

(по той же причине "открытые классы" в ruby сосут)
 

Фанат

oncle terrible
Команда форума
угу. но можно иначе
Кстати, буквально два часа назад получил фидбек о том, что класс нерасширябельный :)

Но у меня тут уже другая индея в голове шевелится - сделать результат работы парсера объектом. ну, чтобы через ?p нельзя было ерунды наподставлять...
Но там уже мерещится мне квери билдер и потеря девственности.
Вот сижу, думаю.

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

craz

Нестандартное звание
хорош пить) сопьетесь будете как я системными администраторами...
 

fixxxer

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

написал несколько строк, понял, что получаю QueryBuilder, выбросил
 
  • Like
Реакции: craz

BMW M6

Новичок
Я не совсем понял как сделать INSERT.
Вот запрос
PHP:
INSERT INTO p1 (id,name) VALUES ('$id','$name')")
Как всё это организовать то с помощью этого класса?
Я новичок в php просто.
 

BMW M6

Новичок
PHP:
$db->query("Запрос");
Правда я не совсем разобрался с плейсхолдарами. Я почитал статью на хабре, и вот там было про них что то :)
А вот есть код у меня
PHP:
$echo = $db->getRow("ЗАПРОС");
и вот тут я понять не могу, как мне вывести всё, то что есть в базе. То есть как написать цикл?
 

Фанат

oncle terrible
Команда форума

BMW M6

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

http://www.phpfaq.ru/migration#getarray
За ссылку спасибо!
Я не совсем понял как использовать плейсхолдер.

- ?s ("string") - строки (а также DATE, FLOAT и DECIMAL).
- ?i ("integer") - целые числа.
- ?n ("name") - имена полей и таблиц
- ?p ("parsed") - для вставки уже обработанных частей запроса
- ?a ("array") - набор значений для IN (строка вида 'a','b','c')
- ?u ("update") - набор значений для SET (строка вида
Вот так я понимаю это все плейсхолдеры. Как вот их использовать?
 

Фанат

oncle terrible
Команда форума
вместо актупльных данных в запрос надо подставлять плейсхолдеры.
а сами данные - через запятую после запроса. Условно говоря
Вместо того, чтобы писать
PHP:
$db->function("ЗАПРОС $variable");
ВСЕГДА надо писать
PHP:
$db->function("ЗАПРОС ?s", $variable);
ЛЮБЫЕ данные должны попадать в запрос ТОЛЬКО через плейсхолдер.
Вэтом весь смысл и состоит.
В твоем случае, самое простое будет
PHP:
$db->query("INSERT INTO p1 (id,name) VALUES (?s,?s)", $id, $name);
но если данные для вставки у тебя в массиве, то можно воспользоваься плейсхолдером ?u
PHP:
$db->query("INSERT INTO p1 SET ?u)", $array);
 

BMW M6

Новичок
Не могли бы вы мне показать на моём точном примере?

PHP:
$query = $db->query("INSERT INTO users_premium (tariff_id,server_id,steamid,wmid,purse) VALUES ('$tariffid','$serverid','$steamid','$wmid','$purse')");
Как его надо переделать?
-----
Вот ещё вопрос я с массивом почти разобрался, но есть проблема.
Если внутри класса функции класса пишу
PHP:
foreach ($data as $row){ echo $row[name];}
И вызываю функцию эту функцию, то всё выводится, но я хочу сделать вывод в файле tpl.
В tpl пишу
PHP:
<?php foreach ($data as $row){ echo $row[name];};?>
Ничего не происходит, но так и не должно же происходить.
Тогда пишу вот так <?php foreach ($Store->data as $Store->row){ echo $Store->row[name];};?> и тоже ничего!
Где я ошибаюсь?
Вот сам класс
PHP:
<?php
	 
	 class Store{
	 
	 public $db;
	 public $row;
	 public $data;
	 
	 function Store_List (){
	 
	 $db = new SafeMySQL();
	 $data = $db->getAll("SELECT id, type, type_image, name, ip, price FROM storage");

	 }
	 }
?>
 

BMW M6

Новичок
А что он него зависит?
Вот сам класс:
PHP:
<?php
	 
	 class Store{
	 
	 public $db;
	 public $row;
	 public $data;
	 
	 function Store_List (){
	 
	 $db = new SafeMySQL();
	 $data = $db->getAll("SELECT id, type, type_image, name, ip, price FROM storage");
	 }
	 }
?>
Файл index.php:
PHP:
<?php
	require_once('includes/init.php');
	$Store = new Store();
	$Store->Store_List();
	include('templates/main.tpl');
?>
main.tpl:
PHP:
<table cellpadding='0' cellspacing='0' border='0' width='987' class='genegal_buy_index_2 mws-table'><tr class='gradeA odd'><td width='30' align='center'><img src='<?php echo$Store->Store_Type_Image()?>' width='30' height='30' alt='admin' border='0'></a></td>
			<td width='250' align='left' class='qwe sorting_1'><a href='buy.php?id=<?php echo$Store->id?>'><?php $name = $Store->Store_Name();?></a></td>
			<td width='150' class='qwe' align='center'><?php echo$Store->ip?></td>
			<td width='100' align='right' class='qwe'><?php echo$Store->price?> рублей</td>
Правда там сейчас результаты моих пробов :)
Вот как то так.
---
Я попробую сам, я вроде понял, что и к чему.
 

Фанат

oncle terrible
Команда форума
открою тебе маленький секрет.
Если ты выкинешь этот "класс" из своего кода, и вместо него просто поставишь получение данных из базы, то все у тебя заработает.
 
Сверху