dimastik1986
@dimastik1986
учусь

Как с помощью класса для PDO получить результат update?

Прошу помощи, поясните пожалуйста, возможно ли с помощью данного класса получить результат запроса update?
Класс обертка для работы с PDO

class DB {
	/**
	 * @var PDO
	 */
	static private $db;

	/**
	 * @var null
	 */
	protected static $instance = null;

	/**
	 * DB constructor.
	 * @throws Exception
	 */
	public function __construct() {
		if (self::$instance === null) {
			try {
				self::$db = new PDO(
						  'mysql:host=' . self::DB_HOST . ';dbname=' . self::DB_NAME,
						  self::DB_USER,
						  self::DB_PASSWORD,
						  $options = [
					 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
					 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
					 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . self::CHARSET
						  ]
				);
			} catch (PDOException $e) {
				throw new Exception($e->getMessage());
			}
		}
		return self::$instance;
	}

	/**
	 * @param $stmt
	 * @return PDOStatement
	 */
	public static function query($stmt) {
		return self::$db->query($stmt);
	}

	/**
	 * @param $stmt
	 * @return PDOStatement
	 */
	public static function prepare($stmt) {
		return self::$db->prepare($stmt);
	}

	/**
	 * @param $query
	 * @return int
	 */
	static public function exec($query) {
		return self::$db->exec($query);
	}

	/**
	 * @return string
	 */
	static public function lastInsertId() {
		return self::$db->lastInsertId();
	}

	/**
	 * @param $query
	 * @param array $args
	 * @return PDOStatement
	 * @throws Exception
	 */
	public static function run($query, $args = []) {
		try {
			if (!$args) {
				return self::query($query);
			}
			$stmt = self::prepare($query);
			$stmt->execute($args);
			return $stmt;
		} catch (PDOException $e) {
			throw new Exception($e->getMessage());
		}
	}

	/**
	 * @param $query
	 * @param array $args
	 * @return mixed
	 */
	public static function getRow($query, $args = []) {
		return self::run($query, $args)->fetch();
	}

	/**
	 * @param $query
	 * @param array $args
	 * @return array
	 */
	public static function getRows($query, $args = []) {
		return self::run($query, $args)->fetchAll();
	}

	/**
	 * @param $query
	 * @param array $args
	 * @return mixed
	 */
	public static function getValue($query, $args = []) {
		$result = self::getRow($query, $args);
		if (!empty($result)) {
			$result = array_shift($result);
		}
		return $result;
	}

	/**
	 * @param $query
	 * @param array $args
	 * @return array
	 */
	public static function getColumn($query, $args = []) {
		return self::run($query, $args)->fetchAll(PDO::FETCH_COLUMN);
	}

	public static function sql($query, $args = []) {
		self::run($query, $args);
	}

}



Как я пытаюсь это сделать:
$DB = new DB();
$result = $DB::sql("UPDATE `".$tbl."` SET ".$keys." WHERE `id`=:id", $clean);


Запрос выполняется, данные перезаписываются, но $result возвращается пустым...
Что я делаю не правильно? Мне кажется в моем классе чет-чет не хватает!?)

ps: да учусь, да туплю )))
Для особо "важных" учителей - самоутверждайтесь пожалуйста в другом месте, а я просто попросил совета ;)
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Хороший вопрос.
И класс в целом очень неплох, сильно лучше тех, что обычно пишут "когда учатся".

А ответ на вопрос простой но неожиданный - никак.
Результат запроса update тебе не нужен.

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

Если же говорить о количестве строк, которые затронул запрос, то, поскольку у тебя абстракция не течет, то вместо метода sql(), который тупо дублирует run(), я бы сдела метод dml()

public static function dml($query, $args = []) {
    $stmt = self::run($query, $args);
    return $stmt->rowCount();
  }

и применял ее только для запросов, модифицирующих данные (DML).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Jiffa
в методе DB::sql нет return поэтому он ничего не возвращает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 19:18
50000 руб./за проект
24 апр. 2024, в 19:05
15000 руб./за проект
24 апр. 2024, в 18:39
80000 руб./за проект