PHP PDO准备好的语句未执行

时间:2019-03-25 01:01:54

标签: php sql pdo

我正在尝试学习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) {

    . . . .

}

1 个答案:

答案 0 :(得分:3)

我认为您的问题是事实,onClick中第3个参数的值作为值传递,但它应该是一个变量。您正在直接传递该值,这是不允许的。我可以使用适用于SQL Server 4.0.3的PHP 7.1.2和PDO PHP驱动程序来重现此错误。

您有两个选择:1)定义一个变量并将该变量传递给bindParam()或2)将bindParam()用作第三个参数。您还需要包括异常处理。

工作示例:

bindValue()