1

コードが何度も複製されたときに関数を作成することがよくあります。この例では、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 を参照渡し (& パラメーターの前) に渡しました。

関数がパラメーターをバインドしていない理由は何ですか?

4

1 に答える 1