我正在尝试学习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)
,然后以下代码有效时-感谢Zhorov为我展示路线:
function assignStatToUser($connection, $stat_name, $user_id, $value) {
. . . .
}
答案 0 :(得分:3)
我认为您的问题是事实,onClick
中第3个参数的值作为值传递,但它应该是一个变量。您正在直接传递该值,这是不允许的。我可以使用适用于SQL Server 4.0.3的PHP 7.1.2和PDO PHP驱动程序来重现此错误。
您有两个选择:1)定义一个变量并将该变量传递给bindParam()
或2)将bindParam()
用作第三个参数。您还需要包括异常处理。
工作示例:
bindValue()