在while循环中运行多个查询时,PHP mysqli查询问题

时间:2015-06-18 12:34:03

标签: php mysqli

我有以下php代码:

if($getPrepareResults = $con->prepare("SELECT machinePurposeID 
                                       FROM machinepurpose 
                                       WHERE machinePurposeName LIKE '%$needle%' 
                                       AND machinePurposePerms=1")) {
    $getPrepareResults->execute();
    $getPrepareResults->store_result();
    if($getPrepareResults->num_rows > 0) {
        $found = true;
        $getPrepareResults->bind_result($machinePurposeID);
        while($getPrepareResults->fetch()) {
            if($getMachineID = $con->prepare("SELECT machineID 
                                             FROM machinedetails 
                                             WHERE machinePurpose=?")) 
              {
                $getMachineID->bind_param("i", $machinePurposeID);
                $getMachineID->execute();
                $getMachineID->bind_result($machineID);
                while($getMachineID->fetch()) {
                    if($getMachine = $con->prepare("SELECT 
                                            machineID,machineIP,
                                            machineName,hostID 
                                           FROM machines 
                                           WHERE machineID=?")) {
                        $getMachine->bind_param("i", $machineID);
                        $getMachine->execute();
                        $getMachine->bind_result($machineID,$machineIP,
                                                 $machineName,$hostID);
                        while($getMachine->fetch()) {

                        };
                    };
                    $getMachine->close();
                };
            };
            $getMachineID->close();
        };
    } else {
        $found = false;
    };
};
$getPrepareResults->close();

出于某种原因,它可以达到getMachineID的点,然后由于某种原因,当我尝试getMachine时会产生错误。我想这是因为我试图一个接一个地运行太多的查询。

获得与当前输出相同的结果的最佳方法是什么,没有错误,但不同?

所有表名和列名都正确。

注意:这是一个内部网络服务器,因此我不必担心SQL注入

编辑:

Error Screenshot,评论中的更多信息:

1 个答案:

答案 0 :(得分:0)

简短回答

您错过了在内部while循环之前添加$getMachineID->store_result();

背景

如果您进行查询(使用常规查询或通过预准备语句),则会返回一个语句,该语句会阻止数据库连接,直到获取所有结果,或者存储整个结果集,或者语句已关闭。 / p>

因此,如果要进行嵌套查询,则必须获取所有结果,将其保存在数组或其他内容中并关闭语句,或使用store_result()

如果要使用语句的store_result()属性,则必须调用affected_rows。但是如果你要拿,例如,你也必须打电话给它。来自LONGTEXT字段的数据,因为它最多可包含4 GB的文本。如果你只是调用fetch(),它会在分配错误中产生(不改变PHP设置),因为PHP会尝试分配4 GB的内存以确保它可以获取整个字符串。

改进?

也许你可以使用JOIN摆脱内在的while循环。像

这样的东西
SELECT
  machineID, machineIP, machineName, hostID 
FROM
  machines
  JOIN machinedetails USING(machineID)
WHERE
  machinePurpose = ?

这会减少查询次数,并且应该提高性能并解决问题。