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

时间:2016-05-06 23:05:21

标签: php mysql loops pdo foreach

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

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

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

这是我能找到使内部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>  

2 个答案:

答案 0 :(得分:0)

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

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

<?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
}

这种方式首先将查询发送到数据库服务器,并且所有值都是单独发送的。

答案 1 :(得分:0)

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

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

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

foreach ($families as $family)

这将使查询执行一次,从而避免对database进行多次查询。并且loop覆盖loops

中已经提取的数据