Всем привет! Посоветуйте какой-нибудь класс для работы с MySQLi. Чтоб был проверенный, надёжный, и понятный
как по мне, очень тяжело разобраться новичку что к чему, плюс код не документирован, человек знающий только разберется в нем, не знаю как автор стати, может и разберется, я точно нет) Но код написан красиво и 95% грамотно, эти 5% оставил потому что есть вероятность что ты будешь переделывать, а в друг увидишь что-то не хорошее)
@Valick, не соглашусь. В MySQLi для одного запроса нужно несколько строк кода написать. + запрос составить. Обёртка помогает сделать это практически в одну строчку.
Учел тот вердикт, что мой/твой/чей-либо (обвертка,библиотека,прочее мелкая хрень) говнокод подавно никому не нужен (как не стараясь). Поэтому основного внимания не уделил. Но отнюдь: https://github.com/MouseZver/Lerma/blob/master/README.md https://github.com/MouseZver/Lerma/wiki/Руководство https://github.com/MouseZver/Lerma/wiki/Предопределенные-константы
Обернув можно быстрее (короче) код писать. Плюс prepare и execute не нужно по 10 раз писать. В общем я ЗА простой не нагруженный класс для работы с PDO.
держи Спойлер: :) PHP: class Database{ public $isConn; protected $datab; public function __construct($username, $password, $host, $dbname, $options = []){ $this->isConn = TRUE; $dsn = 'mysql:dbname=' . $dbname . ';host=' . $host . ';charset=utf8'; $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ); try { $this->datab = new PDO($dsn, $username, $password, $options); $this->datab->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { throw new Exception($e->getMessage()); } } public function Disconnect(){ $this->datab = NULL; $this->isConn = FALSE; } // get row public function getRow($query, $params = []){ try { #$this->datab->beginTransaction(); $stmt = $this->datab->prepare($query); $stmt->execute($params); return $stmt->fetch(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); # Пишем в лог Log::writelog('sql_error', $error, $message); } } // get rows public function getRows($query, $params = []){ try { $stmt = $this->datab->prepare($query); $stmt->execute($params); return $stmt->fetchAll(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } // insert row public function insertRow($query, $params = []){ try { $stmt = $this->datab->prepare($query); $stmt->execute($params); return TRUE; } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } // update row public function updateRow($query, $params = []){ try { $this->insertRow($query, $params); return TRUE; } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } // delete row public function deleteRow($query, $params = []){ $this->insertRow($query, $params); } ########## public function getColumn($query, $params = []){ try { $stmt = $this->datab->prepare($query); $stmt->execute($params); return $stmt->fetchColumn(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } public function rowCount($query, $params = []){ try { $stmt = $this->datab->prepare($query); $stmt->execute($params); return $stmt->rowCount(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } public function FetchRow($query, $params = []){ try { $stmt = $this->datab->prepare($query); $stmt->execute($params); return $stmt->FetchRow(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } public function getlastInsertId(){ try { return $this->datab->lastInsertId(); } catch (PDOException $e) { $message = $e->getMessage(); $error = $e->getTrace(); Log::writelog('sql_error', $error, $message); } } } PHP: $db->getColumn("SELECT COUNT(*) FROM `users` WHERE `user` = ?" , [$first_name]); PHP: $db->getRow("SELECT `user` FROM `users` WHERE `id` = ?" , [$id]); getRows - для циклов (массив вернет, т.е. не одну запись) Можно вот так, тогда $query можно еще где то использовать, код сокращается. PHP: $query = "INSERT INTO `state` (user_id, user, state) VALUES (?,?,?)"; $db->insertRow($query, [$user_id, $user, $state]); deleteRow понятно PHP: $db->updateRow("UPDATE `users_data` SET `skype` = ? WHERE `id` = ? AND `user_login` = ?", [$skype, $id, $uname]);
этот я уже видел) по типу этого класса у меня уже есть, только у меня на много меньше методов. вот присмотрись внимательно на свои методы и скажи чем они отличаются? мне кажется отличаются только возвращаемым результатом fetch fetchall fetchcolumn rowcount, можно вроде проще сделать, я совет не могу дать, программисты со стажем могут дать совет. вопрос не однозначный, где-то читал что использовать try catch не есть хорошо, не слыхал о таком?
Когда ты такое где-то читаешь, то стремись запомнить, почему, и приводить с этим аргументом. Сейчас try/catch - рекомендованный способ реакции на ошибки.
обожаю удобства) класс вроде не плохой, например у зверя из форума класс mysqli навороченный) у меня для обновления и удаления данных используется один метод, хотя можно его разделить на 2, но зачем делать одинаковые 2 метода, только названия будут разные), только чтобы удобно было и все, вот я например и так в запросе видеть буду UPDATE или DELETE и пойму что обращаясь к методу допустим $db->del_upd() я буду понимать что запрос должен выполнить). Я тебе не советую чтобы ты сократил код, если удобно пожалуйста, мне понравился твой, класс, добавлю я себе еще 2 метода, fetchcolumn и rowCount) спасибо дружище.
Сохранил к себе. Скажите, а почему у Вас в функции updateRow отсутствует prepare, тогда как во всех остальных местах он есть? В чём здесь задумка?