簡體   English   中英

PHP PDO准備好的語句沒有執行

[英]PHP PDO prepared statement is not executing

我正在努力學習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作為字符串或整數傳遞..不確定我哪里出錯了。

我的問題是嘗試使用bindParam(':val', '0')將值直接插入value列 - 當我將此行更改為: bindParam(':val', $value)然后以下內容時,它工作正常 - 感謝Zhorov給我的方式:

function assignStatToUser($connection, $stat_name, $user_id, $value) {

    . . . .

}

我認為你的問題是, bindParam()第3個參數的值作為值傳遞,但它應該是一個變量。 您是直接傳遞值,這是不允許的。 我能夠使用PHP 7.1.2和SQL Server 4.0.3的PDO PHP驅動程序重現此錯誤。

您有兩個選擇:1)定義變量並將該變量傳遞給bindParam()或2 bindValue()對第3個參數使用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;
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM