【问题标题】:mysqli queries not returning results inside functionmysqli 查询未在函数内返回结果
【发布时间】:2014-09-03 12:31:05
【问题描述】:

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

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

【问题讨论】:

  • 只有函数定义没有声明怎么可能回答呢?
  • 不知道你在函数中做了什么,我们无法回答这个问题。
  • 我添加了这两个函数 ;)
  • 不要使用global 关键字。将这些变量作为函数的参数传递。
  • @JohnConde,我试试,还没试过。

标签: php function mysqli


【解决方案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.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2013-06-21
      相关资源
      最近更新 更多