こんにちは、上村です。

 

新人さんから「PHPで以下のSQL文を実行したところ、『Warning: db2_bind_param() [function.db2-bind-param]: Describe Param Failed in …』というエラーが出てしまいます。」という相談を受けました。

 

パラメータの記述が間違っているようなので、エラーが表示されている行を確認すると、あいまい検索を実装するためにLIKE句にワイルドカード(%:パーセント)が記述してありました。

 

ワイルドカードの記述位置を修正したところ、エラーメッセージが表示されなくなりました。

そもそも、変更前のソースコードでは、実装したいあいまい検索とは異なる抽出条件になっていますね(・・;

 

例)ABCを含む文字列ではなく、’ABC’を含む文字列を抽出してしまう

'%?%'
↓
↓'ABC'という文字列が入った変数をバインドすると…
↓
'%'ABC'%'

 

元のソースコード

/* ----- DBの接続 ----- */
$conn = db2_connect($database, $user, $password);

$sql  = 'SELECT *';
$sql .= '  FROM ライブラリ.ファイル';
$sql .= '  WHERE カラム1 LIKE \'%?%\'';
$sql .= '  ORDER BY カラム1';

/* ----- SQL文の準備 ----- */
$stmt = db2_prepare($conn, $sql);

/* ----- SQL文にパラメータをセット ----- */
$code = 'WD';
db2_bind_param($stmt, 1, 'code', DB2_PARAM_IN);

/* ----- SQL文を実行 ----- */
db2_execute($stmt);

/* ----- 結果を表示 ----- */
while($row = db2_fetch_assoc($stmt)) {
  echo $row['カラム1'] . ' ' . $row['カラム2'] . ' ' . $row['カラム3'];
  echo '改行タグ';
}

/* ----- DBの切断 ----- */
db2_close($conn);

変更後のソースコード

/* ----- DBの接続 ----- */
$conn = db2_connect($database, $user, $password);

$sql  = 'SELECT *';
$sql .= '  FROM ライブラリ.ファイル';
$sql .= '  WHERE カラム1 LIKE ?';
$sql .= '  ORDER BY カラム1';

/* ----- SQL文の準備 ----- */
$stmt = db2_prepare($conn, $sql);

/* ----- SQL文にパラメータをセット ----- */
$code = '%' . 'WD' . '%';
db2_bind_param($stmt, 1, 'code', DB2_PARAM_IN);

/* ----- SQL文を実行 ----- */
db2_execute($stmt);

/* ----- 結果を表示 ----- */
while($row = db2_fetch_assoc($stmt)) {
  echo $row['カラム1'] . ' ' . $row['カラム2'] . ' ' . $row['カラム3'];
  echo '改行タグ';
}

/* ----- DBの切断 ----- */
db2_close($conn);