2016-05-06 3 views
1

こんにちは! 私はコーディングが新しく、来年9月にはクラスに参加する予定です。楽しみにしています.... :-)PHP Myqsl PDOコード効率 - foreachループ内のForeachループ

私のデータベースの変更ページを作りました。これは、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> 

答えて

0

loop内の同じデータに対して、データベースを複数回呼び出す代わりに、簡単な解決策は、それを一度呼び出すことです。ファイルの一番上に、このようなことをしてください。

そして、foreachにループする可能性があります。

foreach ($families as $family) 

これは、クエリが1回実行させるだろう、とdatabaseに複数のクエリを避けるそのため。 loopはすでにloopsに取り込まれたデータを上書きします。

+0

明らかに私は基本を覚えていませんでした!コードを外して巻き戻す必要があります。メルティ! –

0

あなたは正しいです。あなたがしていることは非常に非効率的です。データベースクエリは実際にボトルネックとなる傾向があります。そのため、クエリを最小化するのが一般的には最善の方法です。あなたは2番目のクエリに任意の値を渡していないので

、ちょうどループの外にそれを取る:

<?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サーバに送信され、値はすべて個別に送信されます。この道を。