コードが何度も複製されたときに関数を作成することがよくあります。この例では、SQL クエリを作成し、後でパラメーターをバインドしています。関数内でバインドしようとしない場合、クエリは機能しますが、コードは関数で非常にきれいに見えます。
関数のないコードは次のとおりです(機能しています):
if(!empty($param_steamid) && ($param_steamid != ""))
{
$stmt->bindValue(":param_steamid", '%'.$param_steamid.'%', PDO::PARAM_STR);
}
if(!empty($param_name) && ($param_name != ""))
{
$stmt->bindValue(":param_name", '%'.$param_name.'%', PDO::PARAM_STR);
}
if(!empty($param_lastclientip) && ($param_lastclientip != ""))
{
$stmt->bindValue(":param_lastclientip", '%'.$param_lastclientip.'%', PDO::PARAM_STR);
}
if(!empty($param_match) && ($param_match != ""))
{
$stmt->bindValue(":param_match", $param_match, PDO::PARAM_INT);
}
$stmt->bindValue(":startpgnum", $start_from, PDO::PARAM_INT);
関数と関数を使用したコードは次のとおりです。
SQLBindParam($stmt, $param_steamid, "param_steamid", true);
SQLBindParam($stmt, $param_name, "param_name", true);
SQLBindParam($stmt, $param_lastclientip, "param_lastclientip", true);
SQLBindParam($stmt, $param_match, "param_match");
SQLBindParam($stmt, $start_from, "startpgnum");
function SQLBindParam(&$stmt, &$variable, $paramname, $bStringInput = false)
{
if(empty($variable) || ($variable == ""))
{
return;
}
if($bStringInput == true)
{
$stmt->bindValue(':'.$paramname, '%'.$variable.'%', PDO::PARAM_STR);
}
else
{
$stmt->bindValue(':'.$paramname, $variable, PDO::PARAM_INT);
}
return;
}
関数を使用すると、次のエラーが発生します。
エラー: SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターがバインドされていません
注: where ステートメントには、変数が空/nullstring であるかどうかについて同様のチェックがあるため、そのチェックによって # params が一致しなくなります。
$stmt と $variable を参照渡し (& パラメーターの前) に渡しました。
関数がパラメーターをバインドしていない理由は何ですか?