@Eternal97

Не работают запросы INSERT и UPDATE, что я сделал не так?

Есть форма по отправке данных в таблицу бд.
Суть проблемы такая. При передаче данных или редактировании старых данных ничего не происходит. Таблица попросту не обновляется. НО при добавлении вручную записей, они отображаются с помощью fetchAll.
Это логика добавления записи.
public function postAdd($post) {
		$params = [
			':name' => $post['name'],
			':description' => $post['description'],
			':text' => $post['text'],
		];
		$this->db->query('INSERT INTO `posts` (`name`, `description`, `text`) VALUES (:name, :description, :text)', $params);
		return $this->db->lastInsertId();
	}

Это логика обновления старой записи.
public function postEdit($post, $id) {
		$params = [
			':id' => $id,
			':name' => $post['name'],
			':description' => $post['description'],
			':text' => $post['text'],
		];
		$this->db->query('UPDATE `posts` SET name = :name, description = :description, text = :text WHERE id = :id', $params);
	}

Все данные из запроса идут сюда.
public function query($sql, $params = []) {
		$stmt = $this->db->prepare($sql);
		if (!empty($params)) {
			foreach ($params as $key => $val) {
				$stmt->bindValue(':'.$key, $val, (is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR));
			}
		}
		$stmt->execute();
		return $stmt;
	}

Этот код работает.
public function row($sql, $params = []) {
		$result = $this->query($sql, $params);
		return $result->fetchAll(PDO::FETCH_ASSOC);
	}

Все константы проброшены через USE.
Кодировка таблицы utf8.
Для отправки формы использую AJAX.
$(document).ready(function() {
	$('form').submit(function(event) {
		var json;
		event.preventDefault();
		$.ajax({
			type: $(this).attr('method'),
			url: $(this).attr('action'),
			data: new FormData(this),
			contentType: false,
			cache: false,
			processData: false,
			success: function(result) {
				json = jQuery.parseJSON(result);
				if (json.url) {
					window.location.href = '/' + json.url;
				} else {
					alert(json.status + ' - ' + json.message);
				}
			},
		});
	});
});

И есть один парадокс. Если в функцию query в execute напрямую передать параметры, то форма работает как надо, записи и добавляются и обновляются, но перестает работать отображение данных на самом сайте.
Подскажите пожалуйста, что я делаю не так и где может быть моя ошибка.
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
public function postEdit($post, $id) {
    $params = [
      'id' => $id,
      'name' => $post['name'],
      'description' => $post['description'],
      'text' => $post['text'],
    ];
    $this->db->query('UPDATE `posts` SET name = :name, description = :description, text = :text WHERE id = :id', $params);
  }

Судя по всему, ":" в вашем случае в ключах не нужны
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Подскажите пожалуйста, что я делаю не так
Не занимаетесь отладкой, а занимаетесь гаданиями.

и где может быть моя ошибка.
В произвольном месте. По этому проверяют по порядку
1) Что передается в data в яваскрипте (console.log)
2) Что передается в на сервер (смотрим нетворк браузера)
3) Что получили на стороне сервера (var_dump и тот же нетворк, смотрим ответ аякса)
4) Проверяем запрос, и с таким заданием плейсхолдеров бинд не нужен:
$stm = $this->db->prepare($sql);
$stmt->execute($params);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽