PHP PDO подготовленный оператор не выполняется - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь выучить 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) {

    . . . .

}

1 Ответ

3 голосов
/ 25 марта 2019

Я думаю, что ваша проблема в том, что значение вашего третьего параметра в bindParam() передается как значение, но оно должно быть переменной.Вы непосредственно передаете значение, которое не допускается.Я могу воспроизвести эту ошибку с помощью PHP 7.1.2 и PDO PHP Driver для SQL Server 4.0.3.

У вас есть два варианта: 1) Определить переменную и передать ее в bindParam() или 2) Используйте bindValue() для вашего третьего параметра.Вам также необходимо включить обработку исключений.

Рабочий пример:

<?php
# Connection info
$hostname = 'server\instance,port';
$dbname   = 'dbname';
$username = 'username';
$password = 'password';

# Connection
try {
    $dbh = new PDO("sqlsrv:server=$hostname;Database=$dbname", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server. ".$e->getMessage());
}

# Statement
try {
    $user_id = 123;
    $stat_id = 321;
    $val     = '000';
    $stmt = $dbh->prepare('insert into user_stats (user_id, stat_id, value) values (:user, :stat, :val)');
    $stmt->bindParam(':user', $user_id);
    $stmt->bindParam(':stat', $stat_id);
    $stmt->bindParam(':val', $val);         // OK, using bindParam() and a variaable
    //$stmt->bindValue(':val', '111');      // OK, using bindValue()
    //$stmt->bindParam(':val', '0');        // Error
    $stmt->execute();
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage() );
}
$stmt = null;

# End
$dbh = null;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...