[英]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.