В чем проблема кода? Почему данные не добавляются в базу данных?

public function query($sql, $params = []) {
		$stmt = $this->db->prepare($sql);
		if (!empty($params)) {
			foreach ($params as $key => $val) {
				$stmt->bindValue(':'.$key, $val);
			}
		}
		$stmt->execute();
		return $stmt;
	}

$params = [
				'id' => '',
				'name' => $data['name'],
				'sname' => $data['sname'],
				'email' => $data['email'],
				'password' => password_hash($data['password'], PASSWORD_DEFAULT),
				'datetime' => date("Y-m-d H:i:s",time()),
				'confirm' => 0,
				'avatar' => $Avatar,
				'detect' => $detect,
				'wallpaper' => $wallpaper,
				'detectp' => 3,
				'activation' => $activation,
				'country' => $data['country_id'],
				'about' => $data['about'],
				'birthday' => $data['birthday_year'].'-'.$data['birthday_month'].'-'.$data['birthday_day'],
				'sex' => $data['select'],
				'ref' => $ref
];
$this->db->query("INSERT INTO users VALUES (:id, :name, :sname, :email, :password, :datetime, :confirm, :avatar, :detect, :wallpaper, :detectp, :activation, :country, :about, :birthday, :sex, :ref)", $params);
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Для начала query() меняем на это
public function query($sql, $params = []) {
    $stmt = $this->db->prepare($sql);
    $stmt->execute($params);
    return $stmt;
}

это не принципиально для ответа на вопрос, но просто чтобы убрать бессмысленный код, который к тому же ухудшает функциональность.

А для получения ответа на вопрос надо научиться правильно соединяться с PDO.
Для этого там, где создается инстанс класса $this->db, пишем вот такой код, в котором самой главной является строчка
PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,


После этого запускаем свой код, и PHP сам, человеческим голосом, сообщает нам, в чем проблема этого кода.
Таким образом мы сразу убиваем двух зайцев:

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

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

Поэтому никогда не надо уподобляться бабкам-гадалкам, которые пишут "а вы уверены" и "спробуй заячий помет, может поможет", а просто всегда настраивать пхп так, чтобы он сам сообщал, в чем конкретно заключается ошибка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А вы уверены, что пустая строка - допустимый аргумент для id?
Ответ написан
Комментировать
irishmann
@irishmann
Научись пользоваться дебаггером
Попробуйте так:
$params = [
        ':id' => '',
        ':name' => $data['name'],
        ':sname' => $data['sname'],
        ':email' => $data['email'],
        ':password' => password_hash($data['password'], PASSWORD_DEFAULT),
        ':datetime' => date("Y-m-d H:i:s",time()),
        ':confirm' => 0,
        ':avatar' => $Avatar,
        ':detect' => $detect,
        ':wallpaper' => $wallpaper,
        ':detectp' => 3,
        ':activation' => $activation,
        ':country' => $data['country_id'],
        ':about' => $data['about'],
        ':birthday' => $data['birthday_year'].'-'.$data['birthday_month'].'-'.$data['birthday_day'],
        ':sex' => $data['select'],
        ':ref' => $ref
];

Если id AUTO_INCREMENT удалите его из запроса.
Ответ написан
Sanovskiy
@Sanovskiy
Веб-разработчик с 2005 года
'id' => NULL,
Если это PDO, то заработает как надо
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы