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: да учусь, да туплю )))
Для особо "важных" учителей - самоутверждайтесь пожалуйста в другом месте, а я просто попросил совета ;)
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
@FanatPHP
Чебуратор тега PHP
Хороший вопрос.
И класс в целом очень неплох, сильно лучше тех, что обычно пишут "когда учатся".

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы