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 进行了类似的检查,因此 # 参数不会由于该检查而不匹配。

我通过引用传递了 $stmt 和 $variable(& 在参数前面)。

知道为什么函数不绑定参数吗?

4

1 回答 1

1

“0”(作为字符串)被评估为空,但 != “”。作为整数,两者的计算结果相同。

解决方案:其中一个参数没有被绑定,因为它是 0(非字符串)并且没有通过检查。正如 Ghost 所指出的,这与它在函数中无关。此外,我应该使用 isset() 而不是 empty()。

这是我的测试:

$test = empty($testbuffer);
console_log($test, "Test result 1a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 1b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 1c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 1d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 1e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 1f: ");
$testbuffer = "";
$test = empty($testbuffer);
console_log($test, "Test result 2a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 2b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 2c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 2d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 2e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 2f: ");
$testbuffer = "0";
$test = empty($testbuffer);
console_log($test, "Test result 3a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 3b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 3c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 3d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 3e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 3f: ");
$testbuffer = "1";
$test = empty($testbuffer);
console_log($test, "Test result 4a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 4b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 4c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 4d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 4e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 4f: ");
$testbuffer = 0;
$test = empty($testbuffer);
console_log($test, "Test result 5a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 5b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 5c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 5d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 5e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 5f: ");
$testbuffer = 1;
$test = empty($testbuffer);
console_log($test, "Test result 6a: ");
$test = ($testbuffer == "");
console_log($test, "Test result 6b: ");
$test = ($testbuffer == 0);
console_log($test, "Test result 6c: ");
$test = ($testbuffer === 0);
console_log($test, "Test result 6d: ");
$test = ($testbuffer == "0");
console_log($test, "Test result 6e: ");
$test = ($testbuffer === "0");
console_log($test, "Test result 6f: ");

输出:

//Test 1: (variable not set)
Test result 1a: 1   //empty()
Test result 1b: 1   //== ""
Test result 1c: 1   //== 0
Test result 1d:     //=== 0
Test result 1e:     //== "0"
Test result 1f:     //=== "0"
//Test 2: ""
Test result 2a: 1
Test result 2b: 1
Test result 2c: 1
Test result 2d: 
Test result 2e: 
Test result 2f: 
//Test 3: "0"
Test result 3a: 1
Test result 3b: 
Test result 3c: 1
Test result 3d: 
Test result 3e: 1
Test result 3f: 1
//Test 4: "1"
Test result 4a: 
Test result 4b: 
Test result 4c: 
Test result 4d: 
Test result 4e: 
Test result 4f: 
//Test 5: 0
Test result 5a: 1
Test result 5b: 1
Test result 5c: 1
Test result 5d: 1
Test result 5e: 1
Test result 5f: 
//Test 6: 1
Test result 6a: 
Test result 6b: 
Test result 6c: 
Test result 6d: 
Test result 6e: 
Test result 6f: 

我将功能更改为以下内容:

function SQLBindParam(&$stmt, &$variable, $paramname, $bStringInput = false, $bSkipCheck = false)
{
    if(!isset($variable))
    {
        return;
    }
    else if(!$bSkipCheck)
    {
        if($variable == "")
        {
            return;
        }
    }

    if($bStringInput == true)
    {
        $stmt->bindValue(':'.$paramname, '%'.$variable.'%', PDO::PARAM_STR);
    }
    else
    {
        $stmt->bindValue(':'.$paramname, $variable, PDO::PARAM_INT);
    }
    return;
}

并在最后一个上编辑了它的调用:

SQLBindParam($stmt, $start_from, "startpgnum", false, true);
于 2019-07-29T01:40:50.860 回答