mysqli查询不返回函数内部的结果


mysqli queries not returning results inside function

我有几个php函数,它们有不同的用途。它们中的每一个都在执行一个指定的mysqli查询,但只有第一个查询返回结果。

这是我的代码

function setAsNonWorkingProxy(){
    GLOBAL $mysqli, $proxy;
    $port = explode(":",$proxy)[1];
    $proxy = explode(":",$proxy)[0];
    if ($sql2 = $mysqli->prepare("UPDATE proxies SET failed=failed+1 WHERE ip=? AND port=?")) {
        $sql2->bind_param("si",$proxy, $port);
        $sql2->execute();
        $sql2->close();
    }
}
function markProxyAsUsed(){
    GLOBAL $mysqli, $proxy;
    $port = explode(":",$proxy)[1];
    $proxy = explode(":",$proxy)[0];
    if ($sql3 = $mysqli->prepare("UPDATE proxies SET tried=tried+1 WHERE ip=? AND port=?")) {
        $sql3->bind_param("si",$proxy, $port);
        $sql3->execute();
        $sql3->close();
    }
}
setAsNonWorkingProxy();
markProxyAsUsed();

当我这样做时,只有第一个被调用的函数在内部执行查询。调用第二个函数,执行查询时没有任何错误,但什么也没发生。我在这两个函数中都使用UDPDATE查询。

如果我更改功能的顺序:

markProxyAsUsed();
setAsNonWorkingProxy();

同样,只有第一个有效。为什么会发生这种情况?

问题是在函数中引入了全局作用域变量。然后在$proxy上使用爆炸,结果被存储回$proxy(记住这是同一个全局变量)。结果是,调用的第二个函数现在正在使用修改后的$proxy变量。即使你调用同一个函数两次也没关系,第二次就会失败。

function markProxyAsUsed(){
    GLOBAL $mysqli, $proxy; //You are bringing global scope vars in here

    // If $proxy is something like '222.222.222.222:8080' on your first call
    // On the second call will be only '222.222.222.222' and your logic will be broken
    $port = explode(":",$proxy)[1];
    $proxy = explode(":",$proxy)[0]; //Here is where you are messing it
    //Quickfix
    $ip = explode(":", $proxy)[0]; // then use $ip in your query
    //Proper fix would be to declare the function as so function markProxyAsUsed($proxy) 
    //and pass it when you call the function.

发生这种情况是因为您在函数中编辑了代理变量。运行的第一个函数将代理变量从xxxx:yy更改为xxxx-

第二次执行函数时,$port变量将为空,sql语句中的where子句将找不到它。