我有几个用于不同目的的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();
同样,只有第一个有效。为什么会这样?
答案 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.