gpt4 book ai didi

php - 准备好的语句迭代记录集

转载 作者:行者123 更新时间:2023-11-29 07:24:34 25 4
gpt4 key购买 nike

我有两个表:ContractCluster(以 ContractClusterID 作为主键)和 Contract(以 ContractID > 作为主键,ContractClusterID 作为外键)。我正在尝试迭代 ContractClusterID 返回的记录集,并返回表中具有相应 ContractClusterID 外键的所有 ContractID 。由于某种原因我无法让它工作。我只收到第一行的数据。任何帮助将不胜感激。

$PoolID = $_POST['PoolID'];
$query = "SELECT ContractCluster.ContractClusterID,ContractCluster.PoolID FROM ContractCluster WHERE ContractCluster.PoolID=?";
$stmt = $db->prepare($query);
$stmt->bind_param('s', $PoolID);
$stmt->execute();
$stmt->store_result();
$numrows = $stmt->num_rows;
$stmt->bind_result($ContractClusterID, $PoolID);

for ($i = 0; $i < $numrows; $i++) {
$stmt->fetch();

echo "<p>Rows Returned (ClusterID):$numrows</p>";
echo "Contract Cluster ID: $ContractClusterID, Pool ID: $PoolID</br></br>";

$ContractClusterID = $ContractClusterID;
$query = "SELECT Contract.ContractID FROM Contract WHERE Contract.ContractClusterID=? ";
$stmt = $db->prepare($query);
$stmt->bind_param('s', $ContractClusterID);
$stmt->execute();
$stmt->store_result();
$numrows = $stmt->num_rows;
$stmt->bind_result($ContractID);
echo "<p>Rows Returned (ContractID): '.$numrows.'</p>";
for ($i = 0; $i < $numrows; $i++) {
$stmt->fetch();
echo "Contract ID: $ContractID </br>";
};
};

最佳答案

你的问题是你正在重用像$i这样的变量,这会弄乱你的循环。

此外,在循环外准备查询并在循环内执行也是一个好主意。这可以避免大量开销,并且是准备好的语句的主要优点之一。

如果您想让自己的生活更轻松,我强烈建议您使用 PDO,并避免使用 bind_param()bind_result() 带来的困惑。它还允许您立即将整个结果集转储到数组中,而不是弄乱 fetch()for 循环。这尚未经过测试,但应该可以让您开始。

$PoolID = $_POST['PoolID'];

$query1 = "SELECT ContractCluster.ContractClusterID,ContractCluster.PoolID FROM ContractCluster WHERE ContractCluster.PoolID=?";
$query2 = "SELECT Contract.ContractID FROM Contract WHERE Contract.ContractClusterID=?";
$stmt1 = $db->prepare($query1);
$stmt2 = $db->prepare($query2);

$stmt1->execute(array($PoolID));
$rows1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
$numrows1 = count($rows1);
foreach ($rows1 as $row1) {
echo "<p>Rows Returned (ClusterID):$numrows1</p>";
echo "Contract Cluster ID: $row1[ContractClusterID], Pool ID: $row1[PoolID]</br></br>";
$stmt2->execute(array($row1["ContractClusterID"]));
$rows2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$numrows2 = count($rows2);
echo "<p>Rows Returned (ContractID): $numrows2</p>";
foreach ($rows2 as $row2) {
echo "Contract ID: $row2[ContractID] </br>";
}
}

如果您坚持使用MySQLi,只需更改您的内部循环中的变量$i$numrows$stmt即可现有代码,它应该可以工作。但你的代码仍然效率低得可怕;至少将语句准备移出循环。

尽管如此,还值得一问的是这是否不能通过连接来完成:

SELECT cc.ContractClusterID, cc.PoolID, c.ContractID
FROM ContractCluster cc
LEFT JOIN Contract c
USING (ContractClusterID)
WHERE cc.PoolID = ?

关于php - 准备好的语句迭代记录集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34956288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com