我有以下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,评论中的更多信息:
答案 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 = ?
这会减少查询次数,并且应该提高性能并解决问题。