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

NBK

Новичок
И сразу неправильно.
Если писать в него запрос по-старинке, то никакого смысла пользоваться им нет.
А если пользоваться, то любые переменные должны идти в запрос в обязательном порядке через плейсхолдеры
Для запросов INSERT и UPDATE есть специальный плейсхолдер, для которого надо передать массив, где ключ - это имя поля, а значение - передаваемая переменная:
PHP:
$data = array(
'TIME_GET' => $timeget,
'NAME' =>$pl[0],
// и так далее
);
и после этого вызвать запрос, как показано выше:
PHP:
$sql = "INSERT INTO table ?u";
$db->query($sql, $data);
С этим ясно?

Ничего такого эта функция не умеет.
Умеет mysql, но не по предложенным данным, а по первичному ключу.
Если в таблице есть первичный ключ, то можно после запроса INSERT дописать ON DUPLICATE KEY UPDATE TIME_GET=values(TIME_GET), NAME=values(NAME) ...
в этом случае, при попытке вставить существующий первичный ключ, будут обновлены указанные в конце запроса поля
пример: http://phpfaq.ru/examples#onduplicate

http://phpfaq.ru/examples#multiinsert
Да спасибо.
PHP:
$sql = "INSERT INTO table set ?u";
так правильно, во всяком на моей базе.
с ODKU буду разбираться еще пока и обычный запрос в базе не отработал. (сейчас #1267 - Illegal mix of collations ) побороть пытаюсь.
ODKU с мультиинсертом будет работать?
Стоит выбор или одним запросом вставить в базу сразу все 100тыс строк или мучить ODKU.

PS не понимаю подход к ODKU почему не реализовали просто перечислением полей которые нужно апдейтить, значения для всех полей то уже переданы и с мультиинсертом можно было бы ODKU пользовать, уверен база вставку в таблицы все равно построчно делает.
 

Фанат

oncle terrible
Команда форума
PS не понимаю подход к ODKU почему не реализовали просто перечислением полей которые нужно апдейтить, значения для всех полей то уже переданы
правило большого пальца: Всякий раз, когда ты не понимаешь смысл механизма - скорее всего тебе просто не хватает опыта.
это тебе кажется, что больше нечего писать. А на самом деле может понадобиться записать что-то другое - или другой статус, не "новый", а "обновлен", или инкремент, или что-то еще. чтобы не писать руками, есть функция values.
Illegal mix of collations ) побороть пытаюсь.
set names
ODKU с мультиинсертом будет работать?
вроде, да
сразу все 100тыс строк
могут не влезть в max_allowed_packet
 

NBK

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

PHP:
                $sql = "update main set ?u where C_1 = ?i and C_2 = ?i and C_3 = ?i";
                $data = array(
                'TIME_GET' => $timeget,'PNAME' =>$pl, 'MNAME' => $mname, 'MET' => $met, 'CR' => $p_cr,
                'UID' => $uid, 'NICK' => $nick, 'STATUS' => $status, 'RAITING' => $rating, 'ALLY' => $ally
                );
                $query = $db->query($sql,$data,$gal,$syst,$pnum);
возможно ли как-то заменить на подобное?
PHP:
                $sql = "update main set ?u where ?u";
                $data = array(
                'TIME_GET' => $timeget,'PNAME' =>$pl, 'MNAME' => $mname, 'MET' => $met, 'CR' => $p_cr,
                'UID' => $uid, 'NICK' => $nick, 'STATUS' => $status, 'RAITING' => $rating, 'ALLY' => $ally
                );
                $data2 = array('C_1' => $gal, 'C_2' => $syst, 'C_3' => $pnum);
                $query = $db->query($sql,$data,$data2);
 

NBK

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

флоппик

promotor fidei
Команда форума
Партнер клуба
NBK,
PHP:
[ 'MNAME' => $mname, 'MET' => $met, 'CR' => $p_cr, 'Cr' => $p_cr, 'cR' => $mname, 'MeT' => $p_cr, 'MnaMe' => $met]
Примени эти данные к своему варианту. Каковы будут вставленные данные?
 

Фанат

oncle terrible
Команда форума
Жаль, возможно такого не хватает, а с другой стороны уже бы попросили ;)
А зачем?
PHP:
$query = $db->query($sql,$data,$data2);
Такого - точно не просили. Я не вижу, зачем он может быть нужен.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
он хочет типа этого
PHP:
foreach($data2 as $field => $value){
    $where[] = $field.' = "'. $value."'";
}
$query = $db->query($sql, $data, "(".implode(" AND ", $where).')');
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
не очень понял.
Пост-то пихается первым аргументом. А второй для чего?
он видимо внутри хотел чтоб был array_merge и произвольное число параметров. Типа пост + своих данных напихать. Опять таки, я просто пытаюсь повторить чужую логику мышления, не более того.
тогда не трахать мозги, а брать сразу фреймворк
ты б еще AR предложил! :D
 

WMix

герр M:)ller
Партнер клуба
Фанат, оно везде так происходит.
и find(array('id'=>42, 'foo'=>'bla')) и update(array('y'=>'x'), array('id'=>42, 'foo'=>'bla') ) и delete(array('id'=>42, 'foo'=>'bla') ), составной ключик
очень ожидаемое желание
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Фанат, оно везде так происходит.
и find(array('id'=>42, 'foo'=>'bla')) и update(array('y'=>'x'), array('id'=>42, 'foo'=>'bla') ) и delete(array('id'=>42, 'foo'=>'bla') ), составной ключик
очень ожидаемое желание
Я не понимаю, какая проблема написать запрос
Код:
UPDATE t SET ?u WHERE id =?i AND foo = ?s
какая разница, составной или подставной? Это обычный запрос.
Задача либы - устранить обработку данных руками. Да, не всегда это работает. Но зачем изобретать какие-то костыли для обычных, простых, наглядных запросов - я не понимаю.
 

WMix

герр M:)ller
Партнер клуба
мне оно не нужно. но это же обычно что форма по гету передает ключик к записе а в почте данные.
и можно сократить писанину на грубое update($_POST, $_GET);
 

Фанат

oncle terrible
Команда форума
но это же обычно что форма по гету передает ключик к записе а в почте данные.
и можно сократить писанину на грубое update($_POST, $_GET);
Нельзя. в гет у нас ассоциативный массив. Сокращение на одну переменную - это не сокращение. Увеличение количества функций, которые надо заучивать - гораздо хуже. Система дожна быть простой и интутитивной. А не пытаться удовлетворить каждого фантазёра.
мне оно не нужно.
мне тоже.
о чем тогда вообще разговор?

Из-за таких как ты вот - которым не надо, но которые лезут с советами, любой софт превращается в неюзабельное говно. Был нормальный мессенджер айсикью - сделали неюзабельное говно. появился квип - из него тоже. И так далее. Не стоит ли остановиться и задуматься - может быть, не любую высосанную из пальца фичу стоит пихать в продукт?
 
Сверху