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

时间:2014-09-03 12:31:05

标签: php function mysqli

我有几个用于不同目的的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();

同样,只有第一个有效。为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是因为您在函数内编辑代理变量。您运行的第一个函数将代理变量从xxxx:yy更改为xxxx

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

答案 1 :(得分:1)

问题是您要在函数中引入全局范围变量。然后在$ proxy上使用explode并将结果存储回$ 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.