繁体   English   中英

PHP Mysql PDO代码效率 - foreach循环中的Foreach循环

[英]PHP Mysql PDO code efficiency - Foreach loop within a foreach loop

大家好! 我是编码的新手,将在明年9月上课。 期待那.... :-)

我正在为我的数据库做一个修改页面。 它由输入和下拉列表组成,用于修改数据库的内容。 至少现在......直到我了解更多。

我正在为自己编码,并想知道以下是否是正确的方法呢? 在我看来它不是,因为内部查询每次外循环通过时都会被执行......但它有效!?!?

这是我能找到使内部FOREACH循环( $ familylist )与Mysql查询一起工作的唯一方法。 如果内部循环的查询在外部循环( $ plantList )之外......它不起作用。 第一个下拉列表将填充内容,但以下行不会,至少只有第一个选项,它不会填充查询中的内容。

欢迎任何帮助和赞赏!

<?php //more code here....

$plantQuery = "SELECT id, genre, espece, famille FROM plante ORDER BY genre";

$plantList = $dbconnect->query ($plantQuery);
?>

<table>
<thead>
  <tr>
    <th>ID</th>
    <th>GENRE</th>
    <th>ESPÈCE</th>
    <th>FAMILLE</th>
  </tr>
</thead>
<tbody>
    <?php foreach ($plantList->fetchAll(PDO::FETCH_ASSOC) as $plant) : ?>
      <form method="post">
        <tr>
          <td><input name="id" value="<?php echo $plant["id"] ;?>" readonly></td>
          <td><input name="genre" value="<?php echo $plant["genre"] ;?>"></td>
          <td><input name="espece" value="<?php echo $plant["espece"] ;?>"></td>
          <td><select name="familleList" >
              <option value="0" >Choisir une famille</option>
              <?php
                $familyQuery = "SELECT id, famille FROM famille ORDER BY id ASC";
                $familyList = $dbconnect->query ($familyQuery);
              ?>
               <?php foreach ($familyList->fetchAll(PDO::FETCH_ASSOC) as $family):?>
              <option value="<?php echo $family["id"] ;?>" <?php if  ($plant["famille"] <> 0 && $plant["famille"] == $family["id"] ) {echo    "selected"; }?>><?php echo $family["id"] . " - " . $family["famille"] ;?></option>
              <?php endforeach ;?>
            </select>    
         </td> 
         <td><button name="modifier" type="submit">Modifier</button></td>
         <td><button name="supprimer" type="submit">Supprimer</button></td>
       </tr>
     </form>
   <?php endforeach ;?>
 </tbody>   
</table>  

你是对的。 你在做什么是非常低效的。 数据库查询往往会产生瓶颈,因此最小化它们通常是最好的做法。

由于您没有将任何值传递给第二个查询,只需将其从循环中取出:

<?php //more code here....

$plantQuery = "SELECT id, genre, espece, famille FROM plante ORDER BY genre";
$plantList = $dbconnect->query ($plantQuery);

$familyQuery = "SELECT id, famille FROM famille ORDER BY id ASC";
$familyList = $dbconnect->query ($familyQuery);
?>

<table>
<thead>
<tr>
    <th>ID</th>
    <th>GENRE</th>
    <th>ESPÈCE</th>
    <th>FAMILLE</th>
</tr>
</thead>
<tbody>
    <?php foreach ($plantList->fetchAll(PDO::FETCH_ASSOC) as $plant) : ?>
    <form method="post">
        <tr>
        <td><input name="id" value="<?php echo $plant["id"] ;?>" readonly></td>
        <td><input name="genre" value="<?php echo $plant["genre"] ;?>"></td>
        <td><input name="espece" value="<?php echo $plant["espece"] ;?>"></td>
        <td><select name="familleList" >
            <option value="0" >Choisir une famille</option>
            <?php

            ?>
            <?php foreach ($familyList as $family):?>
            <option value="<?php echo $family["id"] ;?>" <?php if  ($plant["famille"] <> 0 && $plant["famille"] == $family["id"] ) {echo    "selected"; }?>><?php echo $family["id"] . " - " . $family["famille"] ;?></option>
            <?php endforeach ;?>
            </select>    
        </td> 
        <td><button name="modifier" type="submit">Modifier</button></td>
        <td><button name="supprimer" type="submit">Supprimer</button></td>
    </tr>
    </form>
<?php endforeach ;?>
</tbody>   
</table>

即使这不是这种情况,每当您多次执行相同的查询而只更改变量时,您可以使用预准备语句:

$familyQuery = $dbconnect->prepare("SELECT * FROM famille 
    WHERE something = :s
    AND somethingelse = :se ORDER BY id ASC");
foreach ($values as $val) {
    $familyQuery->bindValue('s', $val);
    $familyQuery->bindValue('se', somefunction($val));
    $familyQuery->execute();
    $results = $familyQuery->fetchAll();
    // Do something with the results
}

这样,查询首先被发送到DB服务器,并且所有值都是单独发送的。

对于loop内的相同数据,不是多次调用数据库。 一个简单的解决方案就是调用一次。 在文件的顶部做这样的事情。

$families = $familyList->fetchAll(PDO::FETCH_ASSOC);

然后你可以把你的foreach循环到。

foreach ($families as $family)

这将使查询执行一次,从而避免对database多次查询。 loop比在已经获取的数据loops

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM