我有几个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子句将找不到它。