Я пытаюсь выучить PDO, иди ко мне. Я пробовал искать и не нашел ничего, что могло бы помочь - я, вероятно, искал не ту вещь - и часами ломал голову над этим.
У меня есть подготовленное заявление PDO, которое, кажется, не выполняется.
У меня есть 3 соответствующие таблицы базы данных:
create table users (
id int not null auto_increment primary key,
username varchar(60),
password varchar(60)
);
create table stats (
id int not null auto_increment primary key,
display_name text,
short_name varchar(10)
);
insert into stats (display_name, short_name) values ('Magic', 'mag');
insert into stats (display_name, short_name) values ('Attack', 'atk');
insert into stats (display_name, short_name) values ('Defence', 'def');
create table user_stats (
id int not null auto_increment primary key,
user_id int,
stat_id int,
value text /* some none numerical "stats" */
);
Я добавил несколько пользователей во время тестирования системы регистрации / входа, две другие таблицы такие же, как указано выше.
Вот функция назначения статистики пользователю:
function assignStatToUser($connection, $stat_name, $user_id) {
$query = $connection->prepare('select id from stats where display_name = :name or short_name = :short');
$query->bindParam(':name', $stat_name);
$query->bindParam(':short', $stat_name);
$query->execute();
$stat_id = $query->fetchColumn(); // id - $stat_name
echo $stat_id; // testing
// var_dump($stat_id);
// the above works fine
try {
$insert = $connection->prepare('insert into user_stats (user_id, stat_id, value) values (:user, :stat, :val)');
$insert->bindParam(':user', $user_id);
$insert->bindParam(':stat', /* (int) */ $stat_id);
$insert->bindParam(':val', '0');
$insert->execute();
} catch (PDOException $e) {
die($e->getMessage());
}
}
assignStatToUser($connection, 'def', '10');
Это второй запрос, который не выполняется, запрос insert into
. Я не могу понять, что я делаю неправильно. Я написал и переписал это, с try...catch
и без него, с обратными галочками вокруг имен столбцов, передавая $user_id
в виде строки или целого числа ... не знаю, где я ошибаюсь.
Решение
Моя проблема заключалась в попытке вставить значение непосредственно в столбец value
, используя bindParam(':val', '0')
- когда я изменил эту строку на: bindParam(':val', $value)
, а затем следующее, это сработало - спасибо Жорову за указание пути:
function assignStatToUser($connection, $stat_name, $user_id, $value) {
. . . .
}